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 (將多個目標檔連接再一起,成為可執行檔案,分為動態與靜態連結)
執行檔 ExecutablesBinary Exploitation
1
2
3
4
5
6
7
8
9
10透過一個或多個漏洞利用,取得程式的掌控權
目的:
取得Shell
讀取、竄改檔案
ELF為Linux執行檔格式
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
6PIE 程式碼相對位址表示,非絕對位址
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
5General 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 - r15bCalling 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:
放stackPrologue/Epilogue
1
2
3
4
5
6
7
8
9
10
11
12Function 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基礎知識/