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
450
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
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
Adopting Jetpack Compose in Your Existing Project - GDG DevFest Bangkok 2024
akexorcist
0
110
ドメインの本質を掴む / Get the essence of the domain
sinsoku
2
160
リンクアンドモチベーション ソフトウェアエンジニア向け紹介資料 / Introduction to Link and Motivation for Software Engineers
lmi
4
300k
生成AIが変えるデータ分析の全体像
ishikawa_satoru
0
170
SREが投資するAIOps ~ペアーズにおけるLLM for Developerへの取り組み~
takumiogawa
1
450
100 名超が参加した日経グループ横断の競技型 AWS 学習イベント「Nikkei Group AWS GameDay」の紹介/mediajaws202411
nikkei_engineer_recruiting
1
170
Security-JAWS【第35回】勉強会クラウドにおけるマルウェアやコンテンツ改ざんへの対策
4su_para
0
180
テストコード品質を高めるためにMutation Testingライブラリ・Strykerを実戦導入してみた話
ysknsid25
7
2.7k
日経電子版のStoreKit2フルリニューアル
shimastripe
1
140
適材適所の技術選定 〜GraphQL・REST API・tRPC〜 / Optimal Technology Selection
kakehashi
1
700
第1回 国土交通省 データコンペ参加者向け勉強会③- Snowflake x estie編 -
estie
0
130
OCI Security サービス 概要
oracle4engineer
PRO
0
6.5k
Featured
See All Featured
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
25
1.8k
Six Lessons from altMBA
skipperchong
27
3.5k
Making Projects Easy
brettharned
115
5.9k
GraphQLとの向き合い方2022年版
quramy
43
13k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
229
52k
For a Future-Friendly Web
brad_frost
175
9.4k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
900
Git: the NoSQL Database
bkeepers
PRO
427
64k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
0
110
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
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 下課囉 \(. _ .)>