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 - 1
Search
LJP-TW
January 20, 2022
Technology
0
1.3k
Reverse Engineering - 1
NYCU Secure Programming 2021 Fall
LJP-TW
January 20, 2022
Tweet
Share
More Decks by LJP-TW
See All by LJP-TW
Reverse Engineering - 2
ljptw
0
550
Reverse Engineering - 3
ljptw
0
460
Re:0 從零開始的逆向工程
ljptw
1
760
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
98
Other Decks in Technology
See All in Technology
日本版とグローバル版のモバイルアプリ統合の開発の裏側と今後の展望
miichan
1
130
コンテナセキュリティのためのLandlock入門
nullpo_head
2
320
OpenAIの蒸留機能(Model Distillation)を使用して運用中のLLMのコストを削減する取り組み
pharma_x_tech
4
560
マイクロサービスにおける容易なトランザクション管理に向けて
scalar
0
140
LINEスキマニにおけるフロントエンド開発
lycorptech_jp
PRO
0
330
祝!Iceberg祭開幕!re:Invent 2024データレイク関連アップデート10分総ざらい
kniino
3
300
マルチプロダクト開発の現場でAWS Security Hubを1年以上運用して得た教訓
muziyoshiz
3
2.4k
re:Invent をおうちで楽しんでみた ~CloudWatch のオブザーバビリティ機能がスゴい!/ Enjoyed AWS re:Invent from Home and CloudWatch Observability Feature is Amazing!
yuj1osm
0
130
LINEヤフーのフロントエンド組織・体制の紹介【24年12月】
lycorp_recruit_jp
0
530
.NET 9 のパフォーマンス改善
nenonaninu
0
1k
あの日俺達が夢見たサーバレスアーキテクチャ/the-serverless-architecture-we-dreamed-of
tomoki10
0
460
10分で学ぶKubernetesコンテナセキュリティ/10min-k8s-container-sec
mochizuki875
3
350
Featured
See All Featured
XXLCSS - How to scale CSS and keep your sanity
sugarenia
247
1.3M
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
127
18k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
32
2.7k
Navigating Team Friction
lara
183
15k
Java REST API Framework Comparison - PWX 2021
mraible
28
8.3k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
2k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
0
98
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
How to train your dragon (web standard)
notwaldorf
88
5.7k
Transcript
Reverse Engineering - 1 2021/11/19 Presented by LJP
# whoami • LJP / LJP-TW • SQLab @ NYCU
碩一 • CTF @ 10sec / TSJ • Pwner 2
Outline • 逆向工程 What / Why / How • x86
• Tools • Calling Convention • C -> x86 • Stack Frame 3 • Struct • Endian • Where to start? • Compiler Optimization • ASLR
逆向工程 What / Why / How 4
5
逆向工程 What / Why • What: • 順向工程: 把想法變成 code,
再把 code 變成程式 • 逆向工程: 用一些手段把程式變回 code, 再看懂作者的想法 • 這樣單純看 code 算不算逆向 (? • Why: • 沒有 source code 還想知道程式在做什麼 • 阿是怎樣逆 6
逆向工程 How 7
逆向工程 How • 靜態分析 • 不把程式跑起來, 解析程式檔案 • 反組譯/反編譯, 使用人腦進行
debug • IDA、 Ghidra、 PE-Bear、 readelf、 objdump 8
逆向工程 How • 動態分析 • 把程式跑起來, 觀察他的行為 • 在程式設定中斷點, 觀察程式暫存器/記憶體/…
• 用工具紀錄程式行為 e.g. 開檔案/網路連線/… • Windbg preview、 x64dbg、 gdb 9
本堂課的設定… • 程式底層運作原理不同, 逆向手段/需要的工具也不同 • Java • .NET (e.g. C#,
C++/CLI) • CPU 指令集不同就差更多了 • 本堂課主要講由 C / C++ 寫成的程式, 指令集為 x86 • 接下來講講 x86 10
x86 11
x86 暫存器 • 通用暫存器 (General-Purpose Registers) 12 AH AL 7
8 0 15 16 31 32 63 16-bit 32-bit 64-bit AX EAX RAX BH BL CH CL DH DL BP SP SI DI BX EBX RBX CX ECX RCX DX EDX RDX BP EBP RBP SP ESP RSP SI ESI RSI DI EDI RDI Base Pointer Stack Pointer
x86 暫存器 • 指令暫存器 • Instruction Pointer Register • 或稱
Program Counter • 存放下一條指令的位址 13 IP 0 15 16 31 32 63 16-bit 32-bit 64-bit IP EIP RIP
x86 暫存器 • EFLAGS 14
x86 暫存器 • EFLAGS 15
x86 指令 16 Intel syntax AT&T syntax
x86 指令 17
x86 指令 18
x86 指令 19
x86 指令 20
x86 指令 21
x86 指令 22 Jump quick ref: http://unixwiz.net/techtips/x86-jumps.html
x86 指令 Linux System Call • rax syscall (rdi, rsi,
rdx, r10, r8, r9) 23 Ref: https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md#x86_64-64_bit
x86 指令 Linux System Call • eax int 0x80 (ebx,
ecx, edx, esi, edi, ebp) 24 Ref: https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md#x86-32_bit
x86 指令 Linux System Call 25 Ref: https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md#x86_64-64_bit
x86 指令 • 遇到沒看過的就菇狗關鍵字 “x86 <指令>” 26
Tools IDA / gdb 27
Tools - IDA • 靜態分析工具 • 反組譯 • 反編譯 •
Cross References (Xrefs) • 函數 / 變數改名 • 註解 • 定義 struct • 內建 python API 可以通過腳本做事 • 各種 plug-in 28
Tools - IDA • 常用快捷鍵 • Space: 在 Text View
/ Graph View 切換 • Tab: 在視窗之間切換 • ; / Insert: 註解 • x: 秀出 Xrefs • n: 改名 • y: 改型別 • h: 改表示方式 (dec / hex) • u: 取消定義 • a: 當成字串 29
30 DEMO
Tools - gdb • 動態分析工具 • 設定中斷點 • 執行程式 •
查看記憶體 / 暫存器 • 查看 address space 31
Tools - gdb • 常用語法 • b: 設定中斷點 • r:
執行程式 • c: 繼續執行 • si: 步入指令 • ni: 步過指令 • x: 顯示記憶體內容 • vmmap: 查看 address space 32
33 DEMO
Tools • 工具主要就分成這兩類 • 靜態分析工具 • 動態分析工具 • 同一類工具的功能大同小異, 順手最重要
34
Lab 1 35
Calling Convention 36
Calling Convention • 約定了呼叫函數時如何傳遞參數 • x64 • Windows • Function(rcx,
rdx, r8, r9) • Linux • Function(rdi, rsi, rdx, rcx, r8, r9) • 多的放 stack • x32 • 都放 stack 37
Calling Convention 38 x86-64
Calling Convention 39 x86
C -> x86 40
C -> x86 • 前面的程式都是手寫的組語 • 這個章節來看一下 C 編出來的組語 41
C -> x86 42
C -> x86 43 For security 無運算意義
C -> x86 44 For security 無運算意義 Stack Frame Prologue
(下個章節講)
C -> x86 45 For security 無運算意義 Stack Frame Prologue
(下個章節講)
C -> x86 46 For security 無運算意義 Stack Frame Prologue
(下個章節講)
C -> x86 47 For security 無運算意義 Stack Frame Prologue
(下個章節講)
C -> x86 48 For security 無運算意義 Stack Frame Prologue
(下個章節講)
C -> x86 49 For security 無運算意義 Stack Frame Prologue
(下個章節講)
C -> x86 50 For security 無運算意義 Stack Frame Prologue
(下個章節講) Stack Frame Epilogue (下個章節講)
C -> x86 51 For security 無運算意義 Stack Frame Prologue
(下個章節講)
C -> x86 52 For security 無運算意義 Stack Frame Prologue
(下個章節講) 大於才會進
C -> x86 53
C -> x86 54
C -> x86 55
C -> x86 56 Stack Frame Epilogue (下個章節講)
C -> x86 • 小總結 • 目前為止, 除了和 Stack Frame
相關的組語, 應該都能看懂了 • if 會往前跳; 迴圈會往回跳 57
Stack Frame 58
Stack Frame • Q1: 函數都是以 RSP 或 RBP 來定位區域變數, 那怎麼區別不同函
數的區域變數? • Q2: 呼叫函數後, RIP 就從 A 函數跑到 B 函數了, 要怎麼 return 回 A 函數? • 如果不知道答案, 那你就需要看一下這章 59
Stack Frame • 不同區域會有不同的 Stack Frame • 裡面存放著區域變數 • 在
Function 的頭部和尾部, 有一些用來處理 Stack Frame 的指令 • 頭部: Prologue • 尾部: Epilogue 60 push rbp mov rbp, rsp … leave ret main
Stack Frame 61 RSP 0x00007fffffffe5c8 push rbp mov rbp, rsp
sub rsp, 20h … call function1 leave ret main push rbp mov rbp, rsp sub rsp, 30h … leave ret function1 Stack
Stack Frame 62 RSP 0x00007fffffffe5c8 push rbp mov rbp, rsp
sub rsp, 20h … call function1 leave ret main push rbp mov rbp, rsp sub rsp, 30h … leave ret function1 Stack
Stack Frame 63 0x00007fffffffe5c8 push rbp mov rbp, rsp sub
rsp, 20h … call function1 leave ret main push rbp mov rbp, rsp sub rsp, 30h … leave ret function1 RSP RBP 原本的值 0x00007fffffffe5c0 Stack
Stack Frame 64 0x00007fffffffe5c8 push rbp mov rbp, rsp sub
rsp, 20h … call function1 leave ret main push rbp mov rbp, rsp sub rsp, 30h … leave ret function1 RSP RBP 原本的值 0x00007fffffffe5c0 Stack RBP
Stack Frame 65 0x00007fffffffe5c8 push rbp mov rbp, rsp sub
rsp, 20h … call function1 leave ret main push rbp mov rbp, rsp sub rsp, 30h … leave ret function1 RBP 原本的值 0x00007fffffffe5c0 Stack RBP RSP 0x00007fffffffe5a0 Main Stack Frame
Stack Frame 66 0x00007fffffffe5c8 push rbp mov rbp, rsp sub
rsp, 20h … call function1 leave ret main push rbp mov rbp, rsp sub rsp, 30h … leave ret function1 RBP 原本的值 0x00007fffffffe5c0 Stack RBP RSP 0x00007fffffffe5a0 0x401234 Main Stack Frame
Stack Frame 67 0x00007fffffffe5c8 push rbp mov rbp, rsp sub
rsp, 20h … call function1 leave ret main push rbp mov rbp, rsp sub rsp, 30h … leave ret function1 RBP 原本的值 0x00007fffffffe5c0 Stack RBP RSP 0x00007fffffffe5a0 0x401234 0x401234 Main Stack Frame 0x00007fffffffe598
Stack Frame 68 0x00007fffffffe5c8 push rbp mov rbp, rsp sub
rsp, 20h … call function1 leave ret main push rbp mov rbp, rsp sub rsp, 30h … leave ret function1 RBP 原本的值 0x00007fffffffe5c0 Stack RBP RSP 0x00007fffffffe5a0 0x401234 0x401234 Main Stack Frame 0x00007fffffffe598 0x00007fffffffe5c0 0x00007fffffffe590
Stack Frame 69 0x00007fffffffe5c8 push rbp mov rbp, rsp sub
rsp, 20h … call function1 leave ret main push rbp mov rbp, rsp sub rsp, 30h … leave ret function1 RBP 原本的值 0x00007fffffffe5c0 Stack RBP RSP 0x00007fffffffe5a0 0x401234 0x401234 Main Stack Frame 0x00007fffffffe598 0x00007fffffffe5c0 0x00007fffffffe590
Stack Frame 70 0x00007fffffffe5c8 push rbp mov rbp, rsp sub
rsp, 20h … call function1 leave ret main push rbp mov rbp, rsp sub rsp, 30h … leave ret function1 RBP 原本的值 0x00007fffffffe5c0 Stack RBP RSP 0x00007fffffffe5a0 0x401234 0x401234 Main Stack Frame 0x00007fffffffe598 0x00007fffffffe5c0 0x00007fffffffe590 0x00007fffffffe560 Function1 Stack Frame
Stack Frame 71 0x00007fffffffe5c8 push rbp mov rbp, rsp sub
rsp, 20h … call function1 leave ret main push rbp mov rbp, rsp sub rsp, 30h … leave ret function1 RBP 原本的值 0x00007fffffffe5c0 Stack RBP RSP 0x00007fffffffe5a0 0x401234 0x401234 Main Stack Frame 0x00007fffffffe598 0x00007fffffffe5c0 0x00007fffffffe590 0x00007fffffffe560 Function1 Stack Frame leave = mov rsp, rbp pop rbp
Stack Frame 72 0x00007fffffffe5c8 push rbp mov rbp, rsp sub
rsp, 20h … call function1 leave ret main push rbp mov rbp, rsp sub rsp, 30h … leave ret function1 RBP 原本的值 0x00007fffffffe5c0 Stack 0x00007fffffffe5a0 0x401234 0x401234 Main Stack Frame 0x00007fffffffe598 0x00007fffffffe5c0 0x00007fffffffe590 0x00007fffffffe560 Function1 Stack Frame leave = mov rsp, rbp pop rbp RSP RBP
Stack Frame 73 0x00007fffffffe5c8 push rbp mov rbp, rsp sub
rsp, 20h … call function1 leave ret main push rbp mov rbp, rsp sub rsp, 30h … leave ret function1 RBP 原本的值 0x00007fffffffe5c0 Stack 0x00007fffffffe5a0 0x401234 0x401234 Main Stack Frame 0x00007fffffffe598 0x00007fffffffe5c0 0x00007fffffffe590 0x00007fffffffe560 Function1 Stack Frame leave = mov rsp, rbp pop rbp RBP RSP
Stack Frame 74 0x00007fffffffe5c8 push rbp mov rbp, rsp sub
rsp, 20h … call function1 leave ret main push rbp mov rbp, rsp sub rsp, 30h … leave ret function1 RBP 原本的值 0x00007fffffffe5c0 Stack 0x00007fffffffe5a0 0x401234 0x401234 Main Stack Frame 0x00007fffffffe598 0x00007fffffffe5c0 0x00007fffffffe590 0x00007fffffffe560 Function1 Stack Frame leave = mov rsp, rbp pop rbp RSP
Stack Frame • 統整一下 75 Stack RSP 上層函數的 Stack Frame
RBP Return Address … Old RBP 目前函數的 Stack Frame Old RBP 0 0x00007fffffffffff
Stack Frame • Q1: 函數都是以 RSP 或 RBP 來定位區域變數, 那怎麼區別不同函
數的區域變數? • A1: 想辦法讓不同函數的 stack 區域不同 • Q2: 呼叫函數後, RIP 就從 A 函數跑到 B 函數了, 要怎麼 return 回 A 函數? • A2: 在呼叫 B 函數前把下一條指令 push 進 stack B 函數執行 ret 把 A 函數下一條指令從 stack pop 回 rip 進而回到 A 函數 76
Struct 77
Struct 78
Struct 79
Struct 80 name data name id 可以觀察到 compiler 將 RSP
+ 0x70 的位址當 id RSP + 0x74 的位址當 name 起始位址 將 RSP + 0x80 當 data 0 3 4 7 8 b c f 0x70 0x80 name d e
Struct 81 name data name id 有兩 Byte 沒有用到 0
3 4 7 8 b c f 0x70 0x80 name d e
Struct • Struct alignment 82
Endian 83
Endian • Byte 的順序 • 一個整數 0x12345678, 兩種儲存方式 84 0x78
0x56 0x34 0x12 0x12 0x34 0x56 0x78 3 2 1 0 3 2 1 0 Little Endian Big Endian
Endian • 常見是用 Little Endian • 將 int 0x12345678 轉成
short 0x5678, 起始位址不用改變 85 0x78 0x56 0x34 0x12 3 2 1 0 Little Endian int short byte
Lab 2 86
Where to start? 87
main ? • 程式的第一條指令就是 main 嗎? 其實不是 • 其實有辦法讓某些程式碼比 main
還要早執行 • 想一下 C++, 全域物件的初始化是不是要比 main 還要早執行 88
__libc_start_main 89
INIT / FINI • 用 readelf 觀察一下 90
INIT / FINI • 用 IDA 觀察一下 91
Where to start? • Init / fini 函數指針放在一個 array 中
• 並會在初始 / 結束階段呼叫到 • .init_array / .fini_array • 有機會藏 code 的地方, 需另外注意一下 92
Compiler Optimization 93
Compiler Optimization • Compiler 想方設法優化編出來的 code, 使其跑更快 • e.g. 能先跑完算完的
code 直接算完 94
Compiler Optimization • idiv 很慢, 右邊雖然指令數較多但還比較快 (較暗區段為無關的指令) • 所以右邊那坨是什麼鬼 =
= 95
Compiler Optimization • 原本除法改成 • 可以先算完 (取 ceil) • 乘完
a 後, 用右移完成 • a 若是負數, 則需加一 96
Compiler Optimization • 原本除法改成 • 可以先算完 (取 ceil) • 乘完
a 後, 用右移完成 • a 若是負數, 則需加一 97
Compiler Optimization • 原本除法改成 • 可以先算完 (取 ceil) • 乘完
a 後, 用右移完成 • a 若是負數, 則需加一 98
Compiler Optimization • 原本除法改成 • 可以先算完 (取 ceil) • 乘完
a 後, 用右移完成 • a 若是負數, 則需加一 99
Compiler Optimization • 原本除法改成 • 可以先算完 (取 ceil) • 乘完
a 後, 用右移完成 • a 若是負數, 則需加一 100
ASLR 101
ASLR • Address Space Layout Randomization • 使 library 的
base address 是隨機的 • 使得漏洞利用更加困難 102
ASLR • 在 gdb 中可以用指令關閉 ASLR 後再 debug • set/show
disable-randomization 103
ASLR • gef 簡化成 aslr 指令 104
ASLR • 把 ASLR 啟用後, 觀察記憶體空間 • 會發現每次執行時, 記憶體位址都不太一樣 105
ASLR • Linux 怎麼關 ASLR? • System-wide • /proc/sys/kernel/randomize_va_space •
sudo sysctl kernel.randomize_va_space=0 • Non-system-wide • Syscall personality: ADDR_NO_RANDOMIZE 106
Lab 3 107
108 Q & A
109 下課囉 \(. _ .)>