手把手教你用readelf和objdump通关CSAPP LinkBomb实验(附WinHex修改技巧)

张开发
2026/4/8 14:49:48 15 分钟阅读

分享文章

手把手教你用readelf和objdump通关CSAPP LinkBomb实验(附WinHex修改技巧)
逆向工程实战用readelf与objdump破解CSAPP LinkBomb实验在计算机系统课程的学习中LinkBomb实验是一个极具挑战性的实践环节它要求学生深入理解ELF文件结构、符号解析和重定位机制。本文将带你使用readelf和objdump这两大工具像侦探一样逐步分析目标文件最终成功拆除这个链接炸弹。1. 实验环境与工具准备在进行LinkBomb实验前我们需要准备好必要的工具链和开发环境。实验主要涉及三类核心工具ELF分析工具readelf用于查看ELF文件头、节头表、符号表等结构信息objdump用于反汇编目标文件查看机器指令对应的汇编代码十六进制编辑器WinHexWindows平台推荐HxD教学常用工具编译与测试环境GCC编译器套件Linux虚拟机或WSL环境安装基础工具Ubuntu/Debian示例sudo apt update sudo apt install binutils gcc hexedit工具功能对比表工具名称主要功能关键参数适用场景readelf解析ELF结构-h(文件头)-S(节头表)-s(符号表)-r(重定位表)分析文件布局查找符号地址查看重定位信息objdump反汇编代码-d(反汇编)-r(显示重定位)-t(符号表)分析函数逻辑查看机器指令定位关键代码段WinHex二进制编辑无直接修改.o文件查看十六进制数据提示实验过程中建议保持两个终端窗口同时打开一个用于工具操作另一个用于快速测试修改后的文件。2. ELF文件结构与关键节分析理解ELF文件的结构是解决LinkBomb实验的基础。可重定位目标文件.o文件包含多个节(section)每个节存储不同类型的信息典型ELF节及其作用.text存放已编译程序的机器代码.data已初始化的全局和静态变量.bss未初始化的全局和静态变量.rodata只读数据如字符串常量.symtab符号表存放函数和全局变量信息.rel.text.text节的重定位信息.rel.data.data节的重定位信息.strtab字符串表存储符号名称等字符串使用readelf查看节头表示例readelf -S phase1.o关键节的计算方法节在文件中的偏移量sh_offset节的大小sh_size节的虚拟地址sh_addr - 对于.o文件通常为0节的类型sh_type和标志sh_flags重定位类型解析类型名称计算公式说明R_386_32绝对地址重定位S AS符号地址A被修正处的原值R_386_PC32PC相对重定位S A - PP被修正处的地址3. 实战阶段一数据节修改技巧第一阶段通常要求学生修改.data节中的数据使其链接后输出指定学号。以下是详细操作步骤步骤1反汇编目标文件objdump -dr phase1.o asm-phase1.txt步骤2分析关键汇编代码查看生成的asm-phase1.txt文件重点关注do_phase函数查找puts函数调用回溯参数传递路径通常通过eax寄存器定位数据加载指令如mov $0x30,%eax步骤3计算数据节偏移使用readelf查找.data节的sh_offsetreadelf -S phase1.o | grep .data加上汇编中出现的偏移量如0x30得到最终文件偏移地址步骤4使用WinHex修改文件打开phase1.o文件跳转到计算出的偏移地址修改为学号的ASCII码注意字符串终止符0x00保存修改关键验证步骤gcc -no-pie -o linkbomb main.o phase1.o ./linkbomb注意修改前建议备份原始文件每次只修改一个字节并测试效果避免大面积改动导致文件损坏。4. 实战阶段二代码节注入技术第二阶段通常需要向代码节(.text)中注入自定义汇编指令。这需要更精确的计算和操作步骤1分析现有代码结构使用objdump查看函数布局objdump -d phase2.o确定do_phase函数的起始偏移识别可覆盖的nop指令区域步骤2编写汇编指令序列常见需求包括准备字符串参数学号和验证令牌设置函数调用参数维护正确的栈帧结构示例汇编片段push $0x30313233 ; 学号第一部分 push $0x34353637 ; 学号第二部分 mov %esp, %edx ; 学号地址存入edx push $0x41424344 ; 验证令牌 mov %esp, %ecx ; 令牌地址存入ecx push %edx ; 第二个参数 push %ecx ; 第一个参数 call target_func ; 调用关键函数步骤3机器码转换与注入使用gcc将汇编代码编译为.o文件gcc -c inject.s -o inject.o用objdump提取机器码objdump -d inject.o在WinHex中将机器码写入phase2.o的指定位置步骤4重定位地址修正对于call指令需要计算正确的相对偏移量目标地址 被调用函数的虚拟地址下条指令地址 call指令地址 5偏移量 目标地址 - 下条指令地址使用readelf查看符号地址readelf -s phase2.o | grep target_func5. 高级技巧与错误排查在实验过程中可能会遇到各种问题以下是一些实用技巧常见问题排查表问题现象可能原因解决方案段错误(segfault)栈帧不平衡返回地址被破坏检查push/pop数量确保leave/ret正确输出乱码字符串无终止符编码错误添加0x00终止符检查ASCII值链接失败符号未定义节损坏检查objdump输出恢复原始文件重试WinHex高级功能区块编辑适合大面积相同内容的修改模板功能保存常用查看模式校验和计算验证文件完整性readelf进阶用法 查看重定位条目详细信息readelf -r phase3.o解析特定节的内容readelf -x .rodata phase2.oobjdump组合技巧 反汇编特定函数objdump -d phase3.o | grep -A20 do_phase查看重定位与代码的对应关系objdump -dr phase4.o逆向工程不仅是技术活更是一种艺术。通过本实验你不仅掌握了readelf和objdump的强大功能更重要的是培养了系统性分析二进制文件的能力。这种能力在软件安全分析、性能优化等领域都有广泛应用。记住每个二进制文件背后都有一个故事而你现在已经学会了如何阅读这些故事。

更多文章