本書分為5篇33章,較為系統、全面地介紹了Windows平台緩衝區溢出漏洞的分析、檢測與防護。第一篇為漏洞exploit的基礎理論和初級技術,可以引領讀者迅速入門;第二篇在第一篇的基礎上,結合國內外相關研究者的前沿成果,對漏洞技術從攻、防兩個方面進行總結;第三篇站在安全測試者的角度,討論了幾類常用軟體的漏洞挖掘方法與思路;第四篇則填補了本類書籍在Windows核心安全及相關攻防知識這個神秘領域的技術空白;第五篇以大量的0 day案例分析,來幫助讀者理解前四篇的各類思想方法。
目錄
第1篇 漏洞利用原理(初級)
第1章 基礎知識 2
1.1 漏洞概述 2
1.1.1 bug與漏洞 2
1.1.2 幾個令人困惑的安全問題 2
1.1.3 漏洞挖掘、漏洞分析、漏洞利用 3
1.1.4 漏洞的公布與0day回響5
1.2 二進制檔案概述 5
1.2.1 PE檔案格式 5
1.2.2 虛擬記憶體 6
1.2.3 PE檔案與虛擬記憶體之間的映射 7
1.3 必備工具 11
1.3.1 OllyDbg簡介 11
1.3.2 SoftICE簡介 11
1.3.3 WinDbg簡介 16
1.3.4 IDA Pro簡介 18
1.3.5 二進制編輯器 20
1.3.6 VMware簡介 21
1.3.7 Python編程環境 28
1.4 Crack小實驗 29
第2章 棧溢出原理與實踐 38
2.1 系統棧的工作原理 38
2.1.1 記憶體的不同用途 38
2.1.2 棧與系統棧 39
2.1.3 函式調用時發生了什麼 40
2.1.4 暫存器與函式棧幀 43
2.1.5 函式調用約定與相關指令 44
2.2 修改鄰接變數 47
2.2.1 修改鄰接變數的原理 47
2.2.2 突破密碼驗證程式 49
2.3 修改函式返回地址 53
2.3.1 返回地址與程式流程 53
2.3.2 控制程式的執行流程 57
2.4 代碼植入 62
2.4.1 代碼植入的原理 62
2.4.2 向進程中植入代碼 62
第3章 開發shellcode的藝術 71
3.1 shellcode概述 71
3.1.1 shellcode與exploit 71
3.1.2 shellcode需要解決的問題 72
3.2 定位shellcode 73
3.2.1 棧幀移位與jmp esp 73
3.2.2 獲取“跳板”的地址 76
3.2.3 使用“跳板”定位的exploit 78
3.3 緩衝區的組織 81
3.3.1 緩衝區的組成 81
3.3.2 抬高棧頂保護shellcode 83
3.3.3 使用其他跳轉指令 83
3.3.4 不使用跳轉指令 84
3.3.5 函式返回地址移位 85
3.4 開發通用的shellcode 87
3.4.1 定位API的原理 87
3.4.2 shellcode的載入與調試 88
3.4.3 動態定位API地址的shellcode 89
3.5 shellcode編碼技術 98
3.5.1 為什麼要對shellcode編碼 98
3.5.2 會“變形”的shellcode 99
3.6 為shellcode“減肥” 103
3.6.1 shellcode瘦身大法 103
3.6.2 選擇恰當的hash算法 105
3.6.3 191個位元組的bindshell 107
第4章 用MetaSploit開發Exploit 119
4.1 漏洞測試平台MSF 簡介 119
4.2 入侵Windows系統 121
4.2.1 漏洞簡介 121
4.2.2 圖形界面的漏洞測試 121
4.2.3 console界面的漏洞測試 125
4.3 利用MSF製作shellcode 126
4.4 用MSF掃描“跳板” 128
4.5 Ruby語言簡介 129
4.6 “傻瓜式”Exploit開發 134
4.7 用MSF發布POC 140
第5章 堆溢出利用 144
5.1 堆的工作原理 144
5.1.1 Windows堆的歷史 144
5.1.2 堆與棧的區別 145
5.1.3 堆的數據結構與管理策略 146
5.2 在堆中漫遊 151
5.2.1 堆分配函式之間的調用關係 151
5.2.2 堆的調試方法 152
5.2.3 識別堆表 155
5.2.4 堆塊的分配 158
5.2.5 堆塊的釋放 159
5.2.6 堆塊的合併 159
5.2.7 快表的使用 161
5.3 堆溢出利用(上)——DWORD SHOOT 163
5.3.1 鍊表“拆卸”中的問題 163
5.3.2 在調試中體會“DWORD SHOOT” 165
5.4 堆溢出利用(下)——代碼植入 169
5.4.1 DWORD SHOOT的利用方法 169
5.4.2 狙擊P.E.B中RtlEnterCritical-Section()的函式指針 170
5.4.3 堆溢出利用的注意事項 175
第6章 形形色色的記憶體攻擊技術 178
6.1 狙擊Windows異常處理機制 178
6.1.1 S.E.H概述 178
6.1.2 在棧溢出中利用S.E.H 180
6.1.3 在堆溢出中利用S.E.H 184
6.1.4 深入挖掘Windows異常處理 187
6.1.5 其他異常處理機制的利用思路 192
6.2 “off by one”的利用 196
6.3 攻擊C++的虛函式 198
6.4 Heap Spray:堆與棧的協同攻擊 201
第7章 手機里的緩衝區溢出 204
7.1 Windows Mobile簡介 204
7.1.1 Windows Mobile前世今生 204
7.1.2 Windows Mobile架構概述 205
7.1.3 Windows Mobile的記憶體管理 209
7.2 ARM簡介 212
7.2.1 ARM是什麼 212
7.2.2 ARM暫存器結構 212
7.2.3 ARM彙編指令結構 215
7.2.4 ARM指令定址方式 220
7.2.5 ARM的函式調用與返回 222
7.3 Windows Mobile上的HelloWorld 223
7.4 遠程調試工具簡介 227
7.4.1 遠程信息查看管理套件 227
7.4.2 手機上的調試——Microsoft Visual Studio 231
7.4.3 手機上的調試——IDA 233
7.5 手機上的exploit me 237
第8章 其他類型的軟體漏洞 243
8.1 格式化串漏洞 243
8.1.1 printf中的缺陷 243
8.1.2 用printf讀取記憶體數據 244
8.1.3 用printf向記憶體寫數據 245
8.1.4 格式化串漏洞的檢測與防範 246
8.2 SQL注入攻擊 247
8.2.1 SQL注入原理 247
8.2.2 攻擊PHP+MySQL網站 248
8.2.3 攻擊ASP+SQL Server網站 250
8.2.4 注入攻擊的檢測與防範 252
8.3 其他注入方式 253
8.3.1 Cookie注入,繞過馬其諾防線 253
8.3.2 XPath注入,XML的阿喀琉斯之踵 254
8.4 XSS攻擊 255
8.4.1 腳本能夠“跨站”的原因 255
8.4.2 XSS Reflection攻擊場景 256
8.4.3 Stored XSS攻擊場景 258
8.4.4 攻擊案例回顧:XSS蠕蟲 258
8.4.5 XSS的檢測與防範 259
8.5 路徑回溯漏洞 260
8.5.1 路徑回溯的基本原理 260
8.5.2 範式化與路徑回溯 261
第2篇 漏洞利用原理(高級)
第9章 Windows安全機制概述 264
第10章 棧中的守護天使:GS 267
10.1 GS安全編譯選項的保護原理 267
10.2 利用未被保護的記憶體突破GS 271
10.3 覆蓋虛函式突破GS 273
10.4 攻擊異常處理突破GS 276
10.5 同時替換棧中和.data中的Cookie突破GS 280
第11章 亡羊補牢:SafeSEH 284
11.1 SafeSEH對異常處理的保護原理 284
11.2 攻擊返回地址繞過SafeSEH 288
11.3 利用虛函式繞過SafeSEH 288
11.4 從堆中繞過SafeSEH 288
11.5 利用未啟用SafeSEH模組繞過SafeSEH 292
11.6 利用載入模組之外的地址繞過SafeSEH 299
11.7 利用Adobe Flash Player ActiveX控制項繞過SafeSEH 305
第12章 數據與程式的分水嶺:DEP 313
12.1 DEP機制的保護原理 313
12.2 攻擊未啟用DEP的程式 316
12.3 利用Ret2Libc挑戰DEP 317
12.3.1 Ret2Libc實戰之利用ZwSetInformationProcess 318
12.3.2 Ret2Libc實戰之利用VirtualProtect 330
12.3.3 Ret2Libc實戰之利用VirtualAlloc 339
12.4 利用可執行記憶體挑戰DEP 348
12.5 利用.NET挑戰DEP 352
12.6 利用Java applet挑戰DEP 359
第13章 在記憶體中躲貓貓:ASLR 363
13.1 記憶體隨機化保護機制的原理 363
13.2 攻擊未啟用ASLR的模組 367
13.3 利用部分覆蓋進行定位記憶體地址 372
13.4 利用Heap spray技術定位記憶體地址 376
13.5 利用Java applet heap spray技術定位記憶體地址 379
13.6 為.NET控制項禁用ASLR 382
第14章 S.E.H終極防護:SEHOP 386
14.1 SEHOP的原理 386
14.2 攻擊返回地址 388
14.3 攻擊虛函式 388
14.4 利用未啟用SEHOP的模組 388
14.5 偽造S.E.H鍊表 390
第15章 重重保護下的堆 396
15.1 堆保護機制的原理 396
15.2 攻擊堆中存儲的變數 397
15.3 利用chunk重設大小攻擊堆 398
15.4 利用Lookaside表進行堆溢出 407
第3篇 漏洞挖掘技術
第16章 漏洞挖掘技術簡介 414
16.1 漏洞挖掘概述 414
16.2 動態測試技術 415
16.2.1 SPIKE簡介 415
16.2.2 beSTORM簡介 421
16.3 靜態代碼審計 429
第17章 檔案類型漏洞挖掘 與Smart Fuzz 431
17.1 Smart Fuzz概述 431
17.1.1 檔案格式Fuzz的基本方法 431
17.1.2 Blind Fuzz和Smart Fuzz 432
17.2 用Peach挖掘檔案漏洞 433
17.2.1 Peach介紹及安裝 433
17.2.2 XML介紹 434
17.2.3 定義簡單的 Peach Pit 436
17.2.4 定義數據之間的依存關係 440
17.2.5 用Peach Fuzz PNG檔案 441
17.3 010腳本,複雜檔案解析的瑞士軍刀 446
17.3.1 010 Editor簡介 446
17.3.2 010腳本編寫入門 447
17.3.3 010腳本編寫提高——PNG檔案解析 449
17.3.4 深入解析,深入挖掘——PPT檔案解析 452
第18章 FTP的漏洞挖掘 457
18.1 FTP協定簡介 457
18.2 漏洞挖掘手記1:DOS 457
18.3 漏洞挖掘手記2:訪問許可權 466
18.4 漏洞挖掘手記3:緩衝區溢出 468
18.5 漏洞挖掘手記4:Fuzz DIY 472
第19章 E-Mail的漏洞挖掘 477
19.1 挖掘SMTP漏洞 477
19.1.1 SMTP協定簡介 477
19.1.2 SMTP漏洞挖掘手記 478
19.2 挖掘POP3漏洞 480
19.2.1 POP3協定簡介 480
19.2.2 POP3漏洞挖掘手記 481
19.3 挖掘IMAP4漏洞 489
19.3.1 IMAP4協定簡介 489
19.3.2 IMAP4漏洞挖掘手記 490
19.4 其他E-mail漏洞 491
19.4.1 URL中的路徑回溯 491
19.4.2 記憶體中的路徑回溯 494
19.4.3 郵件中的XSS 500
第20章 ActiveX控制項的漏洞挖掘 502
20.1 ActiveX控制項簡介 502
20.1.1 瀏覽器與ActiveX控制項的關係 502
20.1.2 控制項的屬性 503
20.2 手工測試ActiveX控制項 504
20.2.1 建立測試模板 504
20.2.2 獲取控制項的接口信息 505
20.3 用工具測試ActiveX控制項:COMRaider 509
20.4 挖掘ActiveX漏洞 516
20.4.1 ActiveX漏洞的分類 516
20.4.2 漏洞挖掘手記1:超星閱讀器溢出 517
20.4.3 漏洞挖掘手記2:目錄操作許可權 521
20.4.4 漏洞挖掘手記3:檔案讀許可權 523
20.4.5 漏洞挖掘手記3:檔案刪除許可權 525
第4篇 作業系統核心安全
第21章 探索ring0 528
21.1 核心基礎知識介紹 528
21.1.1 核心概述 528
21.1.2 驅動編寫之Hello World 528
21.1.3 派遣例程與IRP結構 533
21.1.4 Ring3打開驅動設備 537
21.1.5 DeviceIoControl函式與IoControlCode 538
21.1.6 Ring3/Ring0的四種通信方式 539
21.2 核心調試入門 541
21.2.1 創建核心調試環境 541
21.2.2 藍屏分析 549
21.3 核心漏洞概述 551
21.3.1 核心漏洞的分類 551
21.3.2 核心漏洞的研究過程 553
21.4 編寫安全的驅動程式 555
21.4.1 輸入輸出檢查 555
21.4.2 驗證驅動的調用者 556
21.4.3 白名單機制的挑戰 556
第22章 核心漏洞利用技術 557
22.1 利用實驗之exploitme.sys 557
22.2 核心漏洞利用思路 559
22.3 核心漏洞利用方法 560
22.4 核心漏洞利用實戰與編程 565
22.5 Ring0 Shellcode的編寫 570
第23章 FUZZ驅動程式 579
23.1 核心FUZZ思路 579
23.2 核心FUZZ工具介紹 581
23.3 核心FUZZ工具DIY 583
23.3.1 Fuzz對象、Fuzz策略、Fuzz項 583
23.3.2 IoControl MITM Fuzz 583
23.3.3 IoControl Driver Fuzz 585
23.3.4 MyIoControl Fuzzer界面 586
23.4 核心漏洞挖掘實戰 588
23.4.1 超級巡警ASTDriver.sys本地提權漏洞 588
23.4.2 東方微點mp110013.sys本地提權漏洞 594
23.4.3 瑞星HookCont.sys驅動本地拒絕服務漏洞 601
第24章 核心漏洞案例分析 605
24.1 遠程拒絕服務核心漏洞 605
24.2 本地拒絕服務核心漏洞 611
24.3 緩衝區溢出核心漏洞 614
24.4 任意地址寫任意數據核心漏洞 619
24.5 任意地址寫固定數據核心漏洞 622
第5篇 漏洞分析案例
第25章 漏洞分析技術概述 628
25.1 漏洞分析的方法 628
25.2運動中尋求突破:調試技術 629
25.2.1 斷點技巧 630
25.2.2 回溯思路 644
25.3 用“白眉”在PE中漫步 647
25.3.1 指令追蹤技術與Paimei 647
25.3.2 Paimei的安裝 648
25.3.3 使用PE Stalker 649
25.3.4 迅速定位特定功能對應的代碼 652
25.4 補丁比較 654
第26章 RPC入侵:MS06-040 與MS08-067 658
26.1 RPC漏洞 658
26.1.1 RPC漏洞簡介 658
26.1.2 RPC編程簡介 658
26.2 MS06-040 659
26.2.1 MS06-040簡介 659
26.2.2 動態調試 660
26.2.3 靜態分析 667
26.2.4 實現遠程exploit 670
26.3 Windows XP環境下的MS06-040 exploit 677
26.3.1 靜態分析 677
26.3.2 蠕蟲樣本的exploit方法 682
26.3.3 實踐跨平台exploit 684
26.4 MS08-067 690
26.4.1 MS08-067簡介 690
26.4.2 認識Legacy Folder 693
26.4.3 “移經”測試 694
26.4.4 “移經”風險 695
26.4.5 POC的構造 696
26.5 魔波、Conficker與蠕蟲病毒 703
第27章 MS06-055分析:實戰Heap Spray 705
27.1 MS06-055簡介 705
27.1.1 矢量標記語言(VML)簡介 705
27.1.2 0 day安全回響紀實 706
27.2 漏洞分析 707
27.3 漏洞利用 710
第28章 MS09-032分析:一個“&”引發的血案 713
28.1 MS09-032簡介 713
28.2 漏洞原理及利用分析 713
第29章 Yahoo!Messenger棧 溢出漏洞 719
29.1 漏洞介紹 719
29.2 漏洞分析 719
29.3 漏洞利用 723
第30章 CVE-2009-0927:PDF中的JS 725
30.1 CVE-2009-0927簡介 725
30.2 PDF文檔格式簡介 725
30.3 漏洞原理及利用分析 727
第31章 壩之蟻穴:超長URL溢出漏洞 731
31.1 漏洞簡介 731
31.3 漏洞原理及利用分析 731
第32章 暴風影音M3U檔案解析漏洞 737
32.1 漏洞簡介 737
32.2 M3U檔案簡介 737
32.3 漏洞原理及利用分析 738
第33章 LNK捷徑檔案漏洞 744
33.1 漏洞簡介 744
33.2 漏洞原理及利用分析 744
附錄A 已公布的核心程式漏洞列表 750
參考文獻 753