在CentOS中,反汇编主要依赖以下工具,每个工具都有其擅长的场景:
objdump是Linux下最常用的反汇编工具之一,适合查看二进制文件的静态反汇编代码。常用命令:
objdump -d your_binary(显示所有可执行段的汇编代码);objdump -d --start-address=0x401000 --stop-address=0x401100 your_binary(反汇编指定地址范围的代码,需提前通过readelf -s或objdump -t获取函数地址);objdump -S your_binary(需编译时添加-g调试信息,方便定位源码逻辑);objdump -t your_binary(查看函数、变量等符号的地址和类型);objdump -r your_binary(分析动态链接的重定位表,适用于动态库分析)。GDB是强大的调试工具,可在程序运行时动态反汇编代码,适合调试复杂问题。常用命令:
gdb your_binary;break main(在main函数入口设置断点)或break *0x401000(在指定地址设置断点);run(启动程序,触发断点);disassemble(显示当前执行函数的汇编代码);disassemble 0x401000, 0x401100(反汇编指定地址范围的代码);disassemble -S(需编译时添加-g,同步显示源码与汇编指令);info registers(显示所有寄存器的当前值);x/10xw $sp(以16进制显示栈顶10个字(4字节)的内容,$sp为栈指针寄存器)。radare2是开源的逆向工程工具,支持自动化分析与复杂控制流解析,适合高级用户。常用命令:
sudo yum install radare2;r2 -AA your_binary(-AA表示自动分析二进制文件,包括函数、控制流等);pdf(显示当前函数的汇编代码);pd 0x20(从当前地址开始反汇编32条指令);s sym.main(跳转到main函数的起始地址,sym.表示符号表前缀);aaa(自动分析函数的控制流图,帮助理解程序逻辑);db main(在main函数设置断点);dc(继续执行程序直到断点);ds(单步执行,进入函数内部)。静态分析(objdump、radare2)可快速查看程序的整体结构,动态分析(GDB)可观察程序运行时的行为(如寄存器变化、内存访问)。例如,先用objdump -d获取程序的整体反汇编代码,再用GDB在关键函数(如main、vulnerable_function)设置断点,单步执行查看实时寄存器与内存状态,两者结合能更全面地理解程序逻辑。
编译时添加-g选项可保留符号信息,通过objdump -t或readelf -s查看符号表,快速找到关键函数(如main、login、encrypt)的地址,再用objdump或GDB反汇编该函数。例如:
objdump -t your_binary | grep " main" # 查找main函数的地址 objdump -d your_binary --start-address=0x401000 --stop-address=0x401100 # 反汇编main函数 使用objdump -d反汇编后,通过grep搜索关键字符串(如"password"、“flag”)或指令(如call、jmp),快速定位感兴趣的代码段。例如:
objdump -d your_binary | grep -i "password" # 查找包含"password"的汇编代码 objdump -d your_binary | grep -i "call.*printf" # 查找所有调用printf的指令 rdi、rsi、rdx、rcx、r8、r9传递,返回值通过rax返回),了解此约定可正确解析函数参数与返回值;objdump -d查看跳转指令(jmp、je、jne),或用radare2的aaa命令生成控制流图(CFG),帮助理解程序的执行流程(如循环、条件分支)。在反汇编代码中添加注释,解释关键指令的作用(如mov eax, 1表示系统调用exit),或用radare2的标记功能(f命令)标记重要地址(如函数入口、漏洞点),方便后续分析。例如,在radare2中:
f main_entry @ sym.main # 标记sym.main地址为"main_entry" 编译器优化(如常量折叠、内联函数、循环展开)会使反汇编代码难以理解。可通过以下方式应对:
-O0选项(默认),保留更多原始代码结构;mov eax, 5后紧跟add eax, 3可能是常量折叠(实际值为8),jmp指令后紧跟函数体可能是内联函数;objdump -S对比源码与汇编,理解优化后的逻辑。sudo提升权限(如sudo objdump -d /bin/ls);binutils包含objdump、readelf;gdb用于调试;radare2用于高级分析),可通过sudo yum install binutils gdb radare2安装;