Pwn基礎知識

Pwn-Basic

Intro

  • 編譯過程

    1
    2
    3
    4
    5
    6
    7
    原始碼 Source Code 
    預處理器 Preprocessor (井字號開頭 巨集 ex:#include #ifdef... #define)
    編譯器 Compiler (原始語言 to 目標語言 高階轉低階 c to ASM)
    組譯器 Assembler (將組語轉成目標碼、機器碼,組合語言機器碼一對一對應)
    目標碼 Object Code (由機器碼組成,俗稱binaries,主要的程式邏輯都在這)
    連結器 Linker (將多個目標檔連接再一起,成為可執行檔案,分為動態與靜態連結)
    執行檔 Executables
  • Binary Exploitation

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    透過一個或多個漏洞利用,取得程式的掌控權
    目的:
    取得Shell
    讀取、竄改檔案

    ELFLinux執行檔格式
    Section 區分不同功能資料
    不同功能需要不同的權限、大小
    程式碼屬於.text section,需要執行權限
    常數字串屬於 .rodata section,需要讀取權限
  • ELF-Memory Layout

    1
    2
    3
    4
    5
    6
    7
    8
    .text 程式碼
    .rodata read-only data,如字串
    .data 初始化後的變數
    .bss 尚未初始化的變數
    heap 動態記憶體空間
    lib Shared library
    tls thread local storage
    stack 堆疊,儲存當前function執行狀態的空間

  • ELF - Protection

    1
    2
    3
    4
    5
    6
    PIE 程式碼相對位址表示,非絕對位址
    NX .text外的section沒有執行權限
    Canary Stack結尾塞入隨機數,return前檢查是否遭到修改
    RELRO 分為 Full/Partial/No 三種型態,分別代表runtime解析外部function時使用的不同機制
    Seccomp 制定規則禁止或允許特定Syscall
    ASLR 程式載入時,stack、heap等記憶體區塊會使用隨機位址當作base address(末12bits固定)
  • Register

    1
    2
    3
    4
    5
    General Purpose Registers (GPRs)
    64 bit: rax, rbx, rcx, rdx, rdi, rsi, r8 - r15
    32 bit: eax, ebx, ecx, edx, edi, esi, r8d - r15d
    16 bit: ax, bx, cx, dx, di, si, r8w - r15w
    8 bit: ah, bh, ch, dh, al, bl, cl, dl, dil, sil, r8b - r15b
  • Calling Convention

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    分為Caller 與 Callee

    Logical address 8 bytes代表
    User space 0 ~ 2^47-1
    Kernel space 2^64 - 2^47 ~ 2^64 - 1

    Linux 呼叫慣例:
    RDI RSI RDX RCX R8 R9 其餘stack return值 rax

    Windows 呼叫慣例:
    RCX RDX R8 R9 多的放stack

    Linux/Win x32:
    放stack

  • Prologue/Epilogue

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function Prologue
    為 Function 的起頭,一個 Function 被呼叫時的起手式。

    0x4004d7 PUSH RBP
    0x4004d8 MOV RBP RSP
    0x4004de SUB RSP 0x10

    Function Epilogue
    為 Function 的結尾,一個 Function 結束生命周期之後的行為,簡單的說就是 Prologue 的逆向,怎麼開始,就怎麼結束。

    0x400508 LEAVE
    0x400509 RET

Pwn基礎知識
https://0xbe61a55f.github.io/2022/11/30/Pwn基礎知識/
作者
Giwawa
發布於
2022年11月30日
許可協議