《模糊測試:強制發掘安全漏洞的利器》內容簡介:隨著軟體安全性問題變得越來越關鍵,傳統的僅由組織內的少數安全專家負責安全的模式正受到越來越多的挑戰。模糊測試是一種能夠降低安全性測試門檻的方法,它通過高度自動化的手段讓組織的開發和測試團隊都能參與到安全性測試中,並能夠通過啟發式等方法不斷積累安全測試的經驗,幫助組織建立更有效的面向安全性的開發流程。《模糊測試:強制發掘安全漏洞的利器》是一本系統性描述模糊測試的專著,介紹了主要作業系統和主流套用類型的模糊測試方法,系統地描述了方法和工具,並使用實際案例幫助讀者建立直觀的認識。
基本介紹
- 書名:模糊測試:強制發掘安全漏洞的利器
- 作者:薩頓 (Michael Sutton) 格林 (Adam greene)
- 出版日期:2013年10月1日
- 語種:簡體中文
- ISBN:7121210835
- 外文名:Fuzzing Brute Force Vulnerability Discovery
- 出版社:電子工業出版社
- 頁數:532頁
- 開本:16
- 品牌:電子工業出版社
基本介紹,內容簡介,作者簡介,圖書目錄,序言,
基本介紹
內容簡介
《模糊測試:強制發掘安全漏洞的利器》是一本系統性描述模糊測試的專著,介紹了主要作業系統和主流套用類型的模糊測試方法,系統地描述了方法和工具,並使用實際案例幫助讀者建立直觀的認識。
作者簡介
Michael Sutton
Micheal Sutton是SPI Dynamics的安全性專業顧問(Security Evangelist)。作為安全性專業顧問,Michael負責識別、研究及提出Web套用安全性歷史上出現的問題。他經常在主要的信息安全會議上演講,寫作了大量文章,並在多種信息安全主題中被引用。Michael同時也是Web 套用安全性協會(Web Application Security Consortium,WASC)的會員,領導著Web套用安全性統計項目。
在加入SPI Dynamics之前,Michael是iDefense/VeriSign的總監,領導iDefense Labs這個世界級的研究團隊,該團隊的目標是發現和研究安全性漏洞。Michael還在百慕達建立了為安永服務的信息系統保證和諮詢服務(Information System Assurance and Advisory Services,ISAAS)。Michael擁有阿爾伯塔大學和喬治華盛頓大學的學位。
Michael是一個驕傲的加拿大人,在他看來,曲棍球是一種信仰而不只是一種運動。在工作之外,Micheal還是Fairfax志願救火部門的一名士官。
Adam Greene
Adam Greene是某大金融新聞公司的工程師,公司位於紐約。在加入這家公司之前,Adam是iDefense的工程師,iDefense是位於維吉尼亞州雷斯頓城的一家智慧型公司。Adam在計算機安全性方面的興趣主要在於可信利用(reliable exploitation)方法、模糊測試,以及開發基於UNIX系統的利用漏洞的工具。
Pedram Amini
Pedram Amini目前領導著TippingPoint的安全研究和產品安全評估團隊,在此之前,他是iDefense Labes的助理總監和創始人之一。頂著“助理總監”這個奇怪的頭銜,Pedram在逆向工程的基礎方面投入了相當多的時間——開發自動化工具、外掛程式及腳本。他最近的項目(也叫“Babies”)包括PaiMei逆向工程框架和Sulley模糊測試框架。
出於熱情,Pedram創建了OpenRCE.org,一個專注於逆向工程的藝術和科學的社區網站。他在RECon、BlackHat、DefCon、ShmooCon和ToorCon上都進行過演講,並教授了多次逆向工程課程。Pedram擁有杜蘭大學的計算機科學學位。
Micheal Sutton是SPI Dynamics的安全性專業顧問(Security Evangelist)。作為安全性專業顧問,Michael負責識別、研究及提出Web套用安全性歷史上出現的問題。他經常在主要的信息安全會議上演講,寫作了大量文章,並在多種信息安全主題中被引用。Michael同時也是Web 套用安全性協會(Web Application Security Consortium,WASC)的會員,領導著Web套用安全性統計項目。
在加入SPI Dynamics之前,Michael是iDefense/VeriSign的總監,領導iDefense Labs這個世界級的研究團隊,該團隊的目標是發現和研究安全性漏洞。Michael還在百慕達建立了為安永服務的信息系統保證和諮詢服務(Information System Assurance and Advisory Services,ISAAS)。Michael擁有阿爾伯塔大學和喬治華盛頓大學的學位。
Michael是一個驕傲的加拿大人,在他看來,曲棍球是一種信仰而不只是一種運動。在工作之外,Micheal還是Fairfax志願救火部門的一名士官。
Adam Greene
Adam Greene是某大金融新聞公司的工程師,公司位於紐約。在加入這家公司之前,Adam是iDefense的工程師,iDefense是位於維吉尼亞州雷斯頓城的一家智慧型公司。Adam在計算機安全性方面的興趣主要在於可信利用(reliable exploitation)方法、模糊測試,以及開發基於UNIX系統的利用漏洞的工具。
Pedram Amini
Pedram Amini目前領導著TippingPoint的安全研究和產品安全評估團隊,在此之前,他是iDefense Labes的助理總監和創始人之一。頂著“助理總監”這個奇怪的頭銜,Pedram在逆向工程的基礎方面投入了相當多的時間——開發自動化工具、外掛程式及腳本。他最近的項目(也叫“Babies”)包括PaiMei逆向工程框架和Sulley模糊測試框架。
出於熱情,Pedram創建了OpenRCE.org,一個專注於逆向工程的藝術和科學的社區網站。他在RECon、BlackHat、DefCon、ShmooCon和ToorCon上都進行過演講,並教授了多次逆向工程課程。Pedram擁有杜蘭大學的計算機科學學位。
圖書目錄
譯者序
前言
原書序
致謝
關於作者
第一部分基礎知識
第1章 安全漏洞發現方法學
1.1 白盒測試
1.1.1代碼評審(Source Code Review)
1.1.2工具與自動化
1.1.3優點和缺點
1.2黑盒測試
1.2.1手工測試
1.2.2自動化測試或模糊測試
1.2.3優點和缺點
1.3灰盒測試
1.3.1二進制審計
1.3.2自動化的二進制審計
1.3.3優點和缺點
1.4小結
第2章什麼是模糊測試
2.1模糊測試的定義
2.2模糊測試的歷史
2.3模糊測試各階段
2.4模糊測試的局限性和期望
2.4.1訪問控制漏洞
2.4.2糟糕的設計邏輯
2.4.3後門
2.4.4破壞
2.4.5多階段安全漏洞(MuliStage Vulnerability)
2.5小結
第3章模糊測試方法與模糊測試器類型
3.1模糊測試方法
3.1.1預生成測試用例
3.1.2隨機生成輸入
3.1.3手工協定變異測試
3.1.4變異或強制性測試
3.1.5自動協定生成測試
3.2模糊測試器類型
3.2.1本地模糊器
3.2.2遠程模糊測試器
3.2.3存模糊測試器
3.2.4模糊測試框架
3.3小結
第4章數據表示和分析
4.1什麼是協定
4.2協定中的欄位
4.3簡單文本協定(Plain Text Protocols)
4.4二進制協定
4.5網路協定
4.6檔案格式
4.7常用協定元素
4.7.1名字一值對
4.7.2塊識別符
4.7.3塊大小
4.7.4校驗和
4.8小結
第5章有效模糊測試的需求
5.1可重現性與文檔
5.2可重用性
5.3過程狀態和過程深度
5.4跟蹤、代碼覆蓋和度量
5.5錯誤檢測
5.6資源約束
5.7小結
第二部分目標與自動化
第6章 自動化與數據生成
6.1 自動化的價值
6.2有用的工具和庫
6.2.1 ETHEREAL/WIRESHARK
6.2.2 LIBDASM和LIBDISASM
6.2.3 LIBNET/LIBNETNT
6.2.4 LIBPCAP
6.2.5 METRO PACKET LIBRARY
6.2.6 PTRACE
6.2.7 PYTHON擴展
6.3程式語言的選擇
6.4數據生成與模糊試探值(Fuzz Heuristics)
6.4.1 整數值
6.4.2字元串重複(String Repetitions)
6.4.3欄位分隔設定
6.4.4格式字元串
6.4.5字元翻譯
6.4.6 目錄遍歷
6.4.7命令注入
6.5 小結
第7章環境變數與參數模糊測試
7.1本地模糊測試介紹
7.1.1命令行參數
7.1.2環境變數
7.2本地模糊測試原則
7.3尋找測試目標
7.3.1 UNIX檔案許可權釋義
7.4本地模糊測試方法
7.5枚舉環境變數
7.5.1 GNU調試器(GNU Debug,GDB)法
7.6 自動化的環境變數模糊測試
7.6.1庫預載入(Library Preloading)
7.7檢測問題
7.8小結
第8章 自動化的環境變數與參數模糊測試
8.1 iFUZZ本地模糊測試器的功能
8.2開發iFUZZ工具
8.2.1 開發方法
8.3 iFUZZ使用的程式語言
8.4案例研究
8.5優點與改進
8.6 小結
第9章Web套用與伺服器模糊測試
9.1什麼是Web套用模糊測試
9.2測試目標
9.3測試方法
9.3.1設定目標環境
9.3.2輸入
9.4漏洞
9.5異常檢測
9.6小結
第10章Web套用和伺服器的自動化模糊測試
10.1 Web套用模糊測試器
10.2 WebFuzz的特性
10.2.1請求
10.2.2模糊變數
10.2.3 回響
10.3必備的背景信息
10.3.1識別請求
10.3.2檢測回響
10.4開發WelbFUZZ
10.4.1思路
10.4.2選擇程式語言
10.4.3設計
10.5案例研究
10.5.1目錄遍歷(Directory Traversal)
10.5.2溢出
10.5.3 SQL注入
10.5.4 XSS腳本
10.6優點與可能的改進
10.7小結
第11章檔案格式模糊測試
11.1測試目標
11.2測試方法
11.2.1 強制或基於變異的模糊測試
11.2.2智慧型強制或基於生成的模糊測試
11.3測試輸入
11.4安全漏洞
11.4.1拒絕服務(Daniel of Service,DoS)
11.4.2整數處理問題
11.4.3簡單的棧和堆溢出
11.4.4邏輯錯誤
11.4.5格式字元串
11.4.6競爭條件(Race Condition)
11.5檢測錯誤
11.6小結
第12章UNIX平台上的檔案格式自動化模糊測試
12.1 notSPIKEfile和SPIKEfile
12.1.1不具有的特性
12.2開發過程
12.2.1異常監測引擎
12.2.2異常報告(異常監測)
12.2.3模糊測試核心引擎
12.3有意義的代碼片段
12.3.1 UNIX 中常見的我們可能感興趣的信號
12.3.2我們不感興趣的信號
12.4 殭屍進程(Zombie Process)
12.5 使用注意事項
12.5.1 Adobe Acrobat
12.5.2 RealNetworks RealPlayer
12.6 案例研究:RealPlayer RealPix格式字元串漏洞
12.7 開發語言
12.8 小結
第13章 Windows平台上的檔案格式自動化模糊測試
13.1 Windows檔案格式漏洞
13.2 FileFuzz工具的功能
13.2.1 創建檔案
13.2.2 執行套用
13.2.3 異常檢測
13.2.4 保存好的審計(audit)
13.3 必需的背景信息
13.3.1 識別目標套用
13.4 FileFuzz工具的開發
13.4.1 開發方法
13.4.2 開發語言選擇
13.4.3 設計
13.5 案例研究
13.6 收益和改進空間
13.7 小結
第14章 網路協定的模糊測試
14.1 什麼是網路協定的模糊測試
14.2 測試目標套用
14.2.1 第二層:數據連結層
14.2.2 第三層:網路層
14.2.3 第四層:傳輸層
14.2.4 第五層:會話層
14.2.5 第六層:表示層
14.2.6 第七層:套用層
14.3 測試方法
14.3.1 強制(基於變異的)模糊測試
14.3.2 智慧型強制(基於生成的)模糊測試
14.3.3 通過修改客戶端進行變異模糊測試
14.4 錯誤檢測
14.4.1 手工方式(基於調試器)
14.4.2 自動化方式(基於代理)
14.4.3 其他來源
14.5 小結
第15章 UNIX平台上的自動化網路協定模糊測試
15.1 使用SPIKE進行模糊測試
15.1.1 選擇目標
15.1.2 協定分析
15.2 SPIKE必要知識
15.2.1 模糊引擎
15.2.2 基於行的通用TCP模糊測試器
15.3 基於塊的協定模型
15.4 其他的SPIKE特性
15.4.1 針對協定的模糊測試器
15.4.2 針對協定的模糊測試腳本
15.4.3 基於腳本的通用模糊測試器
15.5 編寫SPIKE NMAP模糊測試器腳本
15.6 小結
第16章 Windows平台上網路協定的模糊測試
16.1 功能
16.1.1 數據包結構
16.1.2 抓取數據
16.1.3 解析數據
16.1.4 模糊測試變數
16.1.5 傳送數據
16.2 必備的背景知識
16.2.1 檢測故障
16.2.2 協定驅動程式
16.3 開發
16.3.1 選擇程式語言
16.3.2 數據包抓取庫
16.3.3 設計
16.4 案例研究
16.5 好處與可改進之處
16.6 小結
第17章 Web瀏覽器的模糊測試
17.1 什麼是Web瀏覽器的模糊測試
17.2 目標
17.3 方法
17.3.1 測試方法
17.3.2 測試輸入
17.4 漏洞
17.5 檢測
17.6 小結
第18章 Web瀏覽器的自動化模糊測試
18.1 組件對象模型背景
18.1.1 COM簡史
18.1.2 對象與接口
18.1.3 ActiveX
18.2 開發模糊測試器
18.2.1 枚舉可被載入的AcriveX控制項
18.2.2 屬性、方法、參數與類型
18.2.3 模糊測試與監視
18.3 小結
第19章 記憶體的模糊測試
19.1 為什麼需要記憶體模糊測試?怎么進行
19.2 必要的背景信息
19.3 究竟什麼是記憶體模糊測試的簡要解釋
19.4 目標
19.5 記憶體模糊測試方法之變異循環插入(Mutation Loop Insertion)
19.6 記憶體模糊測試方法之快照恢復變異(Snapshot restoration mutation)
19.7 測試速度與處理深度
19.8 錯誤檢測
19.9 小結
第20章 記憶體的自動化模糊測試
20.1 記憶體模糊測試工具特性集
20.2 選擇開發語言
20.3 Windows調試API
20.4 整合上面的內容
20.4.1 如何在目標套用中特定的點放置“鉤子”
20.4.2 如何生成與恢復進程快照
20.4.3 選擇在何處放置鉤子
20.4.4 如何定位和變異目標記憶體空間
20.5 PyDbg,新的好朋友
20.6 一個人造的示例
20.7 小結
第三部分 高級模糊測試技術
第21章 模糊測試框架
21.1 什麼是模糊測試框架
21.2 現有的模糊測試框架
21.2.1 antiparser
21.2.2 Dfuz
21.2.3 SPIKE
21.2.4 Peach
21.2.5 通用目的模糊測試器
21.2.6 Autodafé
21.3 定製模糊測試器案例研究:Shockwave Flash
21.3.1 為SWF檔案建模
21.3.2 生成有效的數據
21.3.3 模糊測試環境
21.3.4 測試方法
21.4 模糊測試框架Sulley
21.4.1 Sulley的目錄結構
21.4.2 數據表示
21.4.3 會話
21.4.4 事後分析
21.4.5 一個完整的實例
21.5 小結
第22章 自動化協定分析
22.1 模糊測試的痛處在哪裡
22.2 啟發式技術
22.2.1 代理模糊測試
22.2.2 改進的代理模糊測試
22.2.3 反彙編啟發式
22.3 生物信息學
22.4 遺傳算法
22.5 小結
第23章 模糊測試器跟蹤
23.1 我們跟蹤的究竟是什麼
23.2 二進制可視化和基礎塊
23.2.1 控制流圖
23.2.2 控制流圖示例
23.3 構建一個模糊測試器跟蹤器
23.3.1 分析目標
23.3.2 跟蹤
23.3.3 交叉引用
23.4 分析一個代碼覆蓋工具
23.4.1 PStalker布局預覽
23.4.2 數據源
23.4.3 數據瀏覽
23.4.4 數據抓取
23.4.5 局限性
23.4.6 數據存儲
23.5 案例研究
23.5.1 測試策略
23.5.2 實際操作
23.6 好處與將來的改進
23.6.1 將來的改進
23.7 小結
第24章 智慧型錯誤檢測
24.1 原始的錯誤檢測技術
24.2 我們查找的是什麼
24.3 選擇模糊測試值的注意事項
24.4 自動化的調試器監視
24.4.1 一個基礎的調試器監視器
24.4.2 更高級的調試器監視器
24.5 首輪異常與末輪異常
24.6 動態二進制插裝
24.7 小結
第四部分 展望
第25章 我們學到了什麼
25.1 軟體開發生命周期
25.1.1 分析階段
25.1.2 設計階段
25.1.3 編碼階段
25.1.4 測試階段
25.1.5 維護階段
25.1.6 在軟體開發生命周期中實現模糊測試
25.2 開發者
25.3 QA研究者
25.4 安全研究者
25.5 小結
第26章 展望
26.1 商業工具
26.1.1 Beyond Security公司的beSTORM
26.1.2 BreakingPoint Systems的BPS—1000
26.1.3 Codenomicon
26.1.4 GLEG ProtoVer專業版
26.1.5 MU Security公司的MU—4000
26.1.6 Security Innovation公司的Holodeck
26.2 漏洞發現的混合方法
26.3 集成的測試平台
26.4 小結
附錄A 本書引用的小布希語錄之詳細解讀
索引
前言
原書序
致謝
關於作者
第一部分基礎知識
第1章 安全漏洞發現方法學
1.1 白盒測試
1.1.1代碼評審(Source Code Review)
1.1.2工具與自動化
1.1.3優點和缺點
1.2黑盒測試
1.2.1手工測試
1.2.2自動化測試或模糊測試
1.2.3優點和缺點
1.3灰盒測試
1.3.1二進制審計
1.3.2自動化的二進制審計
1.3.3優點和缺點
1.4小結
第2章什麼是模糊測試
2.1模糊測試的定義
2.2模糊測試的歷史
2.3模糊測試各階段
2.4模糊測試的局限性和期望
2.4.1訪問控制漏洞
2.4.2糟糕的設計邏輯
2.4.3後門
2.4.4破壞
2.4.5多階段安全漏洞(MuliStage Vulnerability)
2.5小結
第3章模糊測試方法與模糊測試器類型
3.1模糊測試方法
3.1.1預生成測試用例
3.1.2隨機生成輸入
3.1.3手工協定變異測試
3.1.4變異或強制性測試
3.1.5自動協定生成測試
3.2模糊測試器類型
3.2.1本地模糊器
3.2.2遠程模糊測試器
3.2.3存模糊測試器
3.2.4模糊測試框架
3.3小結
第4章數據表示和分析
4.1什麼是協定
4.2協定中的欄位
4.3簡單文本協定(Plain Text Protocols)
4.4二進制協定
4.5網路協定
4.6檔案格式
4.7常用協定元素
4.7.1名字一值對
4.7.2塊識別符
4.7.3塊大小
4.7.4校驗和
4.8小結
第5章有效模糊測試的需求
5.1可重現性與文檔
5.2可重用性
5.3過程狀態和過程深度
5.4跟蹤、代碼覆蓋和度量
5.5錯誤檢測
5.6資源約束
5.7小結
第二部分目標與自動化
第6章 自動化與數據生成
6.1 自動化的價值
6.2有用的工具和庫
6.2.1 ETHEREAL/WIRESHARK
6.2.2 LIBDASM和LIBDISASM
6.2.3 LIBNET/LIBNETNT
6.2.4 LIBPCAP
6.2.5 METRO PACKET LIBRARY
6.2.6 PTRACE
6.2.7 PYTHON擴展
6.3程式語言的選擇
6.4數據生成與模糊試探值(Fuzz Heuristics)
6.4.1 整數值
6.4.2字元串重複(String Repetitions)
6.4.3欄位分隔設定
6.4.4格式字元串
6.4.5字元翻譯
6.4.6 目錄遍歷
6.4.7命令注入
6.5 小結
第7章環境變數與參數模糊測試
7.1本地模糊測試介紹
7.1.1命令行參數
7.1.2環境變數
7.2本地模糊測試原則
7.3尋找測試目標
7.3.1 UNIX檔案許可權釋義
7.4本地模糊測試方法
7.5枚舉環境變數
7.5.1 GNU調試器(GNU Debug,GDB)法
7.6 自動化的環境變數模糊測試
7.6.1庫預載入(Library Preloading)
7.7檢測問題
7.8小結
第8章 自動化的環境變數與參數模糊測試
8.1 iFUZZ本地模糊測試器的功能
8.2開發iFUZZ工具
8.2.1 開發方法
8.3 iFUZZ使用的程式語言
8.4案例研究
8.5優點與改進
8.6 小結
第9章Web套用與伺服器模糊測試
9.1什麼是Web套用模糊測試
9.2測試目標
9.3測試方法
9.3.1設定目標環境
9.3.2輸入
9.4漏洞
9.5異常檢測
9.6小結
第10章Web套用和伺服器的自動化模糊測試
10.1 Web套用模糊測試器
10.2 WebFuzz的特性
10.2.1請求
10.2.2模糊變數
10.2.3 回響
10.3必備的背景信息
10.3.1識別請求
10.3.2檢測回響
10.4開發WelbFUZZ
10.4.1思路
10.4.2選擇程式語言
10.4.3設計
10.5案例研究
10.5.1目錄遍歷(Directory Traversal)
10.5.2溢出
10.5.3 SQL注入
10.5.4 XSS腳本
10.6優點與可能的改進
10.7小結
第11章檔案格式模糊測試
11.1測試目標
11.2測試方法
11.2.1 強制或基於變異的模糊測試
11.2.2智慧型強制或基於生成的模糊測試
11.3測試輸入
11.4安全漏洞
11.4.1拒絕服務(Daniel of Service,DoS)
11.4.2整數處理問題
11.4.3簡單的棧和堆溢出
11.4.4邏輯錯誤
11.4.5格式字元串
11.4.6競爭條件(Race Condition)
11.5檢測錯誤
11.6小結
第12章UNIX平台上的檔案格式自動化模糊測試
12.1 notSPIKEfile和SPIKEfile
12.1.1不具有的特性
12.2開發過程
12.2.1異常監測引擎
12.2.2異常報告(異常監測)
12.2.3模糊測試核心引擎
12.3有意義的代碼片段
12.3.1 UNIX 中常見的我們可能感興趣的信號
12.3.2我們不感興趣的信號
12.4 殭屍進程(Zombie Process)
12.5 使用注意事項
12.5.1 Adobe Acrobat
12.5.2 RealNetworks RealPlayer
12.6 案例研究:RealPlayer RealPix格式字元串漏洞
12.7 開發語言
12.8 小結
第13章 Windows平台上的檔案格式自動化模糊測試
13.1 Windows檔案格式漏洞
13.2 FileFuzz工具的功能
13.2.1 創建檔案
13.2.2 執行套用
13.2.3 異常檢測
13.2.4 保存好的審計(audit)
13.3 必需的背景信息
13.3.1 識別目標套用
13.4 FileFuzz工具的開發
13.4.1 開發方法
13.4.2 開發語言選擇
13.4.3 設計
13.5 案例研究
13.6 收益和改進空間
13.7 小結
第14章 網路協定的模糊測試
14.1 什麼是網路協定的模糊測試
14.2 測試目標套用
14.2.1 第二層:數據連結層
14.2.2 第三層:網路層
14.2.3 第四層:傳輸層
14.2.4 第五層:會話層
14.2.5 第六層:表示層
14.2.6 第七層:套用層
14.3 測試方法
14.3.1 強制(基於變異的)模糊測試
14.3.2 智慧型強制(基於生成的)模糊測試
14.3.3 通過修改客戶端進行變異模糊測試
14.4 錯誤檢測
14.4.1 手工方式(基於調試器)
14.4.2 自動化方式(基於代理)
14.4.3 其他來源
14.5 小結
第15章 UNIX平台上的自動化網路協定模糊測試
15.1 使用SPIKE進行模糊測試
15.1.1 選擇目標
15.1.2 協定分析
15.2 SPIKE必要知識
15.2.1 模糊引擎
15.2.2 基於行的通用TCP模糊測試器
15.3 基於塊的協定模型
15.4 其他的SPIKE特性
15.4.1 針對協定的模糊測試器
15.4.2 針對協定的模糊測試腳本
15.4.3 基於腳本的通用模糊測試器
15.5 編寫SPIKE NMAP模糊測試器腳本
15.6 小結
第16章 Windows平台上網路協定的模糊測試
16.1 功能
16.1.1 數據包結構
16.1.2 抓取數據
16.1.3 解析數據
16.1.4 模糊測試變數
16.1.5 傳送數據
16.2 必備的背景知識
16.2.1 檢測故障
16.2.2 協定驅動程式
16.3 開發
16.3.1 選擇程式語言
16.3.2 數據包抓取庫
16.3.3 設計
16.4 案例研究
16.5 好處與可改進之處
16.6 小結
第17章 Web瀏覽器的模糊測試
17.1 什麼是Web瀏覽器的模糊測試
17.2 目標
17.3 方法
17.3.1 測試方法
17.3.2 測試輸入
17.4 漏洞
17.5 檢測
17.6 小結
第18章 Web瀏覽器的自動化模糊測試
18.1 組件對象模型背景
18.1.1 COM簡史
18.1.2 對象與接口
18.1.3 ActiveX
18.2 開發模糊測試器
18.2.1 枚舉可被載入的AcriveX控制項
18.2.2 屬性、方法、參數與類型
18.2.3 模糊測試與監視
18.3 小結
第19章 記憶體的模糊測試
19.1 為什麼需要記憶體模糊測試?怎么進行
19.2 必要的背景信息
19.3 究竟什麼是記憶體模糊測試的簡要解釋
19.4 目標
19.5 記憶體模糊測試方法之變異循環插入(Mutation Loop Insertion)
19.6 記憶體模糊測試方法之快照恢復變異(Snapshot restoration mutation)
19.7 測試速度與處理深度
19.8 錯誤檢測
19.9 小結
第20章 記憶體的自動化模糊測試
20.1 記憶體模糊測試工具特性集
20.2 選擇開發語言
20.3 Windows調試API
20.4 整合上面的內容
20.4.1 如何在目標套用中特定的點放置“鉤子”
20.4.2 如何生成與恢復進程快照
20.4.3 選擇在何處放置鉤子
20.4.4 如何定位和變異目標記憶體空間
20.5 PyDbg,新的好朋友
20.6 一個人造的示例
20.7 小結
第三部分 高級模糊測試技術
第21章 模糊測試框架
21.1 什麼是模糊測試框架
21.2 現有的模糊測試框架
21.2.1 antiparser
21.2.2 Dfuz
21.2.3 SPIKE
21.2.4 Peach
21.2.5 通用目的模糊測試器
21.2.6 Autodafé
21.3 定製模糊測試器案例研究:Shockwave Flash
21.3.1 為SWF檔案建模
21.3.2 生成有效的數據
21.3.3 模糊測試環境
21.3.4 測試方法
21.4 模糊測試框架Sulley
21.4.1 Sulley的目錄結構
21.4.2 數據表示
21.4.3 會話
21.4.4 事後分析
21.4.5 一個完整的實例
21.5 小結
第22章 自動化協定分析
22.1 模糊測試的痛處在哪裡
22.2 啟發式技術
22.2.1 代理模糊測試
22.2.2 改進的代理模糊測試
22.2.3 反彙編啟發式
22.3 生物信息學
22.4 遺傳算法
22.5 小結
第23章 模糊測試器跟蹤
23.1 我們跟蹤的究竟是什麼
23.2 二進制可視化和基礎塊
23.2.1 控制流圖
23.2.2 控制流圖示例
23.3 構建一個模糊測試器跟蹤器
23.3.1 分析目標
23.3.2 跟蹤
23.3.3 交叉引用
23.4 分析一個代碼覆蓋工具
23.4.1 PStalker布局預覽
23.4.2 數據源
23.4.3 數據瀏覽
23.4.4 數據抓取
23.4.5 局限性
23.4.6 數據存儲
23.5 案例研究
23.5.1 測試策略
23.5.2 實際操作
23.6 好處與將來的改進
23.6.1 將來的改進
23.7 小結
第24章 智慧型錯誤檢測
24.1 原始的錯誤檢測技術
24.2 我們查找的是什麼
24.3 選擇模糊測試值的注意事項
24.4 自動化的調試器監視
24.4.1 一個基礎的調試器監視器
24.4.2 更高級的調試器監視器
24.5 首輪異常與末輪異常
24.6 動態二進制插裝
24.7 小結
第四部分 展望
第25章 我們學到了什麼
25.1 軟體開發生命周期
25.1.1 分析階段
25.1.2 設計階段
25.1.3 編碼階段
25.1.4 測試階段
25.1.5 維護階段
25.1.6 在軟體開發生命周期中實現模糊測試
25.2 開發者
25.3 QA研究者
25.4 安全研究者
25.5 小結
第26章 展望
26.1 商業工具
26.1.1 Beyond Security公司的beSTORM
26.1.2 BreakingPoint Systems的BPS—1000
26.1.3 Codenomicon
26.1.4 GLEG ProtoVer專業版
26.1.5 MU Security公司的MU—4000
26.1.6 Security Innovation公司的Holodeck
26.2 漏洞發現的混合方法
26.3 集成的測試平台
26.4 小結
附錄A 本書引用的小布希語錄之詳細解讀
索引
序言
譯 者 序
翻譯《模糊測試——強制發掘安全漏洞的利器》所花費的時間遠超譯者的預期,其過程也比想像得艱難很多。在開始翻譯本書之前,譯者曾樂觀地估計可以較快地完成本書的翻譯,可是真正開始之後才發現,由於本書的跨度大(從內容上,本書覆蓋了UNIX、Windows作業系統的諸多底層知識;模糊測試的對象從本地套用跨越到網路套用和Web套用;在工具層面,展示了讓人目不暇接的諸多工具;在擴展層面,還進入生物信息學,介紹了各種前沿的自動化協定分析的算法和工具),翻譯起來讓譯者不免心中惴惴。翻譯時遇到不能確定的地方,譯者只能反覆驗證,盡力避免錯漏;對於書中作者的小幽默,如果不能確切理解,也儘量反覆參照,盡力體現作者的原意。不得不說,如果沒有符隆美編輯的不斷催促和鼓勵,沒有家人的支持,恐怕譯者真不一定有勇氣投入這么多的周末和假期,最終完成這本書的翻譯。
不過,在“抱怨”投入了大量的時間來翻譯這本書之外,翻譯這本書的過程也著實讓譯者收穫不小。模糊測試是一個並不算新的領域,但這個領域得到足夠重視的歷史並不算長。最早,模糊測試是安全研究者手中的秘密武器,他們通過這種強力武器發現套用中存在的問題,把自己變成像魔術師一樣(這一點兒沒有誇張,我原來一直仰視那些能發現UNIX中稀奇古怪的漏洞的安全人員,但當從本書中發現我也可以做到同樣的事情時,就不再對這些曾經的“魔法師”心生敬畏了)。在那個年代,模糊測試僅出現在“美國黑帽大會”及其他以安全研究者為主的社區中,離普通的開發者和測試者甚為遙遠。但隨著軟體產品的數量越來越多,以及越來越多的主流套用被部署在網際網路上,安全性問題成了一個越來越嚴重的問題。在這種背景下,模糊測試技術才被更多的人接受,並逐漸開始走入一般組織的開發和測試群體中。
模糊測試是一種通過高度自動化的手段,在產品發布之前發現產品中存在的安全漏洞的測試方法,它的高度自動化和可重複的特性使得那些重視安全的前沿軟體企業早就接納了它。雖然模糊測試並不是安全性測試的唯一手段,但這種手段的有效性和效率已經得到了諸多大的軟體企業的證實。如本書所言,微軟建立了自己的安全性開發生命周期SDL,在整個產品開發周期中引入了模糊測試;而根據譯者的經歷,Google也在自己的產品開發過程中大量和普遍地使用模糊測試,幫助發現可能導致伺服器DoS問題或數據泄漏的漏洞。而且,在自動化之外,模糊測試還能夠充分利用測試執行者已有的知識,通過啟發式列表、智慧型數據集,甚至是遺傳算法等方法不斷提高模糊測試的有效性和效率。
本書可能不是模糊測試領域最權威或具有最高技術含量的書,但卻絕對是最系統和最具實踐性的書,沒有之一。無論你是開發工程師還是測試工程師,無論你是否有模糊測試或安全性測試的經驗,這本書都不會讓你失望。相信書中對模糊測試的系統性描述、列舉的立即可用的工具和精彩的案例分析,都能使讀者對安全性和模糊測試有較為深入的思考和體會。作為一種能夠有效降低安全性測試參與門檻的技術,模糊測試——你值得擁有。
本書的英文版成書於2007年(出版於2007年7月),書中作為示例的某些目標套用已經經歷了多次大的版本更新,甚至退出了市場,書中描述的工具可能也已經經歷了大的改進和提升,甚至書中提供的某些網站和網頁都已經不復存在,但貫穿在書中的方法並未過時。即使在這個雲計算已經不再新鮮、移動網際網路套用已經開始嶄露頭角的時代,要想對現有的雲套用和移動設備上的應用程式進行模糊測試,仍然可以在本書中輕易地找到對應的方法與工具。“時間是判斷經典的最好方法”這句話對本書來說非常適用,儘管成書的時間離現在已有6年(在計算機領域,6年可是相當長的時間!),但是,本書的核心價值絲毫沒有被時間所影響。本書風格輕鬆,內容深入淺出(作者在序中特別提到,這本書在寫作時儘量兼顧對模糊測試有實踐經驗和沒有經驗的讀者),雖然覆蓋了相當多的主題,但每個主題的講述都相當系統,既有理論框架的講解,也有工具使用的介紹,甚至還包括具體的案例分析。譯者在翻譯的過程中常常有豁然開朗的感覺,希望本書的各位讀者在細品本書時,也同樣有豁然開朗之後的喜悅之情。
當然,由於本書中涉及的內容較多,自然對讀者的預備知識也有一定的要求。不過,本書的幾位作者已經充分考慮到了對模糊測試領域不熟悉的讀者的需求,因此,只要讀者具有一定的編碼基礎(本書中使用了Python、C#等多種程式語言,讀者無須對本書涉及的這些語言都非常熟悉,但需要有一定的對編碼的了解),對書中涉及的作業系統(Windows和Unix/Linux作業系統)和計算機網路有所了解,就能夠順利地閱讀本書,並從中獲得不小的收益。
介紹完本書的內容,接下來對本書的翻譯進行一些說明。首先,為了儘量保持本書的“原汁原味”,譯者保留了原書的所有內容,包括原書的前言、序、致謝、索引等。對於書中饒有特色的每章開頭的小布希的語錄,本書也儘量保持原味,以原始英文的形式添加在每一章開頭。小布希總統以語言能力差和濃重的德州口音著稱,本書每一章開頭引用的語錄都帶有非常有趣的錯誤(語法錯誤、辭不達意或其他問題),有興趣的讀者可以嘗試自己端詳和揣摩,看看能不能發現其中的有趣之處。當然,為了方便讀者,本書最後的附錄也給出了譯者對每一條引用語錄的解讀,供讀者參考。
本書的譯者有兩位,主要的譯者是段念,翻譯了本書的大部分內容並負責統稿,另一位譯者是趙勇,承擔了本書的第9章、第10章、第14章的翻譯工作。雖然譯者已經盡力使本書能夠以較為完美的形態出現在讀者面前,但由於譯者能力所限,如在書中出現錯誤和疏漏,還請讀者不吝指正。
最後,感謝電子工業出版社的符隆美編輯,沒有她的耐心和堅定的推動,這本書的翻譯是否能最終完成尚不可知;感謝各位參與稿件審閱的評審,你們的意見為本書增色不少;我個人還要感謝我的家人,感謝我的母親對我們的照顧,感謝我的妻子和兒子,你們容忍了我在許多個周末和晚上把本應該陪你們的時間投入在本書上,在我快要失去耐心的時候繼續給我動力。
段念
2013年4月8日
原 書 序
"I Know the human being and fish can coexist peacefully."
——George W. Bush, Saginaw, Mich., Sept. 29, 2000
本書介紹
模糊測試的概念已經存在了將近20年,但直到最近,模糊測試才得到廣泛的關注。2006年,流行的客戶端套用,包括微軟的Internet Explorer、Word以及Excel等都受到了大量漏洞的影響,而這些漏洞中的大部分是通過模糊測試發現的。模糊測試的有效套用催生了新的工具,也導致越來越多的漏洞被發現。另外,作為第一本模糊測試方面的正式出版書籍,本書也說明了大眾對模糊測試的興趣越來越大。
由於多年來一直混跡於漏洞研究社區,我們已經在日常工作中使用過許多模糊測試技術,從不成熟的hobby項目到成熟的商業產品。本書的每位作者都擁有開發私有和公開的模糊測試器的經驗。希望這本混合了我們幾位作者的經驗和研究項目的前沿書籍能夠給讀者帶來收穫。
適合閱讀本書的讀者
安全性書籍和文章通常由安全性研究者寫成,目標讀者同樣是安全性研究者。我們強烈地相信,如果安全性仍然只由安全性團隊來負責,漏洞的數量和嚴重性將繼續增長。因此,我們盡最大的努力使得本書可以面向更廣泛的人群,包括模糊測試新手和在這方面有經驗的讀者。
指望僅僅在產品發布前由安全團隊快速進行審計就能發布出安全的套用是不現實的。開發人員和QA團隊再也不能說“安全性不是我的問題——我們有安全團隊為此操心”了。安全性現在必須成為每個人的問題。安全性必須貫穿軟體開發生命周期(SDLC)的各個階段,而不是僅僅在最後階段。
要求開發和QA團隊關注安全性可能是一種苛求,尤其是對那些以前從未被如此要求的團隊來說。我們相信模糊測試提供了一種面向更廣客群的獨特的漏洞發現方法,因為模糊測試可以高度自動化地運行。在期望安全研究者可以從本書中獲得有價值信息的同時,我們也希望開發者和QA團隊同樣可以從本書中得到有價值的信息。模糊測試可以而且應該成為集成在軟體開發生命周期中的一個部分,它不僅應該出現在測試階段,也應該出現在開發階段。越早發現缺陷,修復缺陷的代價就越低。
讀者應該具有的預備知識(Prerequisites)
模糊測試是一個覆蓋面很廣的主題。在本書中我們涉及了一些並非專門面向模糊測試的主題,也假定讀者具有一些預備知識。在閱讀本書之前,讀者至少應該對編程、計算機網路有基本的了解。模糊測試完全是自動化的安全測試,因此很自然地,本書的許多內容都與工具構建相關。我們故意為這些任務選擇了多種程式語言。我們根據手頭的任務選擇程式語言,但程式語言的多樣化也表明模糊測試可以使用多種方式達成。讀者當然不必了解本書中用到的所有程式語言,但理解一兩種語言將有助於讀者從這些章節中收穫更多。
在本書中我們描述了許多漏洞的細節,並討論了如何通過模糊測試來發現這些漏洞。然而,定義或研究漏洞本身並不是我們的目標。目前已經有不少出色的書籍討論了這方面的主題。如果你想要尋找軟體漏洞方面的經典書籍,Greg Hoglund的《軟體剖析》(Exploiting Software)和《黑客大曝光》(Hacking Exposed)系列,以及Jack Kiziol和David Litchfield的《Shellcoder手冊》(Shellcoder's Handbook)等都是不錯的參考。
翻譯《模糊測試——強制發掘安全漏洞的利器》所花費的時間遠超譯者的預期,其過程也比想像得艱難很多。在開始翻譯本書之前,譯者曾樂觀地估計可以較快地完成本書的翻譯,可是真正開始之後才發現,由於本書的跨度大(從內容上,本書覆蓋了UNIX、Windows作業系統的諸多底層知識;模糊測試的對象從本地套用跨越到網路套用和Web套用;在工具層面,展示了讓人目不暇接的諸多工具;在擴展層面,還進入生物信息學,介紹了各種前沿的自動化協定分析的算法和工具),翻譯起來讓譯者不免心中惴惴。翻譯時遇到不能確定的地方,譯者只能反覆驗證,盡力避免錯漏;對於書中作者的小幽默,如果不能確切理解,也儘量反覆參照,盡力體現作者的原意。不得不說,如果沒有符隆美編輯的不斷催促和鼓勵,沒有家人的支持,恐怕譯者真不一定有勇氣投入這么多的周末和假期,最終完成這本書的翻譯。
不過,在“抱怨”投入了大量的時間來翻譯這本書之外,翻譯這本書的過程也著實讓譯者收穫不小。模糊測試是一個並不算新的領域,但這個領域得到足夠重視的歷史並不算長。最早,模糊測試是安全研究者手中的秘密武器,他們通過這種強力武器發現套用中存在的問題,把自己變成像魔術師一樣(這一點兒沒有誇張,我原來一直仰視那些能發現UNIX中稀奇古怪的漏洞的安全人員,但當從本書中發現我也可以做到同樣的事情時,就不再對這些曾經的“魔法師”心生敬畏了)。在那個年代,模糊測試僅出現在“美國黑帽大會”及其他以安全研究者為主的社區中,離普通的開發者和測試者甚為遙遠。但隨著軟體產品的數量越來越多,以及越來越多的主流套用被部署在網際網路上,安全性問題成了一個越來越嚴重的問題。在這種背景下,模糊測試技術才被更多的人接受,並逐漸開始走入一般組織的開發和測試群體中。
模糊測試是一種通過高度自動化的手段,在產品發布之前發現產品中存在的安全漏洞的測試方法,它的高度自動化和可重複的特性使得那些重視安全的前沿軟體企業早就接納了它。雖然模糊測試並不是安全性測試的唯一手段,但這種手段的有效性和效率已經得到了諸多大的軟體企業的證實。如本書所言,微軟建立了自己的安全性開發生命周期SDL,在整個產品開發周期中引入了模糊測試;而根據譯者的經歷,Google也在自己的產品開發過程中大量和普遍地使用模糊測試,幫助發現可能導致伺服器DoS問題或數據泄漏的漏洞。而且,在自動化之外,模糊測試還能夠充分利用測試執行者已有的知識,通過啟發式列表、智慧型數據集,甚至是遺傳算法等方法不斷提高模糊測試的有效性和效率。
本書可能不是模糊測試領域最權威或具有最高技術含量的書,但卻絕對是最系統和最具實踐性的書,沒有之一。無論你是開發工程師還是測試工程師,無論你是否有模糊測試或安全性測試的經驗,這本書都不會讓你失望。相信書中對模糊測試的系統性描述、列舉的立即可用的工具和精彩的案例分析,都能使讀者對安全性和模糊測試有較為深入的思考和體會。作為一種能夠有效降低安全性測試參與門檻的技術,模糊測試——你值得擁有。
本書的英文版成書於2007年(出版於2007年7月),書中作為示例的某些目標套用已經經歷了多次大的版本更新,甚至退出了市場,書中描述的工具可能也已經經歷了大的改進和提升,甚至書中提供的某些網站和網頁都已經不復存在,但貫穿在書中的方法並未過時。即使在這個雲計算已經不再新鮮、移動網際網路套用已經開始嶄露頭角的時代,要想對現有的雲套用和移動設備上的應用程式進行模糊測試,仍然可以在本書中輕易地找到對應的方法與工具。“時間是判斷經典的最好方法”這句話對本書來說非常適用,儘管成書的時間離現在已有6年(在計算機領域,6年可是相當長的時間!),但是,本書的核心價值絲毫沒有被時間所影響。本書風格輕鬆,內容深入淺出(作者在序中特別提到,這本書在寫作時儘量兼顧對模糊測試有實踐經驗和沒有經驗的讀者),雖然覆蓋了相當多的主題,但每個主題的講述都相當系統,既有理論框架的講解,也有工具使用的介紹,甚至還包括具體的案例分析。譯者在翻譯的過程中常常有豁然開朗的感覺,希望本書的各位讀者在細品本書時,也同樣有豁然開朗之後的喜悅之情。
當然,由於本書中涉及的內容較多,自然對讀者的預備知識也有一定的要求。不過,本書的幾位作者已經充分考慮到了對模糊測試領域不熟悉的讀者的需求,因此,只要讀者具有一定的編碼基礎(本書中使用了Python、C#等多種程式語言,讀者無須對本書涉及的這些語言都非常熟悉,但需要有一定的對編碼的了解),對書中涉及的作業系統(Windows和Unix/Linux作業系統)和計算機網路有所了解,就能夠順利地閱讀本書,並從中獲得不小的收益。
介紹完本書的內容,接下來對本書的翻譯進行一些說明。首先,為了儘量保持本書的“原汁原味”,譯者保留了原書的所有內容,包括原書的前言、序、致謝、索引等。對於書中饒有特色的每章開頭的小布希的語錄,本書也儘量保持原味,以原始英文的形式添加在每一章開頭。小布希總統以語言能力差和濃重的德州口音著稱,本書每一章開頭引用的語錄都帶有非常有趣的錯誤(語法錯誤、辭不達意或其他問題),有興趣的讀者可以嘗試自己端詳和揣摩,看看能不能發現其中的有趣之處。當然,為了方便讀者,本書最後的附錄也給出了譯者對每一條引用語錄的解讀,供讀者參考。
本書的譯者有兩位,主要的譯者是段念,翻譯了本書的大部分內容並負責統稿,另一位譯者是趙勇,承擔了本書的第9章、第10章、第14章的翻譯工作。雖然譯者已經盡力使本書能夠以較為完美的形態出現在讀者面前,但由於譯者能力所限,如在書中出現錯誤和疏漏,還請讀者不吝指正。
最後,感謝電子工業出版社的符隆美編輯,沒有她的耐心和堅定的推動,這本書的翻譯是否能最終完成尚不可知;感謝各位參與稿件審閱的評審,你們的意見為本書增色不少;我個人還要感謝我的家人,感謝我的母親對我們的照顧,感謝我的妻子和兒子,你們容忍了我在許多個周末和晚上把本應該陪你們的時間投入在本書上,在我快要失去耐心的時候繼續給我動力。
段念
2013年4月8日
原 書 序
"I Know the human being and fish can coexist peacefully."
——George W. Bush, Saginaw, Mich., Sept. 29, 2000
本書介紹
模糊測試的概念已經存在了將近20年,但直到最近,模糊測試才得到廣泛的關注。2006年,流行的客戶端套用,包括微軟的Internet Explorer、Word以及Excel等都受到了大量漏洞的影響,而這些漏洞中的大部分是通過模糊測試發現的。模糊測試的有效套用催生了新的工具,也導致越來越多的漏洞被發現。另外,作為第一本模糊測試方面的正式出版書籍,本書也說明了大眾對模糊測試的興趣越來越大。
由於多年來一直混跡於漏洞研究社區,我們已經在日常工作中使用過許多模糊測試技術,從不成熟的hobby項目到成熟的商業產品。本書的每位作者都擁有開發私有和公開的模糊測試器的經驗。希望這本混合了我們幾位作者的經驗和研究項目的前沿書籍能夠給讀者帶來收穫。
適合閱讀本書的讀者
安全性書籍和文章通常由安全性研究者寫成,目標讀者同樣是安全性研究者。我們強烈地相信,如果安全性仍然只由安全性團隊來負責,漏洞的數量和嚴重性將繼續增長。因此,我們盡最大的努力使得本書可以面向更廣泛的人群,包括模糊測試新手和在這方面有經驗的讀者。
指望僅僅在產品發布前由安全團隊快速進行審計就能發布出安全的套用是不現實的。開發人員和QA團隊再也不能說“安全性不是我的問題——我們有安全團隊為此操心”了。安全性現在必須成為每個人的問題。安全性必須貫穿軟體開發生命周期(SDLC)的各個階段,而不是僅僅在最後階段。
要求開發和QA團隊關注安全性可能是一種苛求,尤其是對那些以前從未被如此要求的團隊來說。我們相信模糊測試提供了一種面向更廣客群的獨特的漏洞發現方法,因為模糊測試可以高度自動化地運行。在期望安全研究者可以從本書中獲得有價值信息的同時,我們也希望開發者和QA團隊同樣可以從本書中得到有價值的信息。模糊測試可以而且應該成為集成在軟體開發生命周期中的一個部分,它不僅應該出現在測試階段,也應該出現在開發階段。越早發現缺陷,修復缺陷的代價就越低。
讀者應該具有的預備知識(Prerequisites)
模糊測試是一個覆蓋面很廣的主題。在本書中我們涉及了一些並非專門面向模糊測試的主題,也假定讀者具有一些預備知識。在閱讀本書之前,讀者至少應該對編程、計算機網路有基本的了解。模糊測試完全是自動化的安全測試,因此很自然地,本書的許多內容都與工具構建相關。我們故意為這些任務選擇了多種程式語言。我們根據手頭的任務選擇程式語言,但程式語言的多樣化也表明模糊測試可以使用多種方式達成。讀者當然不必了解本書中用到的所有程式語言,但理解一兩種語言將有助於讀者從這些章節中收穫更多。
在本書中我們描述了許多漏洞的細節,並討論了如何通過模糊測試來發現這些漏洞。然而,定義或研究漏洞本身並不是我們的目標。目前已經有不少出色的書籍討論了這方面的主題。如果你想要尋找軟體漏洞方面的經典書籍,Greg Hoglund的《軟體剖析》(Exploiting Software)和《黑客大曝光》(Hacking Exposed)系列,以及Jack Kiziol和David Litchfield的《Shellcoder手冊》(Shellcoder's Handbook)等都是不錯的參考。