Slide 1

Slide 1 text

Before Reverse: Assembly YJK @ HackerSir 11/29

Slide 2

Slide 2 text

Register Outline 01 04 02 03 Introduction to ASM Assembly Syntax Read Assembly

Slide 3

Slide 3 text

Introduction to ASM

Slide 4

Slide 4 text

What is ASM • Assembly 組合語言 • 低階語言 • 專為特定架構所設計

Slide 5

Slide 5 text

語言分層 層級 優點 缺點 範例 高階語言 易學易懂 除錯容易 執行效率差 佔用記憶體 C、C++、 Python 低階語言 執行效率高 執行速度快 相容性差 不易維護 組合語言 機器語言

Slide 6

Slide 6 text

Why learn ASM? • 許多語言會編譯成機器語言 (由一堆 0101 組成) • 要 Reverse 編譯好的程式,可以反組譯成 ASM 變成可讀程式碼

Slide 7

Slide 7 text

C compiled into machine code Source code Assembly code Preprocessor 前處理器 & Compiler 編譯器 Library/ Object Executable Machine code Assembler 組譯器 Linker 連結器

Slide 8

Slide 8 text

Reverse Source code Assembly code Preprocessor 前處理器 & Compiler 編譯器 Library/ Object Executable Machine code Assembler 組譯器 Linker 連結器 decompile

Slide 9

Slide 9 text

You should know about ASM • Registers • Flags • Sections • Instructions • Stack frame

Slide 10

Slide 10 text

Registers

Slide 11

Slide 11 text

Registers • 暫存器 • 處理運算需要暫存數值的地方 • 讀寫速度快

Slide 12

Slide 12 text

Registers • QWORD: 64 bits, Quad Word • DWORD: 32 bits, Double Word • WORD: 16 bits • BYTE: 8 bits

Slide 13

Slide 13 text

暫存器種類 名稱 功用 通用暫存器 運算、計數器 區段暫存器 指向記憶體區段 指標暫存器 指向堆疊或陣列 旗標暫存器 紀錄狀態(進位、溢位)

Slide 14

Slide 14 text

通用暫存器 Register AX、BX、CX、DX, DI、SI、BP、SP R8 ~ R15 64 bit 前綴加 R ex:RAX、RDI 不變 ex:R8、R9… 32 bit 前綴加 E ex:EAX、EDI 後綴加 D ex:R8D、R9D… 16 bit 不變 ex:AX、DI 後綴加 W ex:R8W、R9W… 8 bit 後面有 X,將 X 取代成 H/L 後面是 I/P,後綴加 L ex:AH、BL、DIL、BPL 後綴加 B ex:R8B、R9B…

Slide 15

Slide 15 text

通用暫存器 RAX EAX AX AH AL 64bits 32bits 16bits 8bits

Slide 16

Slide 16 text

區段暫存器 名稱 作用 CS 指向 Code Segment DS 指向 Data Segment SS 指向 Stack Segment ES、FS、GS 指向 data segment (選擇性使用)

Slide 17

Slide 17 text

指標暫存器 名稱 作用 SP Stack Pointer 指向 stack 頂端 BP Base Pointer 指向 stack 的任何位置 IP 指向目前執行指令的地址 SI、DI Source/Destination Index 指向資料來源、資料目的地

Slide 18

Slide 18 text

旗標暫存器 名稱 作用 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

Slide 19

Slide 19 text

旗標暫存器 名稱 作用 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 則無法

Slide 20

Slide 20 text

ASM Syntax

Slide 21

Slide 21 text

Practice • Compiler Explorer • 可以將程式碼轉成 Assembly 觀察 • 將程式碼用不同的顏色做背景,作為對應

Slide 22

Slide 22 text

Syntax Intel AT&T push rbp mov rbp,rsp pop rbp push %rbp mov %rsp,%rbp pop %rbp

Slide 23

Slide 23 text

ASM 的組成 名稱 功用 Label 標記,供指令進行跳轉 Section 隔開常數變數、可變變數、程式碼區段 Instruction 指令或偽指令 Operand 運算子

Slide 24

Slide 24 text

Sections

Slide 25

Slide 25 text

Section • 區段 • ELF 檔包含許多區段

Slide 26

Slide 26 text

Sections 區段 說明 .bss 存放未初始化全域變數 .data 存放初始化全域變數 .rodata 存放只可讀不可寫的資料 .text 存放編譯後的程式碼 .init 程式開始前會執行的程式碼 .fini 程式結束時會執行的程式碼 .plt 儲存執行程式碼宣告函式庫的所有函式 .got 儲存已呼叫過的函式

Slide 27

Slide 27 text

Sections 區段 說明 .bss 存放未初始化全域變數 .data 存放初始化全域變數 .rodata 存放只可讀不可寫的資料 .text 存放編譯後的程式碼 .init 程式開始前會執行的程式碼 .fini 程式結束時會執行的程式碼 .plt 儲存執行程式碼宣告函式庫的所有函式 .got 儲存已呼叫過的函式

Slide 28

Slide 28 text

Sections

Slide 29

Slide 29 text

Sections .bss

Slide 30

Slide 30 text

Sections .bss .data

Slide 31

Slide 31 text

Sections .bss .data .text

Slide 32

Slide 32 text

Sections .bss .data .rodata .text

Slide 33

Slide 33 text

Instructions

Slide 34

Slide 34 text

常見 指令 作用 範例語法 push 將資料放進 stack push rbp pop 將資料從 stack 拿出 pop rbp mov 將資料從 A 放入 B mov B, A ret 回傳 ret lea 將變數位址複製給暫存器 lea rax, [rbp-0xc] nop 無任何操作 nop

Slide 35

Slide 35 text

基本運算 指令 作用 範例語法 inc 將變數加 1 inc rax dec 將變數減 1 dec rax add 將變數加指定數目 add rax, 0x1 sub 將變數減指定數目 sub rax, 0x1 mul 將變數相乘 mul cx div 將變數相除 div cx

Slide 36

Slide 36 text

位元運算 指令 作用 範例語法 and 做 & 運算 and al, 0x05 or 做 | 運算 or al, 0x05 xor 做 ^ 運算 xor al, 0x05 not 做 ! 運算 not al neg 計算二進位補數 neg al shl/shr 左/右移指定位數 shl rax, 2 rol/ror 左/右循環位移指定位數 rol rax, 2

Slide 37

Slide 37 text

其他 指令 作用 範例語法 cmp 由相減比較兩數 設定 ZF、CF cmp rax, rbx test 由 & 比較兩數 設定 SF、ZF、PF test rax, rax jmp 跳轉到指定 address jmp 0x00001140

Slide 38

Slide 38 text

跳轉指令 • ASM 有許多跳轉指令 • 統稱 Jcc,Jump condition code • 通常搭配比較指令使用 • 語法:Jcc [跳轉到的 address]

Slide 39

Slide 39 text

Jcc 常見 指令 跳轉條件 je = Jne !=

Slide 40

Slide 40 text

Jcc for unsigned number 指令 跳轉條件 ja > jae >= jb < jbe <= jna !> jnae !>= jnb !< jnbe !<=

Slide 41

Slide 41 text

Jcc for signed number 指令 跳轉條件 jg > jge >= jl < jle <= jng !> jnge !>= jnl !< jnle !<=

Slide 42

Slide 42 text

Jcc for flag 指令 跳轉條件 jc CF = 1 jo OF = 1 jp PF = 1 js SF = 1 jz ZF = 1

Slide 43

Slide 43 text

Function call

Slide 44

Slide 44 text

Function call • call 指令會 call function • 參數儲存會因架構有不同方式 • x86:將變數 push 到 stack • x64:將變數儲存到 register

Slide 45

Slide 45 text

Stack • LIFO(Last-In-First-Out) • 後進先出

Slide 46

Slide 46 text

x86

Slide 47

Slide 47 text

x86 main()

Slide 48

Slide 48 text

x86 0x3 main()

Slide 49

Slide 49 text

x86 0x2 0x3 main()

Slide 50

Slide 50 text

x86 sum() 0x2 0x3 main()

Slide 51

Slide 51 text

Stack frame

Slide 52

Slide 52 text

Stack frame Stack frame of main()

Slide 53

Slide 53 text

Stack frame Stack frame of add1() Stack frame of main()

Slide 54

Slide 54 text

Stack frame Stack frame of add2() Stack frame of add1() Stack frame of main()

Slide 55

Slide 55 text

Stack frame Stack frame of add3() Stack frame of add2() Stack frame of add1() Stack frame of main()

Slide 56

Slide 56 text

Read Assembly

Slide 57

Slide 57 text

picoCTF 2019 asm1 • 題目

Slide 58

Slide 58 text

picoCTF 2019 asm1 • call asm1(0x8be)

Slide 59

Slide 59 text

picoCTF 2019 asm1 • [ebp+0x8] = 0x8be

Slide 60

Slide 60 text

picoCTF 2019 asm1 • [ebp+0x8] = 0x8be • [ebp+0x8] > 0x71c

Slide 61

Slide 61 text

picoCTF 2019 asm1 • [ebp+0x8] = 0x8be • [ebp+0x8] > 0x71c • jump to

Slide 62

Slide 62 text

picoCTF 2019 asm1 • [ebp+0x8] = 0x8be • [ebp+0x8] > 0x71c • jump to • [ebp+0x8] == 0x8be

Slide 63

Slide 63 text

picoCTF 2019 asm1 • [ebp+0x8] = 0x8be • [ebp+0x8] > 0x71c • jump to • [ebp+0x8] == 0x8be • [ebp+0x8] – 0x3 = 0x8bb

Slide 64

Slide 64 text

picoCTF 2019 asm1 • [ebp+0x8] = 0x8be • [ebp+0x8] > 0x71c • jump to • [ebp+0x8] == 0x8be • [ebp+0x8] – 0x3 = 0x8bb • 0x8bb

Slide 65

Slide 65 text

picoCTF 2019 asm2 • 題目

Slide 66

Slide 66 text

picoCTF 2019 asm2 • call asm2(0xb,0x2)

Slide 67

Slide 67 text

picoCTF 2019 asm2 • 根據 stack frame • [ebp-0x4] = 0x2e • [ebp-0x8] = 0xb

Slide 68

Slide 68 text

picoCTF 2019 asm2 • 根據 stack frame • [ebp-0x4] = 0x2e • [ebp-0x8] = 0xb • jmp

Slide 69

Slide 69 text

picoCTF 2019 asm2 • 根據 stack frame • [ebp-0x4] = 0x2e • [ebp-0x8] = 0xb • jmp • [ebp-0x8] <= 0x63f3

Slide 70

Slide 70 text

picoCTF 2019 asm2 • 根據 stack frame • [ebp-0x4] = 0x2e • [ebp-0x8] = 0xb • jmp • [ebp-0x8] <= 0x63f3 • jump to

Slide 71

Slide 71 text

picoCTF 2019 asm2 • 根據 stack frame • [ebp-0x4] = 0x2e • [ebp-0x8] = 0xb • jmp • [ebp-0x8] <= 0x63f3 • jump to • [ebp-0x4] += 1 • [ebp-0x8] -= 0xffffff80

Slide 72

Slide 72 text

picoCTF 2019 asm2 • 根據 stack frame • [ebp-0x4] = 0x2e • [ebp-0x8] = 0xb • jmp • [ebp-0x8] <= 0x63f3 • jump to • [ebp-0x4] += 1 • [ebp-0x8] -= 0xffffff80 Loop!!

Slide 73

Slide 73 text

picoCTF 2019 asm2 sol

Slide 74

Slide 74 text

Next • Reverse Intro • Static Analysis • Analysis tools

Slide 75

Slide 75 text

No content