CTF-Academy CTF 2026: Hi-PIE 👋🥧
三句話摘要
利用 NOP sled 和有效載荷噴灑技術,將緩衝區溢出漏洞在 ASLR 保護下的利用時間從數分鐘加速至秒級。 通過 NOP sled 和有效載荷噴灑的組合,即使在 ASLR 環保護下,也能將緩衝區溢出的利用時間從盲猜的數分鐘大幅縮短至可接受的秒級。 基本漏洞原理:目標程序使用 strcpy 將使用者輸入複製到 72 字節的棧緩衝區,因為沒有大小檢查且 strcpy 遇零字節才停止,攻擊者可輸入超過 72 字節的資料來覆蓋保存的返回地址,使程式跳轉至任意地址。
重點整理
重點- 1
基本漏洞原理:目標程序使用 strcpy 將使用者輸入複製到 72 字節的棧緩衝區,因為沒有大小檢查且 strcpy 遇零字節才停止,攻擊者可輸入超過 72 字節的資料來覆蓋保存的返回地址,使程式跳轉至任意地址。
- 2
ASLR 的挑戰:堆棧和堆的基址在每次運行時隨機變化,攻擊者無法預知 shellcode 的確切位置,導致傳統的猜測方法運行時間極長。
- 3
NOP sled 技術:在 shellcode 前放置大量 NOP(無操作)指令,使任何落入該區域的返回地址都能滑行至真正的 shellcode,將「一個精確目標位置」變成「一個寬泛的命中區域」,大幅增加命中概率。
- 4
有效載荷分割與噴灑:第一部分是 72 字節的返回地址放入緩衝區,第二部分是多份 64KB NOP sled 加 shellcode 的組合放入環境變數(NVP),通過複製多份來進一步提升 ASLR 碰撞的機率。
實用技巧與重點
乾貨- 緩衝區大小:72 字節
- 返回地址偏移:72 字節
- NOP sled 大小:64KB 單份
- 預期運行時間:約 1 分鐘(相比原方法的數分鐘)
- 使用工具:Ghidra(反向工程)、GDB(定位地址)、Pwntools(開發框架)、Shellcraft(生成無零字節 shellcode)
- 系統呼叫:sendfile syscall(用於讀取檔案而不修改權限)
- 環境變數清空:移除多餘環境變數以減少地址偏移
- 微調策略:初次使用 gdb 定位大致地址,後續每次嘗試微調返回地址值
- Core dump 限制:設定為 0 以減少檔案寫入開銷
結論
結論“通過 NOP sled 和有效載荷噴灑的組合,即使在 ASLR 環保護下,也能將緩衝區溢出的利用時間從盲猜的數分鐘大幅縮短至可接受的秒級。”
完整解析
詳細緩衝區溢出是經典的軟體安全漏洞。在本演講中,Hubert 以一個簡單程式為例:主函數接收使用者輸入,傳遞給 greet 函數,該函數使用 strcpy 將輸入複製到 72 字節的棧緩衝區。strcpy 有兩個致命缺陷——它完全忽視目標緩衝區的大小,並在遇到零字節時才停止複製。攻擊者可以輸入 72 字節的任意資料,後跟要覆蓋的返回地址和 shellcode,從而劫持程式的控制流。
然而,現實環境中 ASLR(地址空間佈局隨機化)通常是啟用的,這意味著每次程式運行時,堆棧的基址都會變化。傳統的利用方式是盲目猜測:反覆執行程式,期望 ASLR 碰巧將堆棧放在預期位置。這在統計上可行但耗時極長,某些情況下需要數分鐘甚至更久。
演講者引入 NOP sled 技術來加速這個過程。與其指向 shellcode 的某一精確位址,不如在 shellcode 前面放置數千甚至數萬個 NOP(無操作指令)。當返回地址跳到 NOP 區域的任何位置時,CPU 會執行這些無操作指令,然後自然地進行到真正的 shellcode。這樣做的效果是將單一的「命中目標」變成了一個寬泛的「命中區域」,大幅提升了 ASLR 命中的機率。
實現細節上,有效載荷被分為兩部分。第一部分是經過計算的返回地址,放入 72 字節的緩衝區中。第二部分是多份「NOP sled + shellcode」的組合,存放在程式的環境變數中。演講者使用 64KB 的 NOP sled,並將其複製多份,進一步提升命中概率。Shellcode 使用 pwntools 的 shellcraft 模組生成,確保不包含零字節(否則 strcpy 會提前停止)。其他優化包括清空多餘的環境變數以穩定棧地址、使用 gdb 初步定位 sled 的位置,然後在暴力迴圈中逐次微調返回地址,並將 core dump 限制設為 0 以避免不必要的檔案寫入。最終,這套優化將利用時間縮短至約 1 分鐘。
關鍵時刻
Pipeline v2帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。
事實查核
Pipeline v2說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。

