常見執行檔類型
PE (Portable & Executable)
- Windows
- 副檔名:.exe、.dll、.sys
ELF (Exetutable & Linkable Format)
- Linux
Mach-O (Mach Object)
- MacOS、IPadOS、IOS
檔案類型辨別
file指令查看檔案類型
file <filename>
xxd 查看檔案header
xxd -l 4 <filename>

xxd補充:
二進位轉成十六進位檔xxd -r filename>hexdump十六進位檔反向還原成二進位檔
xxd -r hexdump.txt original_file.bin
執行檔section結構
| 功能 | PE | ELF | Mach-O |
|---|---|---|---|
| 程式碼 | .text | .text | __TEXT,__text |
| 常數資料 | .rdata | .rodata | __TEXT,__const / __TEXT,__cstring |
| 可寫資料 | .data | .data | __DATA,__data |
| 未初始化資料 | .bss | .bss | __DATA,__bss |
| 入口點 | address in .text | _start | _main / some addr |
readlf
readelf指令 查詢檔案所有資訊
readelf -all <binary file>
readelf指令 查詢檔案headers
readelf -headers <binary file>
readelf指令 查詢檔案symbols
readelf -symbols <binary file>
Whis is symbols?
編譯器在編譯過程中會生成一張符號表。這張表儲存在執行檔(如 Linux 的 ELF 或 Windows 的 PE 檔)的特定區段中。 符號 (Symbols) 的成員包括:
- 函數名稱 (Functions): 這是最常見的符號。指向一段可以執行的程式碼路徑。
- 全域變數 (Global Variables): 指向資料區段(Data Segment)中的某個位置。
- 靜態變數 (Static Variables): 雖然作用域有限,但在編譯時也會被分配符號。
- 物件與類別 (Objects/Classes): 在 C++ 等物件導向語言中,類別名稱與方法(Methods)也都是符號。
常數算Symbols嗎?
全域常數 : const 關鍵字定義了一個全域或靜態的常數,它通常會被存放在二進位檔案的 .rodata(唯讀資料區段)中,並且擁有自己的符號。
使用 #define 定義常數 :它在編譯之前就會被「預處理器」直接替換成具體的數字。例如: #define PI 3.14
magic number
檔案類型
進入位置

strings
strings 分析檔案中字串
strings filename | grep "picoCTF"
ltrace
ltrace 是一個 Linux 下的診斷工具,用來追蹤程式在執行時所呼叫的動態函式庫(shared library)函式以及接收到的系統訊號(signals)。 ltrace 用法
| 指令 | 說明 |
|---|---|
ltrace ./my_program |
追蹤 my_program 的函式庫呼叫 |
ltrace -p <PID> |
附加到已執行的程序 |
ltrace -e malloc+free ./app |
只追蹤特定函式 |
ltrace -c ./app |
統計各函式的呼叫次數與時間 |
![]() |
strace
strace 是一個 Linux 下的診斷與除錯工具,用來追蹤程式執行時所發出的系統呼叫(system calls)以及接收到的訊號(signals)。 strace 用法
| 指令 | 說明 |
|---|---|
strace ./my_program |
追蹤程式的系統呼叫 |
strace -p <PID> |
附加到已在執行的程序 |
strace -e trace=open,read ./app |
只追蹤特定系統呼叫 |
strace -c ./app |
統計各系統呼叫的次數與耗時 |
strace -f ./app |
同時追蹤子程序(fork) |
![]() |




說些什麼吧!