2012年2月14日 星期二

用objdump指令觀察ELF檔案

objdump是個用來觀察object code的好幫手,雖然readelf可以取代他大部分的工作,首先先有個code

很簡單的code,基本學過C望文生義

程式大致上可以分為兩部分,執行的資料跟處理資料的程式碼。obdump參數h表示要列出sections,object code由許多sections所組成,其中.txt這個section是處理資料的程式碼,.data與.bss是資料的section,還有其他給ld用的區段 size指令可以看出各個section的大小

s這個參數表示要使用16進位表示法顯示出object code中的各個區段,可以看到一些read only的資料室蠻明顯的,但是.txt基本上不是人看得,最後可以觀察到.comment這個section是可以省略掉的資訊

d這個參數讓object code可以反組譯成assemble code,方便我們觀察程式,有些時候只能拿到library的時候,就只能從這裡挖到一些資料了,雖然可讀性沒有C好,但是至少比binary code強

最後x參數可以所是列出了所有資訊,不只包含了h這個參數,還列出了許多symbol table跟一些需要重新定位label資訊
這裡觀察到兩個有趣的地方,兩個變數被寫進了不同的區段,有初始化的m被寫入了.data內,沒有的則被寫入了.bss,printf不見了,其實被取代成了puts,這是compiler優化的結果,puts在處理只有字串的資訊比printf有效率,UND表示尚未定義在這個object code中

參考資料:
http://www.jollen.org/EmbeddedLinux/Executable_Linking_Format.html
http://www.jollen.org/blog/2007/03/elf_program_loading_1_segment.html
http://www.jollen.org/blog/2007/03/elf_program_loading_2_pht.html
http://www.study-area.org/cyril/opentools/opentools/x909.html

沒有留言:

張貼留言