← 回到筆記

FIELD NOTES /

Assembly-Language for pwn

從組合語言的基本結構、暫存器與常用指令開始,整理它在 PWN 分析、shellcode、ROP 與漏洞利用中的核心作用。

#Assembly-Language#pwn

這篇筆記從組合語言的基本觀念出發,整理 x86-64 常見暫存器、指令與範例,並說明它為什麼會是學習 PWN 與漏洞利用時不可或缺的基礎能力。

介紹組語

組合語言(Assembly Language)是一種低階程式語言,是介於機器碼與高階語言(Java、Python、C/C++ 等)之間的橋樑。

與高階語言相比,組合語言能更精確地控制硬體行為,並提供對 CPU、記憶體及周邊設備的直接訪問。在學習 PWN(漏洞利用)時,熟悉組合語言有助於分析程式執行流程、理解漏洞成因以及構造漏洞利用方法。

組合語言的優勢

  • 高效能與精確性:直接操作硬體,沒有多餘的抽象層。
  • 全面可見性:能查看程式的每一步執行細節。
  • 彈性控制:允許開發者手動優化程式,實現高效能目標。

組合語言在 PWN 的用途

  • 漏洞排查與調試:使用 GDB 等工具觀察程式執行的組合語言指令。
  • Shellcode 編寫:設計小型程式碼以實現特定目標。
  • ROP(Return-Oriented Programming):拼湊現有指令來執行任意程式邏輯。

基本語法

指令結構

組合語言的每一行程式碼通常包含三部分:

結構說明
Label用於指示位置,類似於函數或變數名稱
Opcode執行的指令,如 mov、add、jmp
Operands指令操作的目標,如暫存器、記憶體地址或立即數

以下為範例:

Assembly
section .data
  msg db 'Hello, World!', 0
 
section .text
  global _start
 
_start:
  mov rax, 1       ; 系統呼叫號:write
  mov rdi, 1       ; 第一參數:stdout
  mov rsi, msg     ; 第二參數:字串地址
  mov rdx, 13      ; 第三參數:字串長度
  syscall          ; 呼叫內核

暫存器

常見的 x86-64 暫存器功能如下:

暫存器用途
RAX通常用於系統呼叫編號與函數返回值
RDI第一個參數
RSI第二個參數
RDX第三個參數
RSP堆疊指標
RBP基底指標,在 BOF 分析時很重要

基本指令

Assembly
; 資料搬移指令
mov rax, rbx       ; rax = rbx
mov rdx, 0x10      ; rdx = 0x10
lea rax, [rbx+4]   ; rax = rbx + 4 的地址
 
; 算術操作指令
add rax, rbx       ; rax += rbx
sub rax, 5         ; rax -= 5
imul rax, rbx      ; rax = rax * rbx
mov rax, 10
mov rbx, 3
idiv rbx           ; 商存於 rax,餘數存於 rdx
 
; 邏輯運算指令
and rax, 0xFF      ; rax &= 0xFF
or rax, rbx        ; rax |= rbx
xor rax, rax       ; rax = 0
not rax            ; rax = ~rax
 
; 比較與跳轉指令
cmp rax, rbx
je label
jne label
jg label
jl label
 
; 堆疊操作指令
push rax
pop rbx
call function
ret
 
; 流程控制指令
jmp label
mov rcx, 5
 
loop_start:
  ; 迴圈內代碼
  loop loop_start
 
; 系統呼叫
mov rax, 60
xor rdi, rdi
syscall
nop

介紹 PWN

PWN(漏洞利用,Exploit)是網路安全領域的重要主題,主要是利用程式中的漏洞來執行非預期操作。

這些漏洞通常是開發者在設計或編寫程式時留下的缺陷,例如:

  • 緩衝區溢位(Buffer Overflow)
  • 格式字串漏洞(Format String Vulnerability)
  • Heap Overflow
  • UAF(Use After Free)

在進行 PWN 攻擊時,攻擊者通常會利用這些漏洞取得程式控制權,進而執行任意程式碼。PWN 也是許多 CTF 競賽和安全測試中常見的領域。

組語在 PWN 中的作用

在 PWN 攻擊中,組合語言扮演非常重要的角色,因為它允許攻擊者直接操控程式的執行過程。

  • 漏洞分析:透過組合語言查看程式指令,理解程式如何運行,並找出可能被覆蓋或操控的位置。
  • 漏洞利用:製作 shellcode、設計 ROP chain、操作記憶體,並繞過堆疊保護、ASLR 等安全機制。
  • 系統呼叫:攻擊者需要觸發 syscall,以便與作業系統互動或控制系統資源。

PWN 的例子

緩衝區溢位

攻擊者透過在緩衝區內寫入超過預期範圍的資料,覆蓋其他重要資料或控制流指令,進而控制程式執行流程。

格式字串漏洞

攻擊者利用格式字串錯誤,改變程式的記憶體內容,並從中讀取或寫入資料。

Return-Oriented Programming

ROP 是一種利用程式中已存在指令來進行攻擊的方法。攻擊者不直接執行 shellcode,而是利用現有指令序列達成目的。

Heap Overflow

攻擊者利用堆積區域的漏洞來操控堆中的資料,通常與程式的記憶體管理有關。

結論

組合語言是 PWN 攻擊中不可或缺的一部分,它使攻擊者能夠精確操控程式的執行流程,並有效利用底層漏洞。

無論是在分析漏洞、編寫 shellcode,還是設計 ROP 攻擊,組合語言都提供了極大的靈活性與控制力。理解組合語言對於學習和掌握 PWN 技術至關重要,也能幫助我們更好地理解漏洞根源並設計防禦機制。