Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Reverse Engineering - 2
Search
LJP-TW
January 20, 2022
Technology
0
550
Reverse Engineering - 2
NYCU Secure Programming 2021 Fall
LJP-TW
January 20, 2022
Tweet
Share
More Decks by LJP-TW
See All by LJP-TW
Reverse Engineering - 1
ljptw
0
1.3k
Reverse Engineering - 3
ljptw
0
460
Re:0 從零開始的逆向工程
ljptw
1
760
Linux 極入門篇
ljptw
1
270
Fuzzing 101
ljptw
1
150
Binary Exploitation - File Structure
ljptw
1
250
Binary Exploitation - Basic 補充篇
ljptw
1
39
Binary Exploitation - Heap
ljptw
1
120
Binary Exploitation - Basic
ljptw
1
98
Other Decks in Technology
See All in Technology
成果を出しながら成長する、アウトプット駆動のキャッチアップ術 / Output-driven catch-up techniques to grow while producing results
aiandrox
0
350
コンテナセキュリティのためのLandlock入門
nullpo_head
2
320
組織に自動テストを書く文化を根付かせる戦略(2024冬版) / Building Automated Test Culture 2024 Winter Edition
twada
PRO
17
4.5k
alecthomas/kong はいいぞ / kamakura.go#7
fujiwara3
1
300
Fanstaの1年を大解剖! 一人SREはどこまでできるのか!?
syossan27
2
170
LINE Developersプロダクト(LIFF/LINE Login)におけるフロントエンド開発
lycorptech_jp
PRO
0
120
Snykで始めるセキュリティ担当者とSREと開発者が楽になる脆弱性対応 / Getting started with Snyk Vulnerability Response
yamaguchitk333
2
190
普通のエンジニアがLaravelコアチームメンバーになるまで
avosalmon
0
100
GitHub Copilot のテクニック集/GitHub Copilot Techniques
rayuron
37
14k
ずっと昔に Star をつけたはずの思い出せない GitHub リポジトリを見つけたい!
rokuosan
0
150
1等無人航空機操縦士一発試験 合格までの道のり ドローンミートアップ@大阪 2024/12/18
excdinc
0
160
How to be an AWS Community Builder | 君もAWS Community Builderになろう!〜2024 冬 CB募集直前対策編?!〜
coosuke
PRO
2
2.8k
Featured
See All Featured
A Modern Web Designer's Workflow
chriscoyier
693
190k
Automating Front-end Workflow
addyosmani
1366
200k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.5k
Practical Orchestrator
shlominoach
186
10k
How STYLIGHT went responsive
nonsquared
95
5.2k
Music & Morning Musume
bryan
46
6.2k
The Power of CSS Pseudo Elements
geoffreycrofte
73
5.4k
Mobile First: as difficult as doing things right
swwweet
222
9k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
44
9.3k
RailsConf 2023
tenderlove
29
940
Adopting Sorbet at Scale
ufuk
73
9.1k
Code Review Best Practice
trishagee
65
17k
Transcript
Reverse Engineering - 2 2021/11/26 Presented by LJP
# whoami • LJP / LJP-TW • SQLab @ NYCU
碩一 • CTF @ 10sec / TSJ • Pwner 2
Outline • Tools • Where to start • Address Space
• Speed-up 3 • DLL • PE Format • IAT • EAT • PEB
Tools PE-bear / x64dbg 4
Tools - PE-Bear • 觀察 PE format 5
Tools - PE-Bear • 換算 RVA <-> Raw address 6
Tools - x64dbg 7 組合語言 資料視窗 Stack 暫存器
Tools - x64dbg 8 Ref: https://www.facebook.com/10sec.tw/photos/a.102934474545443/410257010479853/
Tools - x64dbg 9
Tools - x64dbg • 常用快捷鍵 • F2: 設定中斷點 • F9:
繼續執行 • F8: 步過 • F7: 步入 • Ctrl+F9: 執行到 ret • Ctrl+G: goto • Space: 組譯 10
Tools - x64dbg • 常用功能 • 設定指令列 11
Tools - x64dbg • 常用功能 • 查看載入了哪些 module 12
Tools - x64dbg • 常用功能 • 呼叫堆疊 (call stack) •
記憶體映射 (memory mapping) • … 13
Tools - x64dbg • 外掛 • ScyllaHide: https://github.com/x64dbg/ScyllaHide 14
Where to start? 15
main • Where is main? 16
main • Where is main? • 在這裡面找有三個參數的 function call 17
main 18
Before main • 比 main 還要早跑的 init 的部分: _initterm_e 19
Before main • 比 main 還要早跑的 init 的部分: _initterm 20
After main • 在 main 結束後才跑的部分, 需用以下 API 註冊要跑的函數 •
atexit • _onexit, _onexit_m • __dllonexit 21
Address Space 22
Address Space • 目前申請到的記憶體空間 • 從 x64dbg 記憶體映射觀察 • 起始位址
/ 大小 / 權限 (E: 可執行; R: 可讀; W: 可寫) 23
Lab 1 24
Speed up! 25
Speed up • 更快的找到重要程式碼 • 直接通靈程式會做什麼 • 看引用了哪些外部函數來當作通靈依據 26
Speed up • socket, connect, recv, send • 網路連線 •
CreateService, RegCreateKeyEx • 猜測在嘗試持久化程式執行 • CryptEncrypt, CryptDecrypt • 加解密 27 Ref: https://book.hacktricks.xyz/reversing/common-api-used-in-malware
Speed up • VirtualAlloc, VirtualProtect, CreateRemoteThread, CreateProcess, ResumeThread • 惡意程式愛用的
API 28 Ref: https://book.hacktricks.xyz/reversing/common-api-used-in-malware
Speed up • RegisterClass 家族 • MFC application 用來註冊 window
class 的 API 29 Ref: https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-registerclassw
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
Speed up • 在覺得會執行的 API 設定中斷點 • 真的停在中斷點後, 從 call
stack 往回找是哪邊呼叫到這個 API 31
Speed up 32
Speed up • 猜是呼叫 MessageBox 家族 API 所創出的 window 33
Speed up • 從 IDA Imports 看, 發現有引用 34
Speed up • 往回追到關鍵程式碼區域 35
Lab 2 36
DLL 37
DLL • Dynamic-Link Library • 提供函數給程式使用 • Export function 38
DLL • 查看提供了哪些函數 39
DLL • x64dbg 符號這一區還不錯用 • 看目前引用了哪些 module • 看 module
import/export 哪些函數 40
DLL • DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved ) •
會在各種時機呼叫到 (e.g. 剛載入時, 要卸載時) • 可以設定, 也可以不設定 41
Lab 3 42
PE format 43
PE format • 這就是你熟悉的 exe 的結構 • 是不是看了就頭痛 • 讓我們一點一點地拆開來說
44 Ref: https://en.wikipedia.org/wiki/Portable_Executable
PE format 45 • 首先看最上面的 DOS Header • 用 PE-Bear
來展示一下
PE format 46 DOS Hdr 以 “MZ” 作為開頭 紀錄 NT
Hdr 偏移量(offset)多少
PE format 47 • 再來是 NT Hdr (或稱 PE Hdr)
• 其包含了
PE format 48 • 再來是 NT Hdr (或稱 PE Hdr)
• 其包含了 • COFF Hdr (或稱 File Hdr)
PE format 49 • 再來是 NT Hdr (或稱 PE Hdr)
• 其包含了 • COFF Hdr (或稱 File Hdr) • Optional Hdr
PE format 50 • COFF Hdr (或稱 File Hdr) •
用 PE-Bear 來展示一下
PE format 51 PE Hdr 以 “PE” 開頭 紀錄有幾個 sections
紀錄 Optional Hdr 多大 紀錄有哪些特殊設定
PE format 52 • Optional Hdr • 用 PE-Bear 來展示一下
PE format 53 程式進入點 RVA 程式基址 紀錄有哪些特殊設定
PE format 54 各種 Directory 位址及大小
PE format 55 • 解釋一下 RVA (Relative Virtual Address) •
首先先直接展示一個程式在跑的時候, 記憶體位址的樣子
PE format 56
PE format 57
VA RVA 58 • 解釋 RVA (Relative Virtual Address) 之前
• 先解釋什麼是 VA (Virtual Address) • 做一下小實驗, 如果執行兩個 hello.exe, 記憶體位址分布長怎樣?
VA RVA 59 • 兩個 process 的記憶體位址有重疊耶?! • 如果改掉 A
process 記憶體內容 (地址重疊的部分), B process 的 內容也會被改嗎? • 實驗一下, 答案是不會的 • 所以那個記憶體位址到底是啥
VA RVA 60 • 其實我們的程式所看到的記憶體位址, 都是假的 • 都是虛擬記憶體位址 (Virtual Address)
VA RVA 61 • 那為什麼要這麼複雜? • 如果程式都能直接碰到實體記憶體位址 PA (Physical Address)
• 你要怎麼知道這個 PA 有沒有被其他程式占用? • 這個問題很難, 但現代 OS 幫你搞定了這個問題 • OS 只給你 VA, 實際上存取時, OS 有他的方式, 能夠 VA <-> PA
VA RVA 62 • 正常狀況下 A process 的 0x55665566 VA
• 跟 B process 的 0x55665566 VA • 不是對應到同一個 PA • 解釋了剛剛的實驗結果
VA RVA 63 • 搞懂 VA 了, 可以講 RVA 了
• 只是一個方便 PE 結構不用寫這麼多字的東西 • VA = ImageBase + RVA • 第一條指令位址 VA = ImageBase + Entry point RVA
VA RVA 64 程式進入點 RVA 程式基址 第一條指令位址 = 0x140001580
ASLR 65 • 可是實驗中, 我們的第一條指令位址顯然不是剛算的 • 原因是 ASLR (Address Space
Layout Randomization) • 記憶體位址每次執行時都是固定的話, 會有安全問題 • 啟用了 ASLR, OS 就會隨機產生 ImageBase, 原本提供的 ImageBase 就被忽略了 QQ
ASLR 66 • 第一條指令位址 VA = ASLR 隨機產生的 ImageBase +
進入點 RVA • 那麼要怎麼知道 ASLR 有沒有開啟呢?
ASLR 67 若有 DLL can move 就是有啟用 ASLR
ASLR 68 • 如果把程式裡的這個 bit 拔掉, 就可以關掉 ASLR 了 •
來實驗一下!
ASLR 69 • DLL can move 是 0x40 • 減去
0x40 就是把它拔掉
ASLR 70 • 記得另存一個新程式 • 再度執行看看
PE format 71 • Section Hdr • 在右邊的圖是對應 Section Table
• 其實會有多個 Section Hdr • 用 PE-Bear 來展示一下
PE format 72 .text section hdr
PE format 73 .rdata section hdr
PE format 74 • 解釋一下 Section Hdr • 程式檔案的 Raw
Addr 開始的 Raw size 個 Bytes 會映射到 Virtual Addr 開始的 Virtual Size 個 Bytes • Virtual Addr 是 RVA • Characteristics 設定了該區記憶體位址的權限
PE format 75
PE format 76 • 但看了一下 .rdata, 好像不是這麼回事?
PE format 77
PE format 78 • 但看了一下 .rdata, 好像不是這麼回事? • 實際上是因為另一個機制, 改掉了這邊的資料
IAT Import Address Table 79
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
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
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
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
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
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
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
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
EAT Export Address Table 88
EAT 89
EAT 90
EAT 91
EAT 92
EAT 93
EAT 94
EAT 95
EAT 96
EAT 97
PEB Process Environment Block 98
PEB • MSDN 裡面是這樣寫的 … 99
PEB • 改用 windbg 來查看… 100
101
PEB • 取得 PEB • 32bit • FS:[0x30] • 64bit
• GS:[0x60] 102 Ref: https://en.wikipedia.org/wiki/Win32_Thread_Information_Block
PEB 103
PEB 104
PEB 105
PEB 106
PEB 107
PEB 108
PEB 109
PEB 110
PEB 111
PEB • 一直順著 linked list 爬下去 • 檢查 BaseDllName 是否為想用的模組
(dll / exe) • 通過 DllBase 取得該模組的 base address • 解析在 base address 的 PE format, 從 EAT 爬到想用的 API • Manual Symbol Resolution! 112
113 Q & A
114 下課囉 \(. _ .)>