關於這個工具
把 ELF 丟進來就好——執行檔、.so、核心模組、.o、CTF 題目、韌體映像檔都可以——你會拿到 readelf -a 會告訴你的東西,而且是兩個互相連動的面板。左邊是結構樹:ELF 標頭一個欄位一列、program headers、節區表、分開放的 .dynsym 與 .symtab、.dynamic、每一個重定位節區、notes,以及版本定義與版本需求。右邊是檔案的位元組。點任何一列,右邊就剛好標出這一列是從哪幾個位元組解出來的;點一個位元組,左邊就會找出蓋住它的最內層結構。
摘要卡先回答大家真正想知道的事,不用先翻表:這是 ELF32 還是 ELF64、什麼架構、什麼位元組序、EXEC / DYN / REL、進入點在哪;如果這個架構的 e_flags 有意義(RISC-V 和 MIPS 都有),也把它解出來。接著是推導出來的事實:靜態還是動態連結、要哪一個載入器、有沒有被 strip、是不是 PIE、.note.gnu.build-id 裡的 Build ID,以及 PT_GNU_STACK 有沒有帶 PF_X。最後這一項跟安全直接有關,所以直接寫成一句話,不要你自己去表裡面翻。
什麼都不會上傳,而對這群人來說,這是前提不是賣點。CTF 的執行檔是別人還沒解出來的題目,韌體通常是客戶的財產;為了看一個節區標頭就把它丟到別人的伺服器,很不划算。檔案由分頁讀進來,交給 Web Worker,在記憶體裡解析——沒有上傳端點,你可以開著 DevTools 自己確認:打開一個檔案完全不會發出網路請求。解析跑在 worker 裡,所以 60 MB 的檔案也不會把分頁卡死;超過 128 MiB 的則會直接說明理由拒收,而不是收下來然後當掉。
這頁印出來的每一個名稱——架構、類型、節區類型、符號的 type / bind / visibility、重定位類型、dynamic tag——都跟 GNU binutils 的 readelf 一字不差,因為這個解析器是拿真正的 readelf 輸出來對答案的,不是拿自己的期待值。1,900 個符號的檔案很常見,40 萬個的也存在,所以符號和重定位的過濾、排序、分頁都在資料所在的那一端做,不會一列一列畫進頁面裡。