---
# System prepended metadata

title: pwn

---

# pwn
## 概念
控制程式流程，進而發動攻擊，常是利用fuzz模糊測試或看原始碼與組合語言尋找能產生segmentation falut的情形
## Program Structure
![](https://i.imgur.com/iDeWofJ.png)
- text:為程式碼(binary)，可讀不可寫
- Data:初始化全域變數
- BSS:為初始化全域變數
- Heap:動態記憶體空間，由下往上長(跟dsa學的一樣)
- Stack:存放其他的資料，像會儲存call function 後要return的位置，由上往下長(跟dsa學的一樣)
## Security Options
### RELRO
#### 概念
當我們在寫程式時常會利用一些內建的library，但我們通常在做成執行檔時不會把library包進去(減少空間)，而是當使用者要使用時，再從使用者電腦中的library叫出來使用，而其中會用到的便是GOT 和 PLT，一開始我們呼叫到library的function時，我們會先去看GOT有沒有，如果沒有再用PLT去library找，再把找到的丟到GOT上，最後再被呼叫。
- NO RELRO:可寫link map,GOT
- Partial RELRO :只有GOT可寫
- Full RELRO:都不可寫
### Stack Canary
rbp前塞一個random值，作為柵欄，如果有人想依靠填滿stack來修改rbp 或 return address時，就能透過檢測其根原本的值是否相同來判定是否遭到攻擊
### NX(DEP,Data Execution Prevention)
可寫的不可執行，可執行的不可寫
### PIE(Position Independent Executable)
- 開啟時，data 段以及 code 段位址隨機化
- 關閉時，data 段以及 code 段位址固定
### ASLR(Address Space Layout Randomization)
- 記憶體位址隨機變化
- 每次執⾏時，stack、heap、library 位置都不⼀樣
- ASLR 是系統設定，非程式的設定
## Tools
- nc/ncat : pwn題目中常用的遠端連線工具
- checksec:查看程式有打開那些安全保護，通常在攻擊前先做的
- gdb-vmmap:查看目前程式記憶體的分布
- pwntools:和遠端程式互動的python套件，[https://github.com/Gallopsled/pwntools](https://)
- radare2:靜動態分析都可以做，但推薦動態用gdb，靜態用這個[https://frozenkp.github.io/reverse/radare2/](https://) [https://frozenkp.github.io/reverse/radare2/](https://)
# Buffer Overflow
## 概念
輸入時沒有控制輸入的長度導致記憶體空間被覆蓋掉，常發生在char陣列的輸入，我們通常會在stack上放return address 和 rbp 那麼我們可能依靠填滿stack的方式來改變rbp或return address的值，而前面stack canary是一種防禦方法，但有機會繞過，能用到此種攻擊常是因為程式使用了gets和read
- 即使遇到stack canary，我們也能依靠填canary上面的local variable來攻擊
# Libc
利用reload的概念，改寫呼叫got的function來讓其呼叫的function不是他原本的預期