objdump是Linux下最常用的反汇编工具,掌握其高级选项能显著提升分析效率。
-M选项适配不同CPU架构,例如反汇编ARM二进制文件需添加-M arm,反汇编x86架构则用-M i386或-M x86-64。若需明确指定字节序(如小端/大端),可结合-EB(大端)或-EL(小端)选项,如objdump -M arm -EL binary。objdump -d仅反汇编代码段(.text)。若需反汇编特定段(如.data或.rodata),使用-j选项,例如objdump -d -j .data binary可查看数据段的反汇编内容(常用于分析硬编码字符串或配置信息)。-t选项可打印符号表(包含函数名、全局变量等),帮助定位关键代码位置;-r选项显示重定位表(记录运行时需修改的地址,如动态链接库中的函数调用),例如objdump -t main或objdump -r libc.so。-g选项保留调试信息,再用-S选项将反汇编代码与源代码混合显示,便于理解指令与源码的对应关系,例如objdump -S -d main。GDB不仅能调试程序,还能动态反汇编运行时的代码,捕捉函数调用、寄存器变化等实时信息。
disassemble(或简写disas)可反汇编当前函数;若需反汇编指定地址范围,使用disassemble start_address,end_address,例如disassemble 0x401000,0x401050。stepi(或si)单步执行一条机器指令(进入函数内部),nexti(或ni)单步执行但不进入函数;info registers查看所有寄存器的当前值,print $eax(或p $rax)打印特定寄存器的值。break *address在指定地址设置断点(如break *0x401000);run启动程序;x/nfu address检查内存,其中n是数量,f是格式(如x表示十六进制),u是单位(如b=字节、h=半字、w=字),例如x/10x 0x404000查看从0x404000开始的10个字节内存。radare2是一款开源逆向工程框架,功能强大但学习曲线较陡,适合高级分析。
r2 -AAA binary启动(-AAA自动分析文件架构、入口点等);aaa命令重新分析当前文件,确保反汇编准确。pdf(print disassembled function)反汇编当前函数;pd 10反汇编接下来的10条指令;s main跳转到main函数;V进入可视化模式(图形化显示控制流)。/ string搜索二进制中的字符串(如/ "password");iz列出所有字符串;#统计匹配项数量;可通过r2 -c 'pd 20; q' binary编写简单脚本(反汇编前20条指令后退出)。理解控制流结构和调用约定是反汇编分析的核心,能帮助你理清程序执行流程。
jmp(无条件跳转)、je/jz(相等/为零跳转)、jne/jnz(不等/不为零跳转)、call(调用函数)、ret(返回)。通过这些指令可识别循环(如jmp回到循环起点)、条件分支(如if-else对应的je/jne)。printf),常见于x86;grep过滤关键信息,例如objdump -d binary | grep "main"查找main函数,objdump -d binary | grep "call.*printf"查找所有printf调用。mov eax,[ebx+0x4]可能是访问结构体成员(ebx指向结构体,0x4是成员偏移);push ebp; mov ebp,esp是函数序言(保存栈帧);leave; ret是函数尾声(恢复栈帧)。mov、add、sub、cmp),这是理解反汇编代码的基础。objdump、GDB、radare2等工具交叉验证,逐步提升分析能力。