二進制漏洞與利用學習
一、主要術語
- Binary:由編譯類語言生成的可執行程序
- Vulnerability:Binary中包含的可被利用的Bug
- Exploit:藉助Vulnerability來劫持Binary控制流的、經過特殊構造的數據
- 0day:可被exploit的位置Vulnerability
- Pwn:發現Vulnerability以及開發exploit的工作
二、目的:
- 獲取shell
- 獲取計算機上的敏感信息
- 上串並安裝Malware
- 對計算機實施破壞
三、根本原因:
(1)通道問題:
- 計算機中數據和控制通道隔離性差
- 存在從數據通道信息轉移到控制通道的可能
(2)邏輯問題
- 對邊界條件的檢查不完善
- 對內存管理不善
- 邏輯不嚴謹或太複雜
四、分類:
- Stack-Based
- Heap-Based
- Integer Issue
- Pointer Issue
- Format Strig Vulnerability
- Race Condition
五、基礎知識(Knowledge Base)
- ELF:linux中可執行文件
PE:windows下可執行文件
PLT:程序局部表
- GOT:全局偏移表
- X86指令大小不固定,不對齊,ARM指令大小爲4B,且對齊(Aligned)
六、防護機制:
1.NX/W^X
(1)解釋:數據頁不可執行,代碼頁不可寫
(2)Bypass:
- ret2lib:令控制流跳轉到庫代碼中執行
- ROP(Return Oriented Programming):從內存中尋找Gadget(每個Gadget都以return結尾,返回調用該函數的代碼所在的rip後的地址)並將其組成具有一定功能的代碼 ,可以用RoPgadget尋找GadGet
2.ASLR:
(1)解釋: 內核、堆棧、動態庫的加載地址具有隨機性
開啓PIE的情況下,主程序的加載基地址也隨機
(2)Bypass:
- 爆破
32位環境,linux libc的加載基址爲0Xf7xxx000
- 信息泄露:
獲取GOT表(含大量函數指針)的內容
獲取main函數返回地址
3.Stack Guard
Canaries/Cookies:在棧中的局部變量和返回地址間插入一個難以預測的值(Canary),當函數返回時,將檢查Canary是否被破壞
4.StackShield:
將返回地址拷貝到影子棧中,返回時比較棧上的返址與影子棧中的返址
5.SSP
編譯時對變量重排序,將函數指針放在低低址,緩衝區放在高地址