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
540
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.2k
Reverse Engineering - 3
ljptw
0
450
Re:0 從零開始的逆向工程
ljptw
1
750
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
94
Other Decks in Technology
See All in Technology
初心者向けAWS Securityの勉強会mini Security-JAWSを9ヶ月ぐらい実施してきての近況
cmusudakeisuke
0
130
いざ、BSC討伐の旅
nikinusu
2
780
iOSチームとAndroidチームでブランチ運用が違ったので整理してます
sansantech
PRO
0
150
【Startup CTO of the Year 2024 / Audience Award】アセンド取締役CTO 丹羽健
niwatakeru
0
1.3k
【Pycon mini 東海 2024】Google Colaboratoryで試すVLM
kazuhitotakahashi
2
540
Adopting Jetpack Compose in Your Existing Project - GDG DevFest Bangkok 2024
akexorcist
0
110
Application Development WG Intro at AppDeveloperCon
salaboy
0
190
FlutterアプリにおけるSLI/SLOを用いたユーザー体験の可視化と計測基盤構築
ostk0069
0
100
The Role of Developer Relations in AI Product Success.
giftojabu1
0
140
AWS Lambda のトラブルシュートをしていて思うこと
kazzpapa3
2
180
iOS/Androidで同じUI体験をネ イティブで作成する際に気をつ けたい落とし穴
fumiyasac0921
1
110
Making your applications cross-environment - OSCG 2024 NA
salaboy
0
190
Featured
See All Featured
Keith and Marios Guide to Fast Websites
keithpitt
409
22k
How STYLIGHT went responsive
nonsquared
95
5.2k
Agile that works and the tools we love
rasmusluckow
327
21k
Measuring & Analyzing Core Web Vitals
bluesmoon
4
130
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
27
840
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.2k
The Language of Interfaces
destraynor
154
24k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.1k
[RailsConf 2023] Rails as a piece of cake
palkan
52
4.9k
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 下課囉 \(. _ .)>