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
6
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
8
Basic Reverse-逆要做什麼@THUHC
yjk0805
0
14
Reproducing Vulnerability in IoT@HackerSir StudyGroup
yjk0805
0
21
你 PWN 不動我@HackerSir 10th
yjk0805
0
11
Reverse 0x1@HackerSir 10th
yjk0805
0
13
Reverse 0x2@HackerSir 10th
yjk0805
0
9
不要亂 PWN 我@HackerSir 10th
yjk0805
0
14
Assembly@HackerSir 10th
yjk0805
0
11
Featured
See All Featured
Six Lessons from altMBA
skipperchong
28
3.9k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.8k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
The Cult of Friendly URLs
andyhume
79
6.5k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.7k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.5k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
124
52k
How to train your dragon (web standard)
notwaldorf
94
6.1k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
800
Building an army of robots
kneath
306
45k
Navigating Team Friction
lara
187
15k
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