# CTF pwn 程式保護機制 * 在 pwn 類型的題目當中,我們時常利用一些 overflow 去做攻擊,當然也因此有對應的防護機制 * 我們可以利用 `checksec` 去檢查一個程式開啟了那些防護機制 * ![](https://hackmd.io/_uploads/Hyz_pDvGp.png) ## RELRO * ReLocation Read-Only,重定位符號表唯獨化 * 分為 Partial RELRO 與 Full RELRO * Partial RELRO: 在初始化完之後,將 `.GOT` `.dynamic` 等 sections 設為唯讀 * Full RELRO: 直接取消了 lazy binding 的機制,所有符號會在初始化就綁定好最後 lib 中的 Address,並且 `.got.plt` 會被設為唯讀 * 防止了 GOT Hijacking 等等的攻擊 ## Canary * 在 function 開頭建立一個 canary 變數,並在結束時去檢查該變數是否被修改過 * canary 可以防止 stack overflow 任意的複寫,因為只要蓋到 canary 就會導致程式中止而無法進一步利用 * 可以利用 leak canary 或是指定區域複寫等技巧去 bypass ## NX * No-eXecute,表示無法執行 * 開啟 NX 後 stack 的權限會變成只能讀寫而不能執行,因此無法藉由在 stack 中寫入 shellcode 再跳轉到 stack 的技巧去攻擊 * 依然可以使用 Ret2lib 的攻擊手法,因為跳轉到的地方是合法的執行區段而非 stack 上 ## PIE * Position Independent Executable,位址隨機化 * PIE 是編譯時隨機化,需要搭配 OS 負責的 ASLR(執行時隨機)才有效果 * PIE 與 ASLR 同時開啟後,會使 stack 與動態庫的 Address 每次都不一樣,干擾分析 * 只能透過 leak address 去繞過 * 關掉 ASLR 之後,PIE 也會跟著一起失效