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
450
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
強いチームと開発生産性
onk
PRO
35
11k
『Firebase Dynamic Links終了に備える』 FlutterアプリでのAdjust導入とDeeplink最適化
techiro
0
130
SREが投資するAIOps ~ペアーズにおけるLLM for Developerへの取り組み~
takumiogawa
1
430
Zennのパフォーマンスモニタリングでやっていること
ryosukeigarashi
0
150
Taming you application's environments
salaboy
0
190
ExaDB-D dbaascli で出来ること
oracle4engineer
PRO
0
3.9k
rootlessコンテナのすゝめ - 研究室サーバーでもできる安全なコンテナ管理
kitsuya0828
3
390
リンクアンドモチベーション ソフトウェアエンジニア向け紹介資料 / Introduction to Link and Motivation for Software Engineers
lmi
4
300k
Lexical Analysis
shigashiyama
1
150
ノーコードデータ分析ツールで体験する時系列データ分析超入門
negi111111
0
420
ISUCONに強くなるかもしれない日々の過ごしかた/Findy ISUCON 2024-11-14
fujiwara3
8
870
【Startup CTO of the Year 2024 / Audience Award】アセンド取締役CTO 丹羽健
niwatakeru
0
1.3k
Featured
See All Featured
Writing Fast Ruby
sferik
627
61k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
44
2.2k
Designing Experiences People Love
moore
138
23k
How GitHub (no longer) Works
holman
310
140k
Docker and Python
trallard
40
3.1k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.8k
Designing on Purpose - Digital PM Summit 2013
jponch
115
7k
Side Projects
sachag
452
42k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
27
840
Facilitating Awesome Meetings
lara
50
6.1k
The Invisible Side of Design
smashingmag
298
50k
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 下課囉 \(. _ .)>