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
What's in a price? How to price your products and services
michaelherold
243
12k
Java REST API Framework Comparison - PWX 2021
mraible
28
8.3k
Agile that works and the tools we love
rasmusluckow
328
21k
Building Adaptive Systems
keathley
38
2.3k
Why Our Code Smells
bkeepers
PRO
335
57k
Reflections from 52 weeks, 52 projects
jeffersonlam
347
20k
Code Review Best Practice
trishagee
65
17k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
127
18k
The Language of Interfaces
destraynor
154
24k
A Tale of Four Properties
chriscoyier
157
23k
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