$ cat format "%04.4_ax " 32/1 "%_p" "\n"這個格式表示法為前面十六進位位址與 32 字元為一欄長度的可印列文字。然後隨便挑選一個 ELF 格式的執行檔,進行分析:
$ hexdump -f format elf | head 0000 .ELF........................4... 0020 0.......4. ...(.#. .....4...4... 0040 4............................... 0060 ................................ 0080 ....@...@...............@...@... 00a0 @.......................T...T... 00c0 T.......................(...(... 00e0 (... ... ...........Q.td........ 0100 ..................../lib/ld-linu 0120 x.so.2..............GNU.........很明顯看到檔頭與 ELF 簽名字串,又我們可得知 exec image 0x0001 開始的三個 bytes 為 "ELF",那我們能否在執行時期印列呢?於是我寫了以下小程式:
#include <unistd.h> int main() { write(1, 0x08048001, 3); return 0; }這裡要提的是 0x08048001,其算法就是 0x08048000 基底位址加上 0x0001。於是我們可見執行結果:
$ ./elf ELF另一種方式是直接讀取 /proc/self/mem,在之前的 slides 展示過用 dd 直接輸出 linux-gate.so.1 的方式,不過剛剛發現在 Ubuntu feisty 上竟然失敗了:
$ uname -a Linux venux 2.6.19-7-lowlatency #2 SMP Mon Dec 4 16:48:22 UTC 2006 i686 GNU/Linux $ dd if=/proc/self/mem of=MEM bs=4096 dd: 正在讀取 「/proc/self/mem」: 輸入/輸出錯誤 0+0 records in 0+0 records out頗詭異,有哪位好心的朋友能指點迷津呢?謝謝!
未知核心版本為何?
http://www.google.com.tw/search?num=100&hl=zh-TW&client=firefox-a&rls=org.mozilla%3Aen-US%3Aofficial&hs=V86&q=proc%2Fself%2Fmem%3A+Input%2Foutput+error&btnG=%E6%90%9C%E5%B0%8B&meta=
page 0, NULL address ? So, it is not mapped.