---
# System prepended metadata

title: Pwn
tags: [資訊安全]

---

<h1>
    PWN (high school camp note)
</h1>

<h2>
    保護機制
</h2>

Use linux tool **checksec** to search it. More details can see in the [github link](https://github.com/slimm609/checksec.sh). 

In short to say, it utilizes **readelf**.

<b>RELRO</b>
- No RELRO : link map 和 GOT 都可寫
- Partial RELRO : link map 不可寫，GOT 可寫
- Full RELRO : link map 和 GOT 都不可寫

<b>Stack Canary</b>
- 在 rbp 之前塞一個 random 值，ret 之前檢查是否相同，不同的話就會 abort
- 有 canary 的話不能蓋到 return address、rbp

<b>NX (No eXecute)</b>
- 又稱 DEP (Data Execution Prevention)
- 可寫的不可執行，可執行的不可寫
- NX 若關閉，則可寫入 shellcode
- NX 若開啟，則可透過 ROP Chain 技巧執行 shell

<b>PIE (Position Independent Executable)</b>
- 開啟時，data 段以及 code 段位址隨機化
- 關閉時，data 段以及 code 段位址固定
- 「程式設定」

<b>ASLR (Address Space Layout Randomization)</b>
- 「記憶體」位址隨機化
- 每次執行時，stack、heap、library 位址都不一樣
- 「系統設定」
- 不會對最後1.5個byte作隨機化，也就是 0. (p.s. 可以用來確認拿到的libc_base是不是正確的值)

<h2>
    ROP Chain
</h2>

- 呼叫 syscall (register 需符合條件)，利用 ROP Chain 構建條件

<h2>
    Format String
</h2>

- 在 amd64 的情況下:
  前 6 個參數會放在 register 上
  第 7 個參數會放在 stack 上
- rdi -> rsi -> rdx -> rcx -> r8 -> r9 -> rsp -> rsp+8
- rdi 對應參數前面的 format
- 讀取常用的兩種格式
  %p : 印出 register/ stack 上的值
  %s : 將 register / stack 上的值作為位址，印出該位址所存的值
- printf 可以用 %n 來寫入指定的位址
- %n 和 %s 類似，%s 是將特定位址的內容印出來，%n 則是寫入
- 寫入的長度

|    格式    |  %lln  |   %n   |   %hn   | %hhn  |
| --------- | ------ | ------ | ------- | ----- |
| 長度(byte) | 8bytes | 4bytes | 2bytes | 1bytes |


<h2>
    Argv Chain
</h2>

- Format String 的進階用法, 當無法直接將位址寫在 stack 上時使用 (可以寫 format 的變數是全域變數, 不在 stack 上)

