以下是Linux反匯編指令實踐教程,涵蓋工具使用、基礎操作及示例分析:
安裝基礎工具
objdump、gdb:屬于binutils包,安裝命令:sudo apt-get install binutils # Debian/Ubuntu
sudo yum install binutils # CentOS/RHEL
IDA Pro(商業級逆向工具)、radare2(開源框架)。準備測試程序
hello.c),編譯時添加-g選項保留調試信息:gcc -g -o hello hello.c
作用:直接分析二進制文件的匯編代碼,無需運行程序。
| 場景 | 命令 | 說明 |
|---|---|---|
| 反匯編整個文件 | objdump -d -M intel hello |
-d:反匯編可執行段;-M intel:使用Intel語法(默認AT&T) |
| 查看特定函數 | `objdump -d -M intel hello | grep -A 20 “ |
| 顯示符號表 | objdump -t hello |
查看函數、變量地址及類型 |
| 反匯編特定段 | objdump -d -j .text hello |
僅反匯編.text段(代碼段) |
示例輸出分析:
080484b4 <main>:
80484b4: 55 push ebp # 保存基指針
80484b5: 89 e5 mov ebp,esp # 設置棧幀
80484b7: 83 ec 18 sub esp,0x18 # 分配局部變量空間
80484ba: c7 45 fc 0a 00 00 00 mov DWORD PTR [ebp-0x4],0xa # int a=10
作用:在程序運行時動態查看匯編指令,支持單步執行和寄存器查看。
gdb ./hello
(gdb) break main # 在main函數入口設斷點
(gdb) run # 運行程序,停在斷點處
(gdb) disassemble # 反匯編當前函數
(gdb) stepi # 單步執行1條機器指令
(gdb) info registers # 查看寄存器實時狀態
(gdb) x/10xw $sp # 查看棧頂10個字(十六進制)
hello程序,觀察printf調用時的棧變化。main函數內printf調用前設斷點。disassemble查看printf的匯編代碼。stepi逐步執行,觀察參數如何通過寄存器傳遞至printf。混合源碼與匯編
編譯時添加-g,用objdump -S顯示源碼與匯編對照:
objdump -S -M intel hello
跨架構反匯編
binutils-arm-none-eabi,使用arm-none-eabi-objdump。objdump --architecture=arm -d binary。批量反匯編腳本
結合bash批量處理多個二進制文件:
for file in *.bin; do
arm-none-eabi-objdump -d $file > ${file}.asm
done
man objdump、man gdb通過以上步驟,可快速掌握Linux下反匯編的基礎實踐,結合工具特性滿足不同分析需求。