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 - 3
Search
LJP-TW
January 20, 2022
Technology
0
440
Reverse Engineering - 3
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 - 2
ljptw
0
540
Re:0 從零開始的逆向工程
ljptw
1
740
Linux 極入門篇
ljptw
1
270
Fuzzing 101
ljptw
1
150
Binary Exploitation - File Structure
ljptw
1
250
Binary Exploitation - Basic 補充篇
ljptw
1
38
Binary Exploitation - Heap
ljptw
1
120
Binary Exploitation - Basic
ljptw
1
93
Other Decks in Technology
See All in Technology
わたしとトラックポイント / TrackPoint tips
masahirokawahara
1
240
ガチ勢によるPipeCD運用大全〜滑らかなCI/CDを添えて〜 / ai-pipecd-encyclopedia
cyberagentdevelopers
PRO
3
210
10分でわかるfreeeのQA
freee
1
3.4k
30万人が利用するチャットをFirebase Realtime DatabaseからActionCableへ移行する方法
ryosk7
5
350
リンクアンドモチベーション ソフトウェアエンジニア向け紹介資料 / Introduction to Link and Motivation for Software Engineers
lmi
4
290k
Shift-from-React-to-Vue
calm1205
3
1.3k
GitHub Universe: Evaluating RAG apps in GitHub Actions
pamelafox
0
180
ガバメントクラウド先行事業中間報告を読み解く
sugiim
1
1.4k
Datachain会社紹介資料(2024年11月) / Company Deck
datachain
3
16k
グローバル展開を見据えたサービスにおける機械翻訳プラクティス / dp-ai-translating
cyberagentdevelopers
PRO
1
150
ネット広告に未来はあるか?「3rd Party Cookie廃止とPrivacy Sandboxの効果検証の裏側」 / third-party-cookie-privacy
cyberagentdevelopers
PRO
1
130
Automated Promptingを目指すその前に / Before we can aim for Automated Prompting
rkaga
0
110
Featured
See All Featured
Unsuck your backbone
ammeep
668
57k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
167
49k
The Power of CSS Pseudo Elements
geoffreycrofte
72
5.3k
Adopting Sorbet at Scale
ufuk
73
9k
Navigating Team Friction
lara
183
14k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
5 minutes of I Can Smell Your CMS
philhawksworth
202
19k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
25
1.8k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
The Language of Interfaces
destraynor
154
24k
RailsConf 2023
tenderlove
29
880
Transcript
Reverse Engineering - 3 2021/12/03 Presented by LJP
# whoami • LJP / LJP-TW • SQLab @ NYCU
碩一 • CTF @ 10sec / TSJ • Pwner 2
Outline • Sysinternals • TLS Callback • TEB 3 •
Exception • Packer • Anti-Reverse
Sysinternals 4
Sysinternals • 除了直接逆向逆起來, 還可以先觀察程式跑起來時會做什麼 • e.g. • 創 child process
• 讀寫檔案 • 網路連線 5
Sysinternals • Sysinternals 集成了許多工具 • 介紹以下兩個工具, 其他工具可以自行摸索 • Procexp •
Procmon 6 Ref: https://docs.microsoft.com/en-us/sysinternals/downloads/sysinternals-suite
Sysinternals Procexp • 好看版的工作管理員 • 這邊另外推薦與之類似的工具 • Process Hacker 7
Process Hacker • 相較於 Procexp, 提供更多訊息 8 Ref: https://github.com/processhacker/processhacker
Process Hacker • 相較於 Procexp, 提供更多訊息 • e.g. .NET assemblies
9 Ref: https://github.com/processhacker/processhacker
Sysinternals Procmon • 監控程序行為 • Registry • File system •
Network • Process/Thread 10
Sysinternals Procmon • 訊息量過大, 請善用 Filter • 可以直接在顯示面板對資料右鍵 快速篩進/篩掉想要的資料 11
TLS callback 12
TLS Callback • Process/Thread 的開始/結束時都會自動呼叫到 TLS Callback • 跟之前討論過的 init/fini
不同 • 呼叫時機 • TLS Cb -> Entry Point -> init -> main -> fini -> TLS Cb 13
TLS Callback • IDA 能自動辨識出 TLS Callback • How? 14
TLS Callback • TLS Directory 15
TLS Callback • TLS Directory • AddressOfCallbacks 16
Lab 1 17
TEB Thread Environment Block 18
TEB • 前面我們講 PEB 時其實跳過了 TEB • FS/GS 就是存放 TEB
19
TEB (64-bit) 20
TEB 21
TEB 22 所以那個 fs / gs 到底是啥
TEB • 接下來的部分, 你不知道也是可以繼續分析程式 • Segment Register • CS、 DS、
SS、 ES、FS、 GS • FS:[0x30]?? GS:[0x60]?? • 這些咚咚有特別的記憶體算法 23
TEB • FS:[0x30] • 實際算法為 base address + 0x30 •
Base address 怎麼來的? 24
TEB • 如果是在 Compatibility mode … 25
TEB • 如果是在 Compatibility mode … • 等等 mode 是啥?!?!
26
TEB 27 Ref: AMD64 Architecture Programmer’s Manual Volume 2: System
Programming • 各種模式
TEB • 各種模式 • 實驗一下, 如果 x64 windows 運行 x32
程式會在什麼模式 28
TEB • CS.L = 0 29 Ref: AMD64 Architecture Programmer’s
Manual Volume 2: System Programming
TEB • CR0.PG = 1 30 Ref: AMD64 Architecture Programmer’s
Manual Volume 2: System Programming
TEB 31 Ref: AMD64 Architecture Programmer’s Manual Volume 2: System
Programming • 各種模式 • CS.L = 0 • CR0.PG = 1 • x64 windows 運行 x32 程式會在 Compatibility Mode
TEB • 在 Compatibility mode 中, base address 是這樣來的… •
Segment Register 結構如下 32
TEB • 看一下 FS • FS = 0x53 • FS.TI
= 0 • FS.SI = 1010 (bin) = 10 (dec) 33
TEB • 看一下 FS • FS = 0x53 • FS.TI
= 0 • FS.SI = 1010 (bin) = 10 (dec) • 若 TI 為 0, 則用以下式子算 Segment Descriptor 位址 • GDT + SI * 8 • GDT: Global Descriptor Table • GDTR: GDT Register, 存放 GDT 值的暫存器 34
TEB 35 Ref: https://www.cs.umd.edu/~meesh/cmsc411/website/saltz/cs412/lect3.html
TEB • Segment Descriptor 結構如下 36
TEB • Segment Descriptor 結構如下 • 組合一下 Base Address •
算出 FS 值為 0x53 時, 從 GDT 爬出 Segment Descriptor, 得到 Base address = 0x00271000 37
TEB • Segment Descriptor 結構如下 • 組合一下 Base Address •
算出 FS 值為 0x53 時, 從 GDT 爬出 Segment Descriptor, 爬到 Base address = 0x00271000 • TEB 位址: 0x00271000 38 Self
TEB • 如果是在 64-bit mode … • x64 windows 跑
x64 程式 • 跳過驗證 CS.L = 1 的部分 39
TEB • GS 的 base 就是 MSR GS.Base • GS.Base
的 MSR Address 為 0xc0000101 • 進到 Kernel 後, GS.Base 會跟另一個 MSR KernelGSBase 互換 • KernelGSBase 的 MSR Address 為 0xc0000102 40
TEB • 直接就是 TEB, 不用爬 Descriptor 41
TEB 42
TEB • 總之, 結論是… 43
Exception 44
Exception 45 Ref: https://www.hexblog.com/wp-content/uploads/2012/06/Recon-2012-Skochinsky-Compiler-Internals.pdf
SEH • Structured Exception Handling • Windows 的機制 • 32
bit 與 64bit 機制不同 • Try, catch, finally 可以利用此機制實作 46
SEH (32-bit) 47
SEH 48 • Handler 為 function pointer
SEH 49 • 舉個例子
50
51 在 stack 創一個 ERR Handler 指向自製 handler func
52 在 stack 創一個 ERR Handler 指向自製 handler func Zero
給 0, 製造 exception
53 在 stack 創一個 ERR Handler 指向自製 handler func Zero
給 0, 製造 exception 導致 exception 的指令 idiv 為 4 Bytes +4 跳過 idiv 指令
54
SEH 55 • 逆向方式就是逆 handler • 不同 compiler 的 handler
實作都不同 • VS 用的 MSVC, handler 的實作…
_except_handler3 56 Ref: https://www.bookstack.cn/read/reverse-engineering-for-beginners-zh/spilt.16.spilt.35.book.md
_except_handler4 57 Ref: https://www.bookstack.cn/read/reverse-engineering-for-beginners-zh/spilt.16.spilt.35.book.md
SEH 58 • 逆向方式就是逆 handler • 不同 compiler 的 handler
實作都不同 • VS 用的 MSVC, handler 的實作… • 事情變得很複雜, 但總之就是在 handler 裡面折騰就對ㄌ
SEH 59 • 回顧一下 • 若 function 需要自行新增 ERR (可能函數內有
try-catch) • 此 function 需為了增加此 ERR 而在 prolog/epilog 加 code • 但 exception 又是較少跑到的 • 加的那些 code 很常是跑心酸的
SEH (64-bit) 60 • 64 bit, SEH 不用鏈表了, 改成 table-based
• 什麼 table? 請看 Exception Directory
SEH (64-bit) 61 • Exception Directory
SEH (64-bit) 62 • 怎麼找 handler? • 首先看你在哪裡丟出 exception •
0x140002e55 除 0
SEH (64-bit) 63 • 0x140002e55 除 0 • 將 0x140002e55
換算回 RVA: 0x2e55 • 查表
SEH (64-bit) 64 • 查看 UnwindInfoAddress RVA 換算回 Raw Offset
SEH (64-bit) • 查看 UnwindInfoAddress • 對應其結構 65 Ref: https://docs.microsoft.com/en-us/cpp/build/exception-handling-x64?view=msvc-170
SEH (64-bit) • 查看 UnwindInfoAddress • 對應其結構 66 Ref: https://docs.microsoft.com/en-us/cpp/build/exception-handling-x64?view=msvc-170
CountOfCodes = 1
SEH (64-bit) • 查看 UnwindInfoAddress • 對應其結構 67 Ref: https://docs.microsoft.com/en-us/cpp/build/exception-handling-x64?view=msvc-170
CountOfCodes = 1 UnwindCode 陣列 UNWIND_CODE 大小為 2 Bytes 陣列長度為 CountOfCodes
SEH (64-bit) • 查看 UnwindInfoAddress • 對應其結構 68 Ref: https://docs.microsoft.com/en-us/cpp/build/exception-handling-x64?view=msvc-170
CountOfCodes = 1 UnwindCode 陣列 ExceptionHandler
SEH (64-bit) • 查看 UnwindInfoAddress • 對應其結構 • 找到 handler
開逆 69 CountOfCodes = 1 UnwindCode 陣列 ExceptionHandler
SEH (64-bit) • IDA pro 很 pro, 都爬好了 • 但
freeware 沒有很 pro, 沒有爬 QQ 70
Lab 2 71
Packer 72
Packer • 目的是將程式變得難逆 • Packer 中文稱為加殼器 • 常見的殼類型分為 • 壓縮殼
• VM 殼 73
Packer • 壓縮殼 • 把 code 壓縮起來 • 在執行時才把 code
解壓縮回來, 並且執行 • UPX • VM 殼 • 實作另一套 VM • 把原始 code 變成給 VM 跑的 code • 想逆? 請直接逆完 VM • VMProtect 74
Packer • UPX 75 Ref: https://upx.github.io/
Packer • UPX 76
Packer • DIE (Detect It Easy) • 查殼的工具 • 查到殼後再上網找脫殼器
• 再不行才自己脫殼 77 Ref: https://github.com/horsicq/Detect-It-Easy
Anti-Reverse 78
Anti-Reverse • 蠻多花招可以反逆向工程 • 其實前面講的幾個點就是在反逆向工程 • 太多招了, 可以參考 Reference 連結
• 這個章節舉幾個例子 79 Ref: https://github.com/LordNoteworthy/al-khaser
Anti-Disassembly • 想一下怎麼實作反組譯器 • Linear disassembly • 一行一行的反組譯下去 • Flow-oriented
disassembly • 如果反組譯到 jmp, 則順著執行流程反組譯 • IDA 80
Anti-Disassembly • 舉個例子 81
Anti-Disassembly 82
Anti-Disassembly 83 取得當前指令位址, 加上 offset 後跳過去
Anti-Disassembly 84 取得當前指令位址, 加上 offset 後跳過去 實際上就是跳到這邊
Anti-Disassembly 85 取得當前指令位址, 加上 offset 後跳過去 實際上就是跳到這邊 在這之間塞一坨垃圾
Anti-Disassembly 86 Graph View 不行? 換 Text View?
Anti-Disassembly 87 不好意思, IDA 不知道哪邊是 code, 請手動定義
Anti-Disassembly 88 但 Ghidra 解的出來, 太神啦
Anti-Debug • 偵測是不是正在被 debug • IsDebuggerPresent • CheckRemoteDebuggerPresent • …
• x64dbg 可以用 ScyllaHide 來反制 89 Ref: https://github.com/x64dbg/ScyllaHide
Anti-Debug • Debugger 是怎麼達到 “設定中斷點” 這件事情的? • x64dbg 預設方式是用 int
3, opcode 為 0xcc • 把設斷點的位址內容改成 0xcc • 執行到 int 3 時會觸發 exception_breakpoint • Debugger 接收此 exception, 並且把原本指令填回去 90
Anti-Debug • 直接掃 code 段記憶體是否有 0xcc • 就知道有沒有被設中斷點 • 就知道有沒有
debugger 91
Anti-VM • 分析者通常是把惡意程式丟進 VM 裡面動態分析 • 各種 VM 會有自己特別的檔案 /
Registry / 行為 / 裝置 / 程序 • 用這些資訊來判斷自己是不是在 VM 裡面 92
Anti-VM • 舉個例子: cpuid • 執行完後, ebx ecx edx 的值會有特徵
93
Anti-VM 94
95 Q & A
96 下課囉 \(. _ .)>