<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 上)