Day6-Basic buffer overflow

Lab 網址 前言 經歷了前面的許多基礎知識與工具介紹,終於來到了第一個漏洞與第一個 lab。而這個漏洞可以說是最簡單也最基本的,就是 Buffer Overflow。 介紹 首先,先來看一個簡單例子。假如一個程式宣告了一些變數及字串,記憶體中的狀態可能會是下圖的樣子: 如果對 buf 字串輸入正常大小的資料,例如這邊宣告的空間是 0x10(16 bytes),輸入 0x10 個 ‘A’,記憶體狀態可能會像下圖這樣: 然而,當使用一些不安全的函式來輸入數據時,例如 gets 函式,可能會產生問題。因為 gets 不會檢查輸入的長度,因此可能會覆蓋到 buf 後面的變數,甚至是 rbp 或 return address。以下例子顯示了覆蓋到後面變數 num3 和 num4 的情況: 如果對填入的值進行精確的編排,則可能成為如下所示的情況: 這就是最基本的 Buffer Overflow 例子。 Lab 查看以下程式原始碼 1#include<stdio.h> 2int main(){ 3 setvbuf(stdout, 0, 2, 0); 4 setvbuf(stdin, 0, 2, 0); 5 setvbuf(stderr, 0, 2, 0); 6 int a = 10; 7 printf("Please input your name: "); 8 char b[10]; 9 gets(b); 10 if(a == 0xdeadbeef){ 11 system("/bin/sh"); 12 } 13 printf("Hello, %s\n", b); 14 return 0; 15} 使用以下指令進行編譯 ...

2024-09-20 · 1 min · 213 words · YJK

Day5-How to use GDB

簡介 GDB 是 GNU Debugger 的縮寫,它是一個功能強大的 command line debug 工具,支援多種程式語言如 C、C++、Fortran 等等。當我們在進行開發時,如果程式在執行過程中發生 segmentation fault 或其他錯誤,GDB 可以幫助我們追蹤程式 crash 的原因。我們可以透過設置中斷點、檢查變數內容等,來針對特定問題進行 debug 改造? 原生的 GDB 有時候可能顯得過於簡單,缺少一些便利的視覺化工具或記憶體分析功能。因此,許多使用者會安裝外掛來補強 GDB 的功能,像是 pwndbg 或 peda 等外掛,可以讓我們更容易地看到 stack、register 等資訊,從而提高 debug 效率 使用 執行程式並設定中斷點: 在 GDB 中,我們可以使用 run 或 r 來執行程式,通常會先設定中斷點(break)在程式的某一個位置,例如 main 函式,這樣程式會在到達該點時停止執行,方便我們進行檢查。 ex: b main 在 main 函式處設置中斷點。 踩到中斷點後要繼續執行程式: 當程式停止於中斷點時,使用 continue 或 c 來繼續執行程式。 觀察 register: 當程式在中斷點停止後,我們可以使用 info 指令查看目前的 register 狀態、函式列表等資訊。例如,使用 info registers 來查看目前的 register 內容。 使用 x 指令可以檢查具體的記憶體位址,通過格式化選項來調整輸出,例如 x/2gx $rax 顯示從寄存器 rax 開始的兩個 giant word。 反組譯執行的程式: ...

2024-09-19 · 2 min · 226 words · YJK

Day4-pwntools & useful tools

前言 這篇文章整理了筆者在練習 CTF 題目時常用的工具,有些工具在後續也會頻繁使用。另外,如果你有興趣一起跟著文章進行練習,可以使用文中提供的 Docker 環境,裡面已經包含了後續教學中會使用到的工具,此 repo 包含後面的題目及環境 環境 Dockerfile F M R R R R R R R R R R R R R R R R U R R R R R R R R R R R R R R U # E E C R A U U U U U U U U U U U U U U U U S U U U U U U U U U U U U U U S X N M O I N N N N N N N N N N N N N N N N E N N N N N N N N N N N N N N E r P T D M N R R u O R T a y a a a a a a a p g g m e s e g c g c r e e e e e e e e e n S Y [ u A p e p p p p p p p i e e k c e c r i d i p m c c c c c c c c c r E P " b I t s t t t t t t t p m m d h d h o t t h h h h h h h h h o t O / u N - - - - - - - - 3 i o o o ~ ~ - o o o o o o o o o o h 2 I u n E g | g g g g g g g i i r - t c / c / r t e 2 N s t R e e e e e e e e i n n ' i ' l p l P f " " " " " " " " " T r u t u t t t t t t t n s s P % o w o w s s s d p i a e e s / : Y n s t t v e ' s n n n n ~ o o e y m n n n e [ s 2 J u m i i i i i i i t a a a r s u e d e g u u u f t p g d d r " b 2 K p i n n n n n n n a l l r m / d b d . r r r i h o e " " v / i . d n s s s s s s s l l l / i n o h g h b g c c c n o r l i u n 0 a i t t t t t t t l r t u t t / d e e e e n t h c s / 4 t m a a a a a a a s o u E l A t & t . b " e e r s e i l l l l l l l p e n n m l L p & p g i ~ ~ ~ h a a / s z l l l l l l l w c e / p o L s s d n / / / o n p ~ ~ b h e n c _ s t k = : : b i p P P o g . / i d - - - - - - - t o g s y _ ( / i t w w w k e i . . n " y y y y y y y o m a h P s A s / n n n n - ~ l n g g / , o p d d a e L g e g i d g g r / h i d d t t o g g l c r l - g s c L i t i t b d d u . e t b b i " i p c c i u u s t e s u ) t u t g b b n g a _ i i n - n e c c b r b o t w r h p h ~ / / / " d p a n n i D i n - c l y c o o e N u . u / g p a b " n i i " " s g m 6 - a l r / O b s b d w n i g t t , ] i s d u - g d p s d n P . h . b n g n e p h b l d i e s s u A c c i g e i l " r - t b t v t l S o o n d l ~ t h - o s m i g o y l S m m i b h / ~ e - u e a l z w n e o W / / t . e . / a " t r k i d s g e s k D p s . p a g . p ] e v e b p h e ' / : w c p y p d g ( 2 e k t f ' A n w y " / b d ) r y g g i L d u " g i b " i a + - l / L b a d n i p s s + d e e ' g p b i n u u m - e b / t / t i t i t d m v y e c p x ~ n t i o n u t t / w / ~ i ~ l a l e c p n P . t / s v s t s / a / d w . g . . - i m i s m e b n g d p g p m l k s . t g g d b y d i t i e h d c d b i " b n g c b y / / / ~ b i n i g r p s s c s / . n i n e d t s o u p g i t i n p u o h m d w i t t e m n d m o n t ~ t g p e _ o e d / - a - c n r b ~ . t w p e o - s g / g o k y n n a P d o t g f u w b l r h i i t n i s s o n g h g n y n e d i n n 3 b t e c r t p o c t y p a m t p t u h e x o r n d 3 i - f p f i u p t i p l y s t h f o i n l 3 e - v i r t u a l e n v docker-compose.yml ...

2024-09-18 · 7 min · 1455 words · YJK

Day3-x86 asm

Introduction ASM 是 Assembly(組合語言)的縮寫。組合語言屬於低階語言,通常專為特定架構設計。相對於低階語言,高階語言更易於理解和使用。以下是兩者的比較: 層級 優點 缺點 範例 高階語言 易學易懂、除錯容易 執行效率較低、佔用記憶體較多 C、C++、Python 低階語言 執行效率高、速度快 相容性差、不易維護 組合語言、機器語言 學習組合語言的原因之一是許多程式語言在執行前會先編譯成機器語言。儘管近年來的 PWN 題目通常會提供程式碼,但如果要挖掘漏洞或檢測產品韌體,仍需要進行程式碼的逆向分析。因此,我們會將編譯好的程式反組譯成組合語言,以便閱讀和理解。以下是一個 C 程式編譯過程的流程圖: 你需要知道的 ASM Registers Flags Sections Instructions Stack frame Calling Convention Registers(暫存器) 暫存器是處理運算時暫存數值的地方,具有讀寫速度快的特性。根據資料型態大小,暫存器可以分為以下四種: QWORD: 64 bits, Quad Word DWORD: 32 bits, Double Word WORD: 16 bits BYTE: 8 bits 根據功能,暫存器又可以分為以下四種: 名稱 功用 通用暫存器 運算、計數 區段暫存器 指向記憶體區段 指標暫存器 指向堆疊或陣列 旗標暫存器 紀錄狀態(進位、溢位等) 通用暫存器 Register AX、BX、CX、DX、DI、SI、BP、SP R8 ~ R15 64 bit 前綴加 R,例如:RAX、RDI 前綴加 R,例如:R8、R9 32 bit 前綴加 E,例如:EAX、EDI;後綴加 D,例如:R8D、R9D 前綴加 E,例如:EAX、EDI;後綴加 D,例如:R8D、R9D 16 bit 無變化,例如:AX、DI;後綴加 W,例如:R8W、R9W 無變化,例如:AX、DI;後綴加 W,例如:R8W、R9W 8 bit 後綴加 X(X 可替換為 H/L),例如:AH、BL、DIL、BPL;後綴加 B,例如:R8B、R9B 後綴加 X(X 可替換為 H/L),例如:AH、BL、DIL、BPL;後綴加 B,例如:R8B、R9B 區段暫存器 名稱 作用 CS 指向 Code Segment DS 指向 Data Segment SS 指向 Stack Segment ES、FS、GS 指向 Data Segment(選擇性使用) 指標暫存器 名稱 作用 SP Stack Pointer,指向 stack 頂端 BP Base Pointer,指向 stack 的任何位置 IP 指向目前執行指令的地址 SI Source Index,指向資料來源 DI Destination Index,指向資料目的地 旗標暫存器 名稱 作用 CF Carry Flag:最高位元有進位或借位,CF = 1;否則為 0 PF Parity Flag:判斷運算後最低 8 位元的 1 的數量,奇數個 PF = 1;否則為 0 AF Auxiliary Flag:運算後第 3 位元產生進位或借位,AF = 1;否則為 0 ZF Zero Flag:運算後結果為 0,則 ZF = 1;否則為 0 SF Sign Flag:運算後,SF=1 表示負數;否則為 0 OF Overflow Flag:運算後結果溢位,OF=1;否則為 0 TF Trap Flag:用於 Debug,TF=1 時,每次執行一個指令 DF Direction Flag:字串運算,DF=0 從低位到高位;DF=1 反之 IF Interrupt Flag:IF=1 時,接受外部中斷;IF=0 則無法 語法格式 常見的格式有兩種:Intel 和 AT&T。如果有興趣,也可以使用 Compiler Explorer 將程式轉為 ASM 進行觀察。原則上,大家比較偏向使用 Intel 格式,因為它的語法接近正常的程式語言,且更易於閱讀。以下是兩種語法格式的比較: ...

2024-09-17 · 2 min · 408 words · YJK

Day2-ELF format & protection

ELF format ELF 是 Executable and Linkable Format 的縮寫,可以簡單稱為可執行檔。不同平台有不同的可執行檔格式,如 Windows 的 exe 和 Linux 的 ELF。而 ELF 檔又包含各種區段 (Section),這些區段在執行時會映射 (mapping) 到記憶體中。常見的區段包括:.text、.bss、.data、.rodata、.got、.plt 等。以下是對這些區段的介紹: .text 存放編譯後的程式碼 .bss 存放未初始化的全域變數 .data 存放初始化的全域變數 .rodata 存放可讀不可寫的資料 ex: 輸出文字 .got (Global Offset Table) 用於儲存動態鏈接 (dynamic linking) 時需要的外部函數的地址,並幫助程式在執行期間通過這些地址來訪問函數或變數。 .plt 用於動態呼叫外部函數 呼叫一個外部函數時,程式會先跳到 .plt,然後再由 .plt 透過 .got 找到實際的函數地址 以下是一段程式碼中各段落存在的區段 1#include <stdio.h> 2int a; // .bss 3int b = 100; // .data 4// .text start 5int main(){ 6 puts("Hello World!"); // .rodata 7 return 0; 8} 9// .text end 各區段皆可能成為後續內容可以利用的部分,不過目前可以先看過即可,後續講述到攻擊手法時會再進一步介紹 ...

2024-09-16 · 2 min · 339 words · YJK

Day1-Introduction to PWN & How to PWN

What is PWN? PWN 也稱為 Binary Exploitation,簡單來說,就是透過找尋程式中的漏洞,並利用這些漏洞來取得伺服器權限,或是直接使用 shell 獲取檔案,或者進行各種不同的利用。至於 PWN 的念法,有很多有趣的說法。由於 PWN 源自於 “own” 這個詞,因此有人讀作 “碰”,但也有不少人讀作 “胖”。 How to PWN? 從上面的簡單介紹可以看出,PWN 主要是透過發現程式中的漏洞,並利用這些漏洞達成我們想要的目標。那麼,應該如何找到漏洞呢?在這個過程中,我們可能會使用以下方法: 模糊測試 (Fuzzing) 分析原始碼 反組譯至組合語言 反編譯到原始碼 … 找到漏洞後,如何利用這些漏洞?常見的方法包括: 控制程式的執行流程 覆蓋返回位址 (Return Address) 修改變數值 至於我們的目標,通常包括以下幾點: 提取檔案 讀寫檔案 獲取 Shell 接下來的內容 上述所有內容將在後續的文章中一一為大家詳細介紹,並提供豐富的練習範例和實戰題目來進行漏洞利用。如果有想要學習的特定內容,也歡迎大家在下方留言區許願。

2024-09-15 · 1 min · 41 words · YJK

AIS3 mfctf & pre-exam 2024 writeup

Web Evil Calculator 網頁是一個簡單的計算機程式 透過攔截封包與 app.py 程式碼會發現他是將結果傳 POST 請求到 /calculate,並傳入 eval 做計算,所以可以傳入程式碼做解析,接下來看到 app.py 會發現傳送過去的 expression 空格跟底線都會被過濾,所以應該是不可以 import 其他東西,接下來看到 docker-compose.yml 可知 flag 在 /flag,因此直接透過開檔讀檔拿到 flag app.py 1from flask import Flask, request, jsonify, render_template 2 3app = Flask(__name__) 4 [email protected]('/calculate', methods=['POST']) 6def calculate(): 7 data = request.json 8 expression = data['expression'].replace(" ","").replace("_","") 9 try: 10 result = eval(expression) 11 except Exception as e: 12 result = str(e) 13 return jsonify(result=str(result)) 14 [email protected]('/') 16def index(): 17 return render_template('index.html') 18 19if __name__ == '__main__': 20 app.run("0.0.0.0",5001) docker-compose.yml ...

2024-07-01 · 5 min · 910 words · YJK