Assembly-Language for pwn

Mike Lv99
目錄

介紹組語

組合語言(Assembly Language)是一種低階程式語言,是介於機器碼與高階語言(java、python、C/C++…)之間的橋樑,與高階語言相比,組合語言能更精確地控制硬體行為,供對 CPU、記憶體及周邊設備的完全訪問。在學習 PWN(漏洞利用)時,熟悉組合語言有助於分析程式執行流程、理解漏洞成因以及構造漏洞利用方法。

組合語言的優勢包括

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

在 PWN 領域,組合語言常用於

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

介紹基本語法

指令結構

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

  • 標籤(Label):用於指示位置,類似於函數或變數名稱。
  • 操作碼(Opcode):執行的指令,如 mov、add、jmp 等。
  • 操作數(Operands):指令操作的目標,如暫存器、內存地址或立即數。
以下為範例
1
2
3
4
5
6
7
8
9
10
11
12
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時很重要)

    基本指令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    ; 資料搬移指令
    mov rax, rbx ; rax = rbx
    mov rdx, 0x10 ; rdx = 0x10 (16)
    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 ; rax = 10
    mov rbx, 3 ; 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 ; 比較 rax 與 rbx
    je label ; 若相等,跳轉到 label
    jne label ; 若不相等,跳轉到 label
    jg label ; 若 rax > rbx,跳轉
    jl label ; 若 rax < rbx,跳轉

    ; 堆疊操作指令
    push rax ; 將 rax 壓入堆疊
    pop rbx ; 從堆疊彈出值至 rbx
    call function ; 呼叫 function
    ret ; 返回到呼叫處

    ; 流程控制指令
    jmp label ; 無條件跳轉到 label
    mov rcx, 5 ; 設置迴圈次數
    loop_start:
    ; 迴圈內代碼
    loop loop_start ; 若 rcx > 0,減1並跳轉

    ; 進階指令
    mov rax, 60 ; 系統呼叫號:exit
    xor rdi, rdi ; 退出狀態 0
    syscall ; 呼叫內核
    nop ; 不執行任何操作

介紹 PWN

PWN(漏洞利用,Exploit)是網路安全領域的一個重要主題,主要指的是利用程式中的漏洞來執行不法操作。這些漏洞通常是由開發者在設計或編寫程式時留下的缺陷,例如緩衝區溢位(Buffer Overflow)或格式字串漏洞(Format String Vulnerability)等。在進行 PWN 攻擊時,攻擊者通常會利用這些漏洞來獲取執行程式的控制權,進而執行任意程式碼。PWN 是現今許多CTF競賽和安全測試中常見的領域。組合語言在這其中扮演了關鍵的角色,因為它能精確操作硬體,並能有效利用底層漏洞。

介紹組語在 PWN 的作用

在 PWN 攻擊中,組合語言扮演著非常重要的角色,因為它允許攻擊者直接操控程式的執行過程。理解組合語言可以幫助攻擊者更好地理解漏洞是如何產生的,並且如何精確地利用這些漏洞。

  • 漏洞分析:攻擊者在分析程式時,會通過組合語言來查看程式的指令,理解程式如何運行。這有助於發現程式中可能存在的漏洞,並且能夠確定哪些位置可以被覆蓋或操控。
  • 漏洞利用:在漏洞利用的過程中,組合語言幫助攻擊者製作 shellcode、設計 ROP chain,甚至操作記憶體,以繞過各種安全機制(如堆疊保護、ASLR 等)。
  • 系統呼叫:在進行攻擊時,攻擊者需要觸發系統呼叫(syscall),以便與操作系統交互或控制系統資源。組合語言提供了直接執行這些操作的能力。

PWN 的例子

在 PWN 中常見的攻擊方式

  • 緩衝區溢位(Buffer Overflow)

    攻擊者通過在緩衝區內寫入超過預期範圍的資料來覆蓋其他重要資料或控制流指令,進而控制程式的執行流程。組合語言在這裡幫助攻擊者理解如何利用記憶體結構,並精確設置跳轉指令。

  • 格式字串漏洞(Format String Vulnerability)

    攻擊者利用格式字串錯誤,改變程序的內存內容,並從中讀取或寫入數據。組合語言可用於深入理解程式如何處理格式字串,並如何構造惡意的輸入。

  • Return-Oriented Programming(ROP)

    這是一種利用已經存在於程式中的指令來進行攻擊的方法,攻擊者不需要直接執行 shellcode,而是利用現有的指令序列來達到目的。這需要對組合語言的深入理解,並利用組合語言指令來精心設計控制流程。

  • Heap Overflow

    攻擊者利用堆積區域的漏洞來操控堆中的資料,通常與程式的記憶體管理有關。此類攻擊在組合語言層面需要對內存分配、指標操作有非常精確的控制。

結論

組合語言是 PWN 攻擊中不可或缺的一部分,它使攻擊者能夠精確操控程式的執行流程,並有效利用底層漏洞。無論是在分析漏洞、編寫 shellcode 還是設計 ROP 攻擊,組合語言都提供了攻擊者極大的靈活性和控制力。理解組合語言對於學習和掌握 PWN 技術至關重要,並且能夠幫助我們更好地理解漏洞的根源,並設計更有效的防禦機制。

  • Title: Assembly-Language for pwn
  • Author: Mike
  • Created at : 2025-01-02 10:05:16
  • Updated at : 2025-04-30 12:14:25
  • Link: https://happymike0103.github.io/2025/01/02/2025-1-2-Assembly-Language-Assembly-Language/
  • License: This work is licensed under CC BY-NC-SA 4.0.