objdump命令是用查看目標文件或者可執行的目標文件的構成的gcc工具。
選項
--archive-headers
-a
顯示檔案庫的成員信息,類似ls -l將lib*.a的信息列出。 -b bfdname
--target=bfdname
指定目標碼格式。這不是必須的,objdump能自動識別許多格式,比如: objdump -b oasys -m vax -h fu.o
顯示fu.o的頭部摘要信息,明確指出該文件是Vax系統下用Oasys編譯器生成的目標文件。objdump -i將給出這里可以指定的目標碼格式列表。 -C
--demangle
將底層的符號名解碼成用戶級名字,除了去掉所開頭的下劃線之外,還使得C++函數名以可理解的方式顯示出來。 --debugging
-g
顯示調試信息。企圖解析保存在文件中的調試信息并以C語言的語法顯示出來。僅僅支持某些類型的調試信息。有些其他的格式被readelf -w支持。 -e
--debugging-tags
類似-g選項,但是生成的信息是和ctags工具相兼容的格式。 --disassemble
-d
從objfile中反匯編那些特定指令機器碼的section。-D
--disassemble-all
與 -d 類似,但反匯編所有section.-EB
-EL
--endian={big|little}
指定目標文件的小端。這個項將影響反匯編出來的指令。在反匯編的文件沒描述小端信息的時候用。例如S-records. -f
--file-headers
顯示objfile中每個文件的整體頭部摘要信息。-h
--section-headers
--headers
顯示目標文件各個section的頭部摘要信息。 -H
--help
簡短的幫助信息。 -i
--info
顯示對于 -b 或者 -m 選項可用的架構和目標格式列表。 -j name
--section=name
僅僅顯示指定名稱為name的section的信息 -l
--line-numbers
用文件名和行號標注相應的目標代碼,僅僅和-d、-D或者-r一起使用使用-ld和使用-d的區別不是很大,在源碼級調試的時候有用,要求編譯時使用了-g之類的調試編譯選項。 -m machine
--architecture=machine
指定反匯編目標文件時使用的架構,當待反匯編文件本身沒描述架構信息的時候(比如S-records),這個選項很有用。可以用-i選項列出這里能夠指定的架構. --reloc
-r
顯示文件的重定位入口。如果和-d或者-D一起使用,重定位部分以反匯編后的格式顯示出來。 --dynamic-reloc
-R
顯示文件的動態重定位入口,僅僅對于動態目標文件意義,比如某些共享庫。 -s
--full-contents
顯示指定section的完整內容。默認所有的非空section都會被顯示。-S
--source
盡可能反匯編出源代碼,尤其當編譯的時候指定了-g這種調試參數時,效果比較明顯。隱含了-d參數。 --show-raw-insn
反匯編的時候,顯示每條匯編指令對應的機器碼,如不指定--prefix-addresses,這將是缺省選項。 --no-show-raw-insn
反匯編時,不顯示匯編指令的機器碼,如不指定--prefix-addresses,這將是缺省選項。 --start-address=address
從指定地址開始顯示數據,該選項影響-d、-r和-s選項的輸出。 --stop-address=address
顯示數據直到指定地址為止,該項影響-d、-r和-s選項的輸出。 -t
--syms
顯示文件的符號表入口。類似于nm -s提供的信息 -T
--dynamic-syms
顯示文件的動態符號表入口,僅僅對動態目標文件意義,比如某些共享庫。它顯示的信息類似于 nm -D|--dynamic 顯示的信息。 -V
--version
版本信息 --all-headers
-x
顯示所可用的頭信息,包括符號表、重定位入口。-x 等價于-a -f -h -r -t 同時指定。 -z
--disassemble-zeroes
一般反匯編輸出將省略大塊的零,該選項使得這些零塊也被反匯編。@file 可以將選項集中到一個文件中,然后使用這個@file選項載入。
實例
首先,在給出后面大部分測試所基于的源代碼以及編譯指令。 源代碼如下:
mytest.cpp
#include<stdio.h>
void exploit()
{system("/bin/sh");
}
void func()
{char str[0x20];read(0, str, 0x50);
}
int main()
{func();return 0;
}
編譯:
gcc -c -g -o mytest mytest.c
查看當前使用的objdump的版本號:
objdump -V
顯示可用的架構和目標結構列表:
objdump -i
顯示mytest文件中的text段的內容:
objdump --section=.text -s mytest
這里注意,不能單獨使用-j或者–section,例如objdump --section=.text mytest
是不會運行成功的。
反匯編mytest中的text段內容,并盡可能用源代碼形式表示:
objdump -j .text -S mytest
這里注意,不能單獨使用-j或者–section,例如objdump -j .text mytest
是不會運行成功的。另外-S命令對于包含調試信息的目標文件,顯示的效果比較好,如果編譯時沒有指定-g選項,那么目標文件就不包含調試信息,那么顯示效果就差多了。
反匯編出mytest.o的源代碼:
objdump -S mytest
這里,尤其當編譯的時候指定了-g這種調試參數時,反匯編的效果比較明顯。隱含了-d參數。
顯示文件的符號表入口:
objdump -t mytest
顯示文件的符號表入口,將底層符號解碼并表示成用戶級別:
**objdump -t -C mytest**
反匯編目標文件的特定機器碼段:
objdump -d mytest
這里,對text段的內容進行了反匯編。
反匯編特定段,并將匯編代碼對應的文件名稱和行號對應上:
objdump -d -l mytest
這里,項"-d"從objfile中反匯編那些特定指令機器碼的section,而使用"-l"指定用文件名和行號標注相應的目標代碼,僅僅和-d、-D或者-r一起使用,使用-ld和使用-d的區別不是很大,在源碼級調試的時候有用,要求編譯時使用了-g之類的調試編譯選項。
顯示目標文件各個段的頭部摘要信息:
objdump -h mytest
這里,更多的內容參見man objdump中的這個選項。