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
From 0 to Shell PWN Basic
Search
YJK
June 14, 2025
0
2
From 0 to Shell PWN Basic
YJK
June 14, 2025
Tweet
Share
More Decks by YJK
See All by YJK
Master of ROP:PWN Advanced
yjk0805
0
2
Basic Reverse-逆要做什麼@THUHC
yjk0805
0
11
Reproducing Vulnerability in IoT@HackerSir StudyGroup
yjk0805
0
21
你 PWN 不動我@HackerSir 10th
yjk0805
0
8
Reverse 0x1@HackerSir 10th
yjk0805
0
9
Reverse 0x2@HackerSir 10th
yjk0805
0
8
不要亂 PWN 我@HackerSir 10th
yjk0805
0
11
Assembly@HackerSir 10th
yjk0805
0
9
Featured
See All Featured
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
45
7.3k
Designing Experiences People Love
moore
142
24k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
30
2.4k
Speed Design
sergeychernyshev
30
980
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Visualization
eitanlees
146
16k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
52
2.8k
Six Lessons from altMBA
skipperchong
28
3.8k
How to Ace a Technical Interview
jacobian
276
23k
Bash Introduction
62gerente
614
210k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
20
1.3k
StorybookのUI Testing Handbookを読んだ
zakiyama
30
5.8k
Transcript
From 0 to Shell:PWN Basic YJK @ HackerSir
Whoami • YJK • 逢甲大學黑客社學術部長 • AIS3 Junior 2024 助教
• MyFirstCTF 2024 銅質獎 • 2022 & 2023 T 貓盃資安基礎實務能力競賽 佳作 • ICPC 2023 Taoyuan Regional High Honors • Pwn & Reverse & IoT Security & 演算法
Environment • ubuntu:22.04 • 可以自己架環境 • 內含 pwndbg、pwngdb、pwntools、常用工具... • environment
01 03 02 04 Introduction ELF Buffer Overflow GOT Hijacking
Outline 05 Shellcode
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
到位址時隨機 • 開啟時,每次執行都不同,否則固定 address • 需搭配 ASLR 使用
PIE • Position-Independent Executable • code & data section map
到位址時隨機 • 開啟時,每次執行都不同,否則固定 address • 需搭配 ASLR 使用 • 關閉方式
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、GOT Hijacking 問題
RELRO • 關閉方式
Tool-checksec • 確認檔案保護 • pwntools 裡面也有
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
other vulnerable function • gets • scanf • strcpy •
sprintf • memcpy • strcat • 沒控制好 read 參數 • 涉及 memory/IO 的 function 皆有可能有狀況
Offset • 透過 gdb 執行程式查看記憶體狀況 • 隨意輸入或是透過 cyclic、cyclic_find 確定位置 •
計算 buffer 與目標位置距離
Offset • 可以發現輸入覆蓋到比較的數值 • 覆蓋的數值為 HHHHIIII • offset 為 28
Overwrite Return Address • 透過 Buffer Overflow 改變 return address
• 可以改寫到任意 address • 必須關閉 PIE 或事先 Leak PIE
Overwrite Return Address …… AAAAAAAAAAAA AAAAAAAAAAAA AAAAAAAAAAAA AAAAAAAAAAAA shell()、win() ……
Offset buffer Return Address
Get Address
Tool-pwntools
Tool-pwntools
Tool-pwntools
How to debug ?
How to debug ? • 透過 gdb.attach 到執行的 process •
開啟一個視窗,可以執行 gdb 的各種操作 • 也可以透過 tmux • context.terminal = ["tmux", "splitw", "-h"]
Practice • bof • ret2code
GOT Hijacking 04 Lazy Binding、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:陣列沒驗證輸入區域、記憶體
Practice • GOT
Shellcode 05 What is Shellcode、Linux syscall、ret2sc
C compiled into machine code • 程式編譯過程 C Code Assembly
Machine code Compiler Assembler
Shellcode • 程式編譯過程 C Code Assembly Machine code Compiler Assembler
Shellcode • 撰寫 machine code,利用漏洞執行 code • 自己寫參數後 call syscall
Syscall • System call • 跟 kernel 作溝通 • Linux
System Call Table
Syscall • System call • 跟 kernel 作溝通 • Linux
System Call Table • 常見 ◦ execve(“/bin/sh”,NULL,NULL) ◦ open、read、write
How to write Shellcode? • 自己寫 asm 並透過 pwntools 轉換
• Shellcode database • pwntools 的 shellcraft ◦ 要記得 context.arch
Practice • ret2sc • orw
ret2sc • 沒有 backdoor 可以使用 ◦ 自己寫出 backdoor • 將
shellcode 寫到全域變數 • 透過 Overflow 跳過去
ORW • 只能使用 open、read、write • 可以透過 seccomp-tools 確認
Format String 00
What is format string • printf、scanf 透過格式化傳遞參數 • scanf("%s", s);、printf("Hello,
%s\n", s); • 分別讀取格式化字串,讀取到 %s 將參數傳入解析
Format String Vulnerability • 控制格式化字串參數可以 leak 變數、stack… • 可以修改變數值 •
可以修改任意記憶體值 ◦ got hijacking
格式 • %[parameter][flags][field width][.precision][length]type
Parameter • %[parameter][flags][field width][.precision][length]type • 可以忽略 • n$ • 顯示第
n 個參數 • printf("%3$d %2$d %1$d\n", 1, 2, 3); • 3 2 1
Type • %[parameter][flags][field width][.precision][length]type • d/I、u:整數 • x/X:16 進位 •
o:10 進位 • c、s:字元、字串 • p:指標 • n:可以寫入變數
寫入資料 • %[parameter][flags][field width][.precision][length]type • printf("Hello%n\n", &a); ◦ a =
5
Vulnerability Sample
Next • ROP (Return Oriented Programming)
None