Day3-x86 asm
Introduction ASM 是 Assembly(組合語言)的縮寫。組合語言屬於低階語言,通常專為特定架構設計。相對於低階語言,高階語言更易於理解和使用。以下是兩者的比較: 層級 優點 缺點 範例 高階語言 易學易懂、除錯容易 執行效率較低、佔用記憶體較多 C、C++、Python 低階語言 執行效率高、速度快 相容性差、不易維護 組合語言、機器語言 學習組合語言的原因之一是許多程式語言在執行前會先編譯成機器語言。儘管近年來的 PWN 題目通常會提供程式碼,但如果要挖掘漏洞或檢測產品韌體,仍需要進行程式碼的逆向分析。因此,我們會將編譯好的程式反組譯成組合語言,以便閱讀和理解。以下是一個 C 程式編譯過程的流程圖: 你需要知道的 ASM Registers Flags Sections Instructions Stack frame Calling Convention Registers(暫存器) 暫存器是處理運算時暫存數值的地方,具有讀寫速度快的特性。根據資料型態大小,暫存器可以分為以下四種: QWORD: 64 bits, Quad Word DWORD: 32 bits, Double Word WORD: 16 bits BYTE: 8 bits 根據功能,暫存器又可以分為以下四種: 名稱 功用 通用暫存器 運算、計數 區段暫存器 指向記憶體區段 指標暫存器 指向堆疊或陣列 旗標暫存器 紀錄狀態(進位、溢位等) 通用暫存器 Register AX、BX、CX、DX、DI、SI、BP、SP R8 ~ R15 64 bit 前綴加 R,例如:RAX、RDI 前綴加 R,例如:R8、R9 32 bit 前綴加 E,例如:EAX、EDI;後綴加 D,例如:R8D、R9D 前綴加 E,例如:EAX、EDI;後綴加 D,例如:R8D、R9D 16 bit 無變化,例如:AX、DI;後綴加 W,例如:R8W、R9W 無變化,例如:AX、DI;後綴加 W,例如:R8W、R9W 8 bit 後綴加 X(X 可替換為 H/L),例如:AH、BL、DIL、BPL;後綴加 B,例如:R8B、R9B 後綴加 X(X 可替換為 H/L),例如:AH、BL、DIL、BPL;後綴加 B,例如:R8B、R9B 區段暫存器 名稱 作用 CS 指向 Code Segment DS 指向 Data Segment SS 指向 Stack Segment ES、FS、GS 指向 Data Segment(選擇性使用) 指標暫存器 名稱 作用 SP Stack Pointer,指向 stack 頂端 BP Base Pointer,指向 stack 的任何位置 IP 指向目前執行指令的地址 SI Source Index,指向資料來源 DI Destination Index,指向資料目的地 旗標暫存器 名稱 作用 CF Carry Flag:最高位元有進位或借位,CF = 1;否則為 0 PF Parity Flag:判斷運算後最低 8 位元的 1 的數量,奇數個 PF = 1;否則為 0 AF Auxiliary Flag:運算後第 3 位元產生進位或借位,AF = 1;否則為 0 ZF Zero Flag:運算後結果為 0,則 ZF = 1;否則為 0 SF Sign Flag:運算後,SF=1 表示負數;否則為 0 OF Overflow Flag:運算後結果溢位,OF=1;否則為 0 TF Trap Flag:用於 Debug,TF=1 時,每次執行一個指令 DF Direction Flag:字串運算,DF=0 從低位到高位;DF=1 反之 IF Interrupt Flag:IF=1 時,接受外部中斷;IF=0 則無法 語法格式 常見的格式有兩種:Intel 和 AT&T。如果有興趣,也可以使用 Compiler Explorer 將程式轉為 ASM 進行觀察。原則上,大家比較偏向使用 Intel 格式,因為它的語法接近正常的程式語言,且更易於閱讀。以下是兩種語法格式的比較: ...