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
560
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.6k
Reverse Engineering - 2
ljptw
0
710
Re:0 從零開始的逆向工程
ljptw
1
1.1k
Linux 極入門篇
ljptw
1
280
Fuzzing 101
ljptw
1
170
Binary Exploitation - File Structure
ljptw
1
270
Binary Exploitation - Basic 補充篇
ljptw
1
44
Binary Exploitation - Heap
ljptw
1
140
Binary Exploitation - Basic
ljptw
1
110
Other Decks in Technology
See All in Technology
オブザーバビリティが広げる AIOps の世界 / The World of AIOps Expanded by Observability
aoto
PRO
0
380
Firestore → Spanner 移行 を成功させた段階的移行プロセス
athug
1
480
会社紹介資料 / Sansan Company Profile
sansan33
PRO
6
380k
新アイテムをどう使っていくか?みんなであーだこーだ言ってみよう / 20250911-rpi-jam-tokyo
akkiesoft
0
270
Aurora DSQLはサーバーレスアーキテクチャの常識を変えるのか
iwatatomoya
1
990
Rustから学ぶ 非同期処理の仕組み
skanehira
1
140
これでもう迷わない!Jetpack Composeの書き方実践ガイド
zozotech
PRO
0
850
AI時代を生き抜くエンジニアキャリアの築き方 (AI-Native 時代、エンジニアという道は 「最大の挑戦の場」となる) / Building an Engineering Career to Thrive in the Age of AI (In the AI-Native Era, the Path of Engineering Becomes the Ultimate Arena of Challenge)
jeongjaesoon
0
130
KotlinConf 2025_イベントレポート
sony
1
140
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
9
73k
BPaaSにおける人と協働する前提のAIエージェント-AWS登壇資料
kentarofujii
0
140
COVESA VSSによる車両データモデルの標準化とAWS IoT FleetWiseの活用
osawa
1
290
Featured
See All Featured
Unsuck your backbone
ammeep
671
58k
Code Review Best Practice
trishagee
70
19k
RailsConf 2023
tenderlove
30
1.2k
Optimizing for Happiness
mojombo
379
70k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3k
Optimising Largest Contentful Paint
csswizardry
37
3.4k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
6k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3k
Docker and Python
trallard
45
3.6k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
13k
BBQ
matthewcrist
89
9.8k
Making the Leap to Tech Lead
cromwellryan
135
9.5k
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 下課囉 \(. _ .)>