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
不要亂 PWN 我@HackerSir 10th
Search
YJK
August 31, 2024
0
6
不要亂 PWN 我@HackerSir 10th
YJK
August 31, 2024
Tweet
Share
More Decks by YJK
See All by YJK
你 PWN 不動我@HackerSir 10th
yjk0805
0
4
Reverse 0x1@HackerSir 10th
yjk0805
0
5
Reverse 0x2@HackerSir 10th
yjk0805
0
3
Assembly@HackerSir 10th
yjk0805
0
5
Featured
See All Featured
Optimising Largest Contentful Paint
csswizardry
33
3k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Building Your Own Lightsaber
phodgson
103
6.1k
Optimizing for Happiness
mojombo
376
70k
VelocityConf: Rendering Performance Case Studies
addyosmani
326
24k
Done Done
chrislema
181
16k
Agile that works and the tools we love
rasmusluckow
328
21k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
Statistics for Hackers
jakevdp
796
220k
A better future with KSS
kneath
238
17k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
29
2k
The Invisible Side of Design
smashingmag
298
50k
Transcript
不要亂 PWN 我 YJK @ HackerSir
前置知識 • C/C++ • Reverse • Python
01 03 02 04 Introduction ELF Buffer Overflow Lazy Binding
Outline
Introduction 01 What is Binary Exploitation (PWN)
Binary Exploitation (PWN) • 透過程式漏洞控制執行流程觸發攻擊 • PWN ◦ 碰 or
胖 Start Input Output End
How to PWN ? • 尋找漏洞 ◦ 模糊測試 ◦ 原始碼
◦ 組合語言 Start Input Output aborted segmentation fault
How to PWN ? • 尋找漏洞 ◦ 模糊測試 ◦ 原始碼
◦ 組合語言 • 利用漏洞 ◦ 控制執行流程 ◦ 覆蓋 return address ◦ 修改變數
How to PWN ? • 尋找漏洞 ◦ 模糊測試 ◦ 原始碼
◦ 組合語言 • 利用漏洞 ◦ 控制執行流程 ◦ 覆蓋 return address ◦ 修改變數 ◦ Get Shell
ELF 02 Basic Concept、 Protections
ELF • Executable and Linkable Format • 可執行檔 ◦ Windows:exe
◦ Linux:ELF • Section ◦ 執行時會映射到記憶體上 ◦ .text、.bss、.data、.rodata、.got、.plt…
Session • .bss ◦ 存放未初始化的全域變數 • .data ◦ 存放初始化的全域變數 •
.rodata ◦ 存放可讀不可寫資料 • .text ◦ 存放編譯後的程式碼
Session
Protections • PIE ◦ Position-Independent Executable • NX ◦ No-Execute
• Stack Canary ◦ stack protector • RELRO ◦ Relocation Read-Only
PIE • Position-Independent Executable • code & data section map
到位址時隨機 • 開啟時,每次執行都不同,否則固定 0x400000
PIE • Position-Independent Executable • code & data section map
到位址時隨機 • 開啟時,每次執行都不同,否則固定 0x400000 • 關閉方式
ASLR • Address Space Layout Randomization • 針對 Process 的防護機制
• 動態載入位址隨機 ◦ library ◦ stack ◦ heap
ASLR • 關閉方式 ◦ 要在 root 權限下執行
NX • Data Execution Prevention、No-execute • 可寫的不可執行、可執行的不可寫 • 防範 Shell
Code 問題
NX • Data Execution Prevention、No-execute • 可寫的不可執行、可執行的不可寫 • 防範 Shell
Code 問題 • 關閉方式
Stack Canary • Stack Protector • rbp 前塞 8 byte
random 值,ret 驗證是否相同 • 1st byte 為 null byte • 每次執行的值不同 • 防範 buffer overflow
Stack Canary • Stack Protector • rbp 前塞 8 byte
random 值,ret 驗證是否相同 • 1st byte 為 null byte • 每次執行的值不同 • 防範 buffer overflow • 關閉方式
RELRO • Relocation Read-Only • No / Partial / Full
• 防範 Lazy Binding 問題 Link Map GOT No O O Partial X O Full X X
RELRO • 關閉方式
Tool-checksec • 確認檔案保護
Tool-checksec
Buffer Overflow 03 Overwrite Variable、Control Flow
Buffer Overflow • 記憶體狀況 low address int num1 int num2
char buf[0x10] int num3 int num4 save rbp return address high address
Buffer Overflow • 記憶體狀況 • gets(buf) • gets 不會檢查輸入長度 low
address int num1 int num2 char buf[0x10] int num3 int num4 save rbp return address high address
Buffer Overflow • 記憶體狀況 • gets(buf) • gets 不會檢查輸入長度 •
正常輸入範圍 low address int num1 int num2 ‘A’ * 0x10 int num3 int num4 save rbp return address high address
Buffer Overflow • 記憶體狀況 • gets(buf) • gets 不會檢查輸入長度 •
Overflow!!!! low address int num1 int num2 AAAAAAAAAAAAAAAA AAAA AAAA save rbp return address high address
Overwrite Variable • 透過 buffer Overflow 控制變數 • int num3
= 0x12345678 • int num4 = 0x90abcdef low address int num1 int num2 AAAAAAAAAAAA 0x12345678 0x90abcdef save rbp return address high address
Demo
Offset • 透過 gdb 執行程式查看記憶體狀況 • 隨意輸入確定位置 • 計算 buffer
與目標位置距離
Offset • 可以發現輸入覆蓋到比較的數值 • 覆蓋的數值為 HHHHIIII • offset 為 28
Tool-pwntools
Tool-pwntools
Tool-pwntools
How to debug ?
How to debug ? • 透過 gdb.attach 到執行的 process •
開啟一個視窗,可以執行 gdb 的各種操作
Practice • BOF
Overwrite Return Address • 透過 Buffer Overflow 改變 return address
• 可以改寫到任意 address • 必須關閉 PIE
Overwrite Return Address …… AAAAAAAAAAAA AAAAAAAAAAAA AAAAAAAAAAAA AAAAAAAAAAAA shell()、win() ……
Offset buffer Return Address
Get Address
Practice • ret2code
Lazy Binding 04 GOT、GOT Hijacking
Lazy Binding • 動態連結的程式,library function 有些不會被執行 • 程式首次呼叫 function 尋找位置填入
GOT • 後續呼叫直接從 GOT 獲取位置
GOT • library 位址載入時才決定 • 編譯時無法得知 library function 位址 •
GOT 儲存 library function 的指標陣列 • 一開始不會得之真實位置,而是填入位於 plt 的 code
Lazy Binding
Lazy Binding
Lazy Binding
GOT Hijacking • 由於 Lazy Binding,GOT 可寫 • 如果可以覆蓋到 GOT
的值,下次呼叫到 function 時即 可控制將要執行的 function pointer • Ex:陣列沒驗證輸入區域、記憶體
Demo
Practice • GOT
Next • Shellcode • ROP (Return Oriented Programming)
None