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.2k
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
540
Reverse Engineering - 3
ljptw
0
440
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
37
Binary Exploitation - Heap
ljptw
1
120
Binary Exploitation - Basic
ljptw
1
93
Other Decks in Technology
See All in Technology
プロダクト成長に対応するプラットフォーム戦略:Authleteによる共通認証基盤の移行事例 / Building an authentication platform using Authlete and AWS
kakehashi
1
150
なんで、私がAWS Heroに!? 〜社外の広い世界に一歩踏み出そう〜
minorun365
PRO
6
1.1k
AWS CodePipelineでコンテナアプリをデプロイした際に、古いイメージを自動で削除する
smt7174
1
100
「 SharePoint 難しい」ってよく聞くけど、そんなに言うなら8歳の息子に試してもらった
taichinakamura
1
630
ネット広告に未来はあるか?「3rd Party Cookie廃止とPrivacy Sandboxの効果検証の裏側」 / third-party-cookie-privacy
cyberagentdevelopers
PRO
1
130
Datachain会社紹介資料(2024年11月) / Company Deck
datachain
3
16k
Shift-from-React-to-Vue
calm1205
3
1.3k
AIを駆使したゲーム開発戦略: 新設AI組織の取り組み / sge-ai-strategy
cyberagentdevelopers
PRO
1
130
【若手エンジニア応援LT会】AWS Security Hubの活用に苦労した話
kazushi_ohata
0
170
新R25、乃木坂46 Mobileなどのファンビジネスを支えるマルチテナンシーなプラットフォームの全体像 / cam-multi-cloud
cyberagentdevelopers
PRO
1
130
とあるユーザー企業におけるリスクベースで考えるセキュリティ業務のお話し
4su_para
3
330
チームを主語にしてみる / Making "Team" the Subject
ar_tama
4
310
Featured
See All Featured
The Invisible Side of Design
smashingmag
297
50k
Become a Pro
speakerdeck
PRO
24
5k
The Cult of Friendly URLs
andyhume
78
6k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
Mobile First: as difficult as doing things right
swwweet
222
8.9k
Being A Developer After 40
akosma
86
590k
Ruby is Unlike a Banana
tanoku
96
11k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
7
150
Why You Should Never Use an ORM
jnunemaker
PRO
53
9k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.8k
Product Roadmaps are Hard
iamctodd
PRO
48
10k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
43
6.6k
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 下課囉 \(. _ .)>