Slide 1

Slide 1 text

Reverse Engineering - 2 2021/11/26 Presented by LJP

Slide 2

Slide 2 text

# whoami • LJP / LJP-TW • SQLab @ NYCU 碩一 • CTF @ 10sec / TSJ • Pwner 2

Slide 3

Slide 3 text

Outline • Tools • Where to start • Address Space • Speed-up 3 • DLL • PE Format • IAT • EAT • PEB

Slide 4

Slide 4 text

Tools PE-bear / x64dbg 4

Slide 5

Slide 5 text

Tools - PE-Bear • 觀察 PE format 5

Slide 6

Slide 6 text

Tools - PE-Bear • 換算 RVA <-> Raw address 6

Slide 7

Slide 7 text

Tools - x64dbg 7 組合語言 資料視窗 Stack 暫存器

Slide 8

Slide 8 text

Tools - x64dbg 8 Ref: https://www.facebook.com/10sec.tw/photos/a.102934474545443/410257010479853/

Slide 9

Slide 9 text

Tools - x64dbg 9

Slide 10

Slide 10 text

Tools - x64dbg • 常用快捷鍵 • F2: 設定中斷點 • F9: 繼續執行 • F8: 步過 • F7: 步入 • Ctrl+F9: 執行到 ret • Ctrl+G: goto • Space: 組譯 10

Slide 11

Slide 11 text

Tools - x64dbg • 常用功能 • 設定指令列 11

Slide 12

Slide 12 text

Tools - x64dbg • 常用功能 • 查看載入了哪些 module 12

Slide 13

Slide 13 text

Tools - x64dbg • 常用功能 • 呼叫堆疊 (call stack) • 記憶體映射 (memory mapping) • … 13

Slide 14

Slide 14 text

Tools - x64dbg • 外掛 • ScyllaHide: https://github.com/x64dbg/ScyllaHide 14

Slide 15

Slide 15 text

Where to start? 15

Slide 16

Slide 16 text

main • Where is main? 16

Slide 17

Slide 17 text

main • Where is main? • 在這裡面找有三個參數的 function call 17

Slide 18

Slide 18 text

main 18

Slide 19

Slide 19 text

Before main • 比 main 還要早跑的 init 的部分: _initterm_e 19

Slide 20

Slide 20 text

Before main • 比 main 還要早跑的 init 的部分: _initterm 20

Slide 21

Slide 21 text

After main • 在 main 結束後才跑的部分, 需用以下 API 註冊要跑的函數 • atexit • _onexit, _onexit_m • __dllonexit 21

Slide 22

Slide 22 text

Address Space 22

Slide 23

Slide 23 text

Address Space • 目前申請到的記憶體空間 • 從 x64dbg 記憶體映射觀察 • 起始位址 / 大小 / 權限 (E: 可執行; R: 可讀; W: 可寫) 23

Slide 24

Slide 24 text

Lab 1 24

Slide 25

Slide 25 text

Speed up! 25

Slide 26

Slide 26 text

Speed up • 更快的找到重要程式碼 • 直接通靈程式會做什麼 • 看引用了哪些外部函數來當作通靈依據 26

Slide 27

Slide 27 text

Speed up • socket, connect, recv, send • 網路連線 • CreateService, RegCreateKeyEx • 猜測在嘗試持久化程式執行 • CryptEncrypt, CryptDecrypt • 加解密 27 Ref: https://book.hacktricks.xyz/reversing/common-api-used-in-malware

Slide 28

Slide 28 text

Speed up • VirtualAlloc, VirtualProtect, CreateRemoteThread, CreateProcess, ResumeThread • 惡意程式愛用的 API 28 Ref: https://book.hacktricks.xyz/reversing/common-api-used-in-malware

Slide 29

Slide 29 text

Speed up • RegisterClass 家族 • MFC application 用來註冊 window class 的 API 29 Ref: https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-registerclassw

Slide 30

Slide 30 text

Speed up • RegisterClass 家族 • MFC application 用來註冊 window class 的 API 30 Ref: https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-registerclassw Callback function

Slide 31

Slide 31 text

Speed up • 在覺得會執行的 API 設定中斷點 • 真的停在中斷點後, 從 call stack 往回找是哪邊呼叫到這個 API 31

Slide 32

Slide 32 text

Speed up 32

Slide 33

Slide 33 text

Speed up • 猜是呼叫 MessageBox 家族 API 所創出的 window 33

Slide 34

Slide 34 text

Speed up • 從 IDA Imports 看, 發現有引用 34

Slide 35

Slide 35 text

Speed up • 往回追到關鍵程式碼區域 35

Slide 36

Slide 36 text

Lab 2 36

Slide 37

Slide 37 text

DLL 37

Slide 38

Slide 38 text

DLL • Dynamic-Link Library • 提供函數給程式使用 • Export function 38

Slide 39

Slide 39 text

DLL • 查看提供了哪些函數 39

Slide 40

Slide 40 text

DLL • x64dbg 符號這一區還不錯用 • 看目前引用了哪些 module • 看 module import/export 哪些函數 40

Slide 41

Slide 41 text

DLL • DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved ) • 會在各種時機呼叫到 (e.g. 剛載入時, 要卸載時) • 可以設定, 也可以不設定 41

Slide 42

Slide 42 text

Lab 3 42

Slide 43

Slide 43 text

PE format 43

Slide 44

Slide 44 text

PE format • 這就是你熟悉的 exe 的結構 • 是不是看了就頭痛 • 讓我們一點一點地拆開來說 44 Ref: https://en.wikipedia.org/wiki/Portable_Executable

Slide 45

Slide 45 text

PE format 45 • 首先看最上面的 DOS Header • 用 PE-Bear 來展示一下

Slide 46

Slide 46 text

PE format 46 DOS Hdr 以 “MZ” 作為開頭 紀錄 NT Hdr 偏移量(offset)多少

Slide 47

Slide 47 text

PE format 47 • 再來是 NT Hdr (或稱 PE Hdr) • 其包含了

Slide 48

Slide 48 text

PE format 48 • 再來是 NT Hdr (或稱 PE Hdr) • 其包含了 • COFF Hdr (或稱 File Hdr)

Slide 49

Slide 49 text

PE format 49 • 再來是 NT Hdr (或稱 PE Hdr) • 其包含了 • COFF Hdr (或稱 File Hdr) • Optional Hdr

Slide 50

Slide 50 text

PE format 50 • COFF Hdr (或稱 File Hdr) • 用 PE-Bear 來展示一下

Slide 51

Slide 51 text

PE format 51 PE Hdr 以 “PE” 開頭 紀錄有幾個 sections 紀錄 Optional Hdr 多大 紀錄有哪些特殊設定

Slide 52

Slide 52 text

PE format 52 • Optional Hdr • 用 PE-Bear 來展示一下

Slide 53

Slide 53 text

PE format 53 程式進入點 RVA 程式基址 紀錄有哪些特殊設定

Slide 54

Slide 54 text

PE format 54 各種 Directory 位址及大小

Slide 55

Slide 55 text

PE format 55 • 解釋一下 RVA (Relative Virtual Address) • 首先先直接展示一個程式在跑的時候, 記憶體位址的樣子

Slide 56

Slide 56 text

PE format 56

Slide 57

Slide 57 text

PE format 57

Slide 58

Slide 58 text

VA RVA 58 • 解釋 RVA (Relative Virtual Address) 之前 • 先解釋什麼是 VA (Virtual Address) • 做一下小實驗, 如果執行兩個 hello.exe, 記憶體位址分布長怎樣?

Slide 59

Slide 59 text

VA RVA 59 • 兩個 process 的記憶體位址有重疊耶?! • 如果改掉 A process 記憶體內容 (地址重疊的部分), B process 的 內容也會被改嗎? • 實驗一下, 答案是不會的 • 所以那個記憶體位址到底是啥

Slide 60

Slide 60 text

VA RVA 60 • 其實我們的程式所看到的記憶體位址, 都是假的 • 都是虛擬記憶體位址 (Virtual Address)

Slide 61

Slide 61 text

VA RVA 61 • 那為什麼要這麼複雜? • 如果程式都能直接碰到實體記憶體位址 PA (Physical Address) • 你要怎麼知道這個 PA 有沒有被其他程式占用? • 這個問題很難, 但現代 OS 幫你搞定了這個問題 • OS 只給你 VA, 實際上存取時, OS 有他的方式, 能夠 VA <-> PA

Slide 62

Slide 62 text

VA RVA 62 • 正常狀況下 A process 的 0x55665566 VA • 跟 B process 的 0x55665566 VA • 不是對應到同一個 PA • 解釋了剛剛的實驗結果

Slide 63

Slide 63 text

VA RVA 63 • 搞懂 VA 了, 可以講 RVA 了 • 只是一個方便 PE 結構不用寫這麼多字的東西 • VA = ImageBase + RVA • 第一條指令位址 VA = ImageBase + Entry point RVA

Slide 64

Slide 64 text

VA RVA 64 程式進入點 RVA 程式基址 第一條指令位址 = 0x140001580

Slide 65

Slide 65 text

ASLR 65 • 可是實驗中, 我們的第一條指令位址顯然不是剛算的 • 原因是 ASLR (Address Space Layout Randomization) • 記憶體位址每次執行時都是固定的話, 會有安全問題 • 啟用了 ASLR, OS 就會隨機產生 ImageBase, 原本提供的 ImageBase 就被忽略了 QQ

Slide 66

Slide 66 text

ASLR 66 • 第一條指令位址 VA = ASLR 隨機產生的 ImageBase + 進入點 RVA • 那麼要怎麼知道 ASLR 有沒有開啟呢?

Slide 67

Slide 67 text

ASLR 67 若有 DLL can move 就是有啟用 ASLR

Slide 68

Slide 68 text

ASLR 68 • 如果把程式裡的這個 bit 拔掉, 就可以關掉 ASLR 了 • 來實驗一下!

Slide 69

Slide 69 text

ASLR 69 • DLL can move 是 0x40 • 減去 0x40 就是把它拔掉

Slide 70

Slide 70 text

ASLR 70 • 記得另存一個新程式 • 再度執行看看

Slide 71

Slide 71 text

PE format 71 • Section Hdr • 在右邊的圖是對應 Section Table • 其實會有多個 Section Hdr • 用 PE-Bear 來展示一下

Slide 72

Slide 72 text

PE format 72 .text section hdr

Slide 73

Slide 73 text

PE format 73 .rdata section hdr

Slide 74

Slide 74 text

PE format 74 • 解釋一下 Section Hdr • 程式檔案的 Raw Addr 開始的 Raw size 個 Bytes 會映射到 Virtual Addr 開始的 Virtual Size 個 Bytes • Virtual Addr 是 RVA • Characteristics 設定了該區記憶體位址的權限

Slide 75

Slide 75 text

PE format 75

Slide 76

Slide 76 text

PE format 76 • 但看了一下 .rdata, 好像不是這麼回事?

Slide 77

Slide 77 text

PE format 77

Slide 78

Slide 78 text

PE format 78 • 但看了一下 .rdata, 好像不是這麼回事? • 實際上是因為另一個機制, 改掉了這邊的資料

Slide 79

Slide 79 text

IAT Import Address Table 79

Slide 80

Slide 80 text

IAT 80 Ref: https://docs.microsoft.com/en-us/archive/msdn-magazine/2002/march/inside-windows-an-in-depth-look-into-the-win32- portable-executable-file-format-part-2

Slide 81

Slide 81 text

IAT 81 Ref: https://docs.microsoft.com/en-us/archive/msdn-magazine/2002/march/inside-windows-an-in-depth-look-into-the-win32- portable-executable-file-format-part-2

Slide 82

Slide 82 text

IAT 82 Ref: https://docs.microsoft.com/en-us/archive/msdn-magazine/2002/march/inside-windows-an-in-depth-look-into-the-win32- portable-executable-file-format-part-2

Slide 83

Slide 83 text

IAT 83 Ref: https://docs.microsoft.com/en-us/archive/msdn-magazine/2002/march/inside-windows-an-in-depth-look-into-the-win32- portable-executable-file-format-part-2

Slide 84

Slide 84 text

IAT 84 Ref: https://docs.microsoft.com/en-us/archive/msdn-magazine/2002/march/inside-windows-an-in-depth-look-into-the-win32- portable-executable-file-format-part-2

Slide 85

Slide 85 text

IAT 85 Ref: https://docs.microsoft.com/en-us/archive/msdn-magazine/2002/march/inside-windows-an-in-depth-look-into-the-win32- portable-executable-file-format-part-2

Slide 86

Slide 86 text

IAT 86 Ref: https://docs.microsoft.com/en-us/archive/msdn-magazine/2002/march/inside-windows-an-in-depth-look-into-the-win32- portable-executable-file-format-part-2

Slide 87

Slide 87 text

IAT 87 Ref: https://docs.microsoft.com/en-us/archive/msdn-magazine/2002/march/inside-windows-an-in-depth-look-into-the-win32- portable-executable-file-format-part-2

Slide 88

Slide 88 text

EAT Export Address Table 88

Slide 89

Slide 89 text

EAT 89

Slide 90

Slide 90 text

EAT 90

Slide 91

Slide 91 text

EAT 91

Slide 92

Slide 92 text

EAT 92

Slide 93

Slide 93 text

EAT 93

Slide 94

Slide 94 text

EAT 94

Slide 95

Slide 95 text

EAT 95

Slide 96

Slide 96 text

EAT 96

Slide 97

Slide 97 text

EAT 97

Slide 98

Slide 98 text

PEB Process Environment Block 98

Slide 99

Slide 99 text

PEB • MSDN 裡面是這樣寫的 … 99

Slide 100

Slide 100 text

PEB • 改用 windbg 來查看… 100

Slide 101

Slide 101 text

101

Slide 102

Slide 102 text

PEB • 取得 PEB • 32bit • FS:[0x30] • 64bit • GS:[0x60] 102 Ref: https://en.wikipedia.org/wiki/Win32_Thread_Information_Block

Slide 103

Slide 103 text

PEB 103

Slide 104

Slide 104 text

PEB 104

Slide 105

Slide 105 text

PEB 105

Slide 106

Slide 106 text

PEB 106

Slide 107

Slide 107 text

PEB 107

Slide 108

Slide 108 text

PEB 108

Slide 109

Slide 109 text

PEB 109

Slide 110

Slide 110 text

PEB 110

Slide 111

Slide 111 text

PEB 111

Slide 112

Slide 112 text

PEB • 一直順著 linked list 爬下去 • 檢查 BaseDllName 是否為想用的模組 (dll / exe) • 通過 DllBase 取得該模組的 base address • 解析在 base address 的 PE format, 從 EAT 爬到想用的 API • Manual Symbol Resolution! 112

Slide 113

Slide 113 text

113 Q & A

Slide 114

Slide 114 text

114 下課囉 \(. _ .)>