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 0x1@HackerSir 10th
Search
YJK
August 31, 2024
0
2
Reverse 0x1@HackerSir 10th
YJK
August 31, 2024
Tweet
Share
More Decks by YJK
See All by YJK
你 PWN 不動我@HackerSir 10th
yjk0805
0
2
Reverse 0x2@HackerSir 10th
yjk0805
0
2
不要亂 PWN 我@HackerSir 10th
yjk0805
0
5
Assembly@HackerSir 10th
yjk0805
0
5
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
0
97
Side Projects
sachag
452
42k
Music & Morning Musume
bryan
46
6.2k
YesSQL, Process and Tooling at Scale
rocio
169
14k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Why Our Code Smells
bkeepers
PRO
334
57k
How to train your dragon (web standard)
notwaldorf
88
5.7k
How to Think Like a Performance Engineer
csswizardry
20
1.1k
Done Done
chrislema
181
16k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
Transcript
Reverse Basic YJK @ HackerSir 12/06
What is Reverse Engineering Outline 01 04 02 03 Before
Reverse How to Prevent How to Analysis 05 Analysis Tool
Before Reverse
前置知識 • 基礎 C/C++ 語法 (迴圈、陣列、指標…) • 一點點演算法知識 • 基礎組合語言
What is Reverse Engineering
What is Reverse Engineering • 逆向工程 • 在沒有原始碼的時候分析程式行為 • PWN
(Binary Exploitation) 的基礎
Why Reverse Engineering • 惡意程式分析 (ex: WannaCry) • 軟體分析 (ex:
TikTok) • 開發插件 • 挖掘漏洞 • 遊戲外掛 • 盜版軟體 • Keygen
How to Prevent
How to prevent • 加密 • 加殼 • 誤導 •
混淆程式碼 • 提高更新頻率
加殼 • 壓縮殼 • 將 code 壓縮 • 要執行時才解壓縮並執行 •
UPX
加殼 • VM 殼 • 實作一台 VM (Virtual Machine) •
將原始程式變成給 VM 跑的程式 • 逆完整個 VM
查殼 • DIE (Detect it easy) • 查脫殼工具或自己脫殼
混淆程式碼 • 指令替換 • 程式碼邏輯混淆 • 偽造控制流程 • OLLVM
混淆程式碼 • Demo: CGGC - ollvmvm
How to Reverse
How to Reverse source
How to Reverse Static Analysis Dynamic Analysis • 不執行程式 •
Decompile 執行檔分析資訊 • 分析各函式及程式碼 • 執行程式並觀察程式行為 • 觀察執行程式可能改變的值 • 記憶體、變數、底層資訊
Static Analysis Tool
Static Analysis Tool & Command objdump • disassemble 執行檔 •
顯示 object file 資訊 readelf • ELF 檔的資訊 • headers、segments… ltrace • 追蹤使用函式庫 strace • 追蹤 system call 和 signal strings • 列出檔案中所有可視字元 file • 查看檔案類型
Static Analysis Tool IDA Pro • 非常貴 • 很強大 •
IDA Free Ghidra • Java • 開源 • NSA 開發 Radare2 • 開源 • CLI • Cutter (GUI) binary ninja • 比 IDA Free 可以逆更多檔案 • cloud version dnSpy • .NET 架構 Apktool • .apk Bytecode-Viewer • .class
Static Analysis
Static Analysis • 靜態分析 • 注重 code review • 瞭解程式執行過程
• 看懂自己不一定熟悉的語言執行過程
Static Analysis • 嘗試解讀以下程式
objdump • Disassemble (反組譯)執行檔 • sudo apt install binutils •
objdump <option(s)> <file(s)> • Ex: objdump –M intel –d a.out
objdump • objdump –M intel –d a.out • -M, --disassembler-options=OPT
• 自定義反組譯,例如自訂語法
objdump • objdump –M intel –d a.out • -d, --disassemble
• 指定檔案路徑
objdump • objdump –M intel –d a.out • 反組譯 a.out
並以 intel 格式輸出
Disassemble vs Decompile Disassemble • 反組譯 • 執行檔 -> assembly
Decompile • 反組譯 • 執行檔 -> source code
ltrace • 跟蹤程式使用的函數 • sudo apt install ltrace • ltrace
./a.out
strace • 追蹤 system call 和 signal • sudo apt
install strace • strace ./a.out
strings • 列出檔案中所有可視字元 • 常搭配 grep 使用 • sudo apt
install binutils • strings [option(s)] [file(s)] • ex: strings a.out
strings • 列出檔案中所有可視字元 • 常搭配 grep 使用 • sudo apt
install binutils • strings [option(s)] [file(s)] • ex: strings a.out | grep "HackerSir"
file • 查看檔案類型 • file [OPTION...] [FILE...] • ex: file
a.out
C++ name mangling • name decoration • 解決不能使用跟 C library
一樣函數名稱 (參數或型態不同) • 編譯器區分不同同名函式,必須對符號修改 • C++ 加入 namespace 解決
C++ name mangling rule • g++ 規則 • 都由 "_Z"
開頭 • 巢狀名稱會在 "_Z" 後面加上 "N“ • 接著為字串長度 + 名稱 • 最後面加上 "E" (巢狀才加) 再加上 data type • ex: N::func(int, int) -> _ZN1N4funcEii
c++filt • demangling 可以使用 c++filt • sudo apt install binutils
• c++filt [options] [mangled names] • ex: c++filt _Z4funcdd
Practice • basic command • C++ mangle
IDA
IDA • 曼特農夫人 • 今天用的是 free 版 • Pro 版是很強大的逆向工具
• 反組譯成 asm • 反編譯成 C 語言
How to use IDA • 選取要 decompile 的檔案 • 按下鍵盤上的
F5 • 神奇的事情發生了
IDA - Strings • 功能跟 strings command 相同 • 按下
shift + F12
IDA - XREF • Cross Reference • 查看 function 被呼叫的地⽅
IDA - XREF • Cross Reference • 查看 function 被呼叫的地⽅
• 選取欲查看之 function • 按下 x 或按右鍵選取 Jump to xref
IDA - 修改變數名稱 • 選許要修改的變數 • 按下 n 或是按下滑鼠右鍵選取 rename
lvar
IDA - 型態轉換 • 鼠標停在數字或變數上會發現它的型態 • 數字也可能是字元
IDA - 型態轉換 • 鼠標停在數字或變數上會發現它的型態 • 數字也可能是字元 • 對要轉換的目標值按右鍵 •
選取想要顯示的型態
IDA - 誤判解決 • IDA 可能會誤判 function 回傳型態、參數,可以自行修改
IDA - 誤判解決 • IDA 可能會誤判 function 回傳型態、參數,可以自行修改 • 選取要修改的
function • 按下 y 或是滑鼠右鍵選取 set item type
Practice • IDAbasic
解題流程
How to solve a problem • 先用 file command 確認檔案類型
• 選定 decompile 軟體 • Code review • 將變數更改成可讀性高的名稱
Get Flag • 執行程式依照逆向結果熟知流程拿到 Flag • 直接發現有後門拿到 Flag • 直接發現靜態分析可以拿到產出
Flag 的規則
Practice • Game • FlagGenerater
Next • Dynamic Analysis • 更多 Reverse Engineering 的技巧 &
工具
None