二進制分析實戰 Practical Binary Analysis: Build Your Own Linux Tools for Binary Instrumentation, Analysis, and Disassembly

[荷]丹尼斯·安德裡斯(Dennis Andriesse)

  • 二進制分析實戰-preview-1
  • 二進制分析實戰-preview-2
二進制分析實戰-preview-1

買這商品的人也買了...

商品描述

如今,讀者可以找到許多關於匯編的書籍,甚至可以找到更多有關ELF和PE二進制格式的說明。關於信息流跟蹤和符號執行也有大量的文章。但是,沒有哪本書可以向讀者展示從理解基本匯編知識到進行高級二進制分析的全過程。也沒有哪本書可以向讀者展示如何插樁二進製程序、如何使用動態污點分析來跟蹤程序執行過程中的數據或使用符號執行來自動生成漏洞利用程序。換句話說,直到現在,沒有一本書可以教你二進制分析所需的技術、工具和思維方式。

作者簡介

丹尼斯·安德里斯,系統與網絡安全專業的博士,主要研究二進制分析領域。丹尼斯·安德里斯是PathArmor(一個控制流完整性分析系統,可抵抗諸如ROP這樣的控制流劫持攻擊)的主要開發人員,還是參與攻破“GameOver Zeus”殭屍網絡的主要攻手之一。

目錄大綱

部分二進制格式
章二進制簡介2
1.1C編譯過程3
1.1.1預處理階段3
1.1.2編譯階段5
1.1.3彙編階段6
1.1.4鏈接階段7
1.2符號和剝離的二進製文件9
1.2.1查看符號信息9
1.2.2剝離二進製文件10
1.3反彙編二進製文件11
1.3.1查看對象文件11
1.3.2檢查完整的二進制執行體13
1.4加載並執行二進製文件17
1.5總結19
1.6練習19
第2章ELF格式20
2.1ELF頭部22
2.1.1e_ident數組22
2.1.2e_type、e_machine及e_version字段24
2.1.3e_entry字段24
2.1.4e_phoff和e_shoff字段25
2.1.5e_flags字段25
2.1.6e_ehsize字段25
2.1.7e_*entsize和e_*num字段25
2.1.8e_shstrndx字段26
2.2節頭26
2.2.1sh_name字段27
2.2.2sh_type字段28
2.2.3sh_flags字段28
2.2.4sh_addr、sh_offset及sh_size字段29
2.2.5sh_link字段29
2.2.6sh_info字段29
2.2.7sh_addralign字段29
2.2.8sh_entsize字段29
2.3節30
2.3.1. init和. fini節31
2.3.2. text節31
2.3.3. bss、. data及. rodata節33
2.3.4延遲綁定和. plt、. got及. got. plt節33
2.3.5. rel. *和. rela. *節36
2.3.6. dynamic節37
2.3.7. init_array和. fini_array節38
2.3.8. shstrtab、. symtab、. strtab、. dynsym及. dynstr節39
2.4程序頭40
2.4.1p_type字段41
2.4.2p_flags字段42
2.4.3p_offset、p_vaddr、p_paddr、p_filesz及p_memsz字段42
2.4.4p_align字段42
2.5總結42
2.6練習43
第3章PE格式簡介44
3.1MS-DOS頭和MS-DOS存根45
3.2PE簽名、PF文件頭及PE可選頭46
3.2.1PE簽名48
3.2.2PE文件頭48
3.2.3PE可選頭48
3.3節表49
3.4節49
3.4.1. edata和. idata節50
3.4.2PE代碼節的填充51
3.5總結51
3.6練習51
第4章使用libbfd創建二進制加載器53
4.1什麼是libbfd53
4.2一個簡單的二進制加載接口54
4.2.1Binary類56
4.2.2Section類57
4.2.3Symbol類57
4.3實現二進制加載器57
4.3.1初始化libbfd並打開二進製文件58
4.3.2解析基礎二進制屬性60
4.3.3加載符號63
4.3.4加載節信息66
4.4測試二進制加載器68
4.5總結71
4.6練習71
第二部分二進制分析基礎
第5章Linux二進制分析74
5.1使用file解決類型問題75
5.2使用ldd探索依賴性77
5.3使用xxd查看文件內容79
5.4使用readelf解析並提取ELF庫文件81
5.5使用nm解析符號83
5.6使用strings查看Hints86
5.7使用strace和ltrace跟踪系統調用和庫文件調用88
5.8使用objdump檢查指令集行為93
5.9使用GDB轉儲動態字符串緩衝區95
5.10總結97
5.11練習97
第6章反彙編與二進制分析基礎98
6.1靜態反彙編98
6.1.1線性反彙編99
6.1.2遞歸反彙編101
6.2動態反彙編104
6.2.1示例:使用GDB跟踪二進制執行105
6.2.2代碼覆蓋策略108
6.3構建反彙編代碼和數據111
6.3.1構建代碼112
6.3.2構建數據118
6.3.3反編譯119
6.3.4中間語言121
基本分析方法123
. 1二進制分析的特性123
. 2控制流分析127
. 3數據流分析129
6.5編譯器設置對反彙編的影響132
6.6總結133
6.7練習134
第7章簡單的ELF代碼注入技術135
7.1使用十六進制編輯器修改裸機二進製文件135
7.1.1在操作中觀察off-by-one漏洞136
7.1.2修復off-by-one漏洞139
7.2使用LD_PRELOAD修改共享庫行為142
7.2.1堆溢出漏洞143
7.2.2檢測堆溢出145
7.3注入代碼節148
7.3.1注入ELF節:不錯概述149
7.3.2使用elfinject注入ELF節151
7.4調用注入的代碼155
7.4.1入口點修改155
7.4.2劫持構造函數和析構函數158
7.4.3劫持GOT條目161
7.4.4劫持PLT條目1
7.4.5重定向直接調用和間接調用165
7.5總結166
7.6練習166
第三部分不錯二進制分析
第8章自定義反彙編168
8.1為什麼要自定義反彙編過程168
8.1.1一個自定義反彙編實例:代碼混淆169
8.1.2編寫自定義反彙編器的其他原因171
8.2Capstone介紹172
8.2.1Capstone安裝173
8.2.2Capstone線性反彙編174
8.2.3研究CapstoneC的API179
8.2.4使用Capstone編寫遞歸反彙編器180
8.3實現一個ROP小工具掃描器188
8.3.1返回導向式編程簡介189
8.3.2尋找ROP的“gadget”190
8.4總結196
8.5練習197
第9章二進制插樁198
9.1什麼是二進制插樁198
9.1.1二進制插樁的相關API199
9.1.2靜態二進制插樁和動態二進制插樁的對比199
9.2靜態二進制插樁201
9.2.1int3方法201
9.2.2跳板方法203
9.3動態二進制插樁207
9.3.1DBI系統的體系結構207
9.3.2Pin介紹209
9.4使用Pin進行分析210
9.4.1Profiler的數據結構和創建代碼210
9.4.2解析函數符號213
9.4.3插樁基本塊214
9.4.4檢測控制流指令216
9.4.5指令、控制轉移及系統調用計數219
9.4.6測試Profiler220
9.5用Pin自動對二進製文件脫殼224
9.5.1可執行文件加殼器簡介224
9.5.2脫殼器的配置代碼及其使用的數據結構225
9.5.3對內存寫入插樁228
9.5.4插樁控制流指令229
9.5.5跟踪內存寫入229
9.5.6檢測原始入口點並轉儲脫殼二進製文件230
9.5.7測試脫殼器231
9.6總結236
9.7練習236
0章動態污點分析的原理237
10.1什麼是DTA237
10.2DTA三步:污點源、污點槽及污點傳播238
10.2.1定義污點源238
10.2.2定義污點槽239
10.2.3追踪污點傳播239
10.3使用DTA檢測心臟滴血漏洞239
10.3.1心臟滴血漏洞概述239
10.3.2通過污點分析檢測心臟滴血漏洞241
10.4DTA設計因素:污點粒度、污點顏色及污點傳播策略242
10.4.1污點粒度243
10.4.2污點顏色244
10.4.3污點傳播策略244
10.4.4過污染和欠污染246
10.4.5控制依賴246
10.4.6影子內存247
10.5總結249
10.6練習249
1章基於libdft的動態污點分析250
11.1libdft簡介250
11.1.1libdft的內部結構251
11.1.2污點傳播策略指令253
11.2使用DTA檢測遠程控制流劫持攻擊254
11.2.1檢查污點信息257
11.2.2污點源:將收到的字節標記為污點258
11.2.3檢查點:檢查execve參數260
11.2.4檢測控制流劫持攻擊261
11.3用隱式流繞過DTA266
11.4基於DTA的數據洩露檢測器268
11.4.1污點源:追踪打開文件的污點270
11.4.2檢查點:監控洩露數據的網絡發送273
11.4.3檢測數據洩露275
11.5總結277
11.6練習277
2章符號執行原理278
12.1符號執行概述278
12.1.1符號執行與正常執行的對比279
12.1.2符號執行的變體和局限282
12.1.3提高符號執行的可擴展性286
12.2使用Z3進行約束求解288
12.2.1證明指令的可達性288
12.2.2證明指令的不可達性291
12.2.3證明公式的永真性292
12.2.4簡化表達式293
12.2.5使用位向量對機器碼建立約束模型294
12.2.6用位向量求解不透明謂詞296
12.3總結296
12.4練習297
3章使用Triton實現符號執行298
13.1Triton的介紹298
13.2使用抽象語法樹維護符號狀態299
13.2.1完整的抽象語法樹301
13.2.2使用引用的抽象語法樹301
13.3使用Triton進行後向切片302
13.3.1Triton的頭文件以及相關配置304
13.3.2符號化配置文件305
13.3.3模擬指令306
13.3.4設置Triton的體系結構307
13.3.5計算後向切片308
13.4使用Triton提升代碼覆蓋率310
13.4.1創建符號變量312
13.4.2尋找新路徑的解313
13.4.3測試代碼覆蓋工具316
13.5漏洞利用自動化319
13.5.1包含脆弱調用點的程序320
13.5.2查找脆弱調用點的地址323
13.5.3構建漏洞利用生成器325
13.5.4獲取root權限的Shell331
13.6總結334
13.7練習334
第四部分附錄
附錄Ax86彙編快速入門336
A. 1彙編程序的佈局336
A. 1.1彙編指令、偽指令、標號及註釋337
A. 1.2代碼與數據分離338
A. 1.3AT&T和Intel語法339
A. 2x86指令結構339
A. 2.1x86指令的彙編層表示339
A. 2.2x86指令的機器級結構339
A. 2.3寄存器操作數340
A. 2.4內存操作數342
A. 2.5立即數343
A. 3常見的x86指令343
A. 3.1比較操作數和設置狀態標誌位344
A. 3.2實現系統調用345
A. 3.3實現條件跳轉345
A. 3.4加載內存地址345
A. 4彙編的通用代碼構造345
A. 4.1棧346
A. 4.2函數調用與函數棧幀347
A. 4.3條件分支351
A. 4.4循環352
附錄B使用libelf實現PT_NOTE覆蓋354
B. 1請求頭354
B. 2elfinject使用的數據結構355
B. 3初始化libelf356
B. 4獲取可執行頭360
B. 5查找PT_NOTE段360
B. 6注入代碼362
B. 7為註入的節對齊加載地址362
B. 8覆蓋. note. ABI-tag節頭363
B. 9設置注入節的名稱367
B. 10覆蓋PT_NOTE程序頭369
B. 11修改入口點372
附錄C二進制分析工具清單373
C. 1反彙編工具373
C. 1.1IDAPro(Windows、Linux、macOS)373
C. 1.2Hopper(Linux、macOS)373
C. 1.3ODA(所有操作系統)374
C. 1.4BinaryNinja(Windows、Linux、macOS)374
C. 1.5Relyze(Windows)374
C. 1.6Medusa(Windows、Linux)374
C. 1.7radare(Windows、Linux、macOS)374
C. 1.8objdump(Linux、macOS)374
C. 2調試器374
C. 2.1GDB(Linux)374
C. 2.2OllyDbg(Windows)375
C. 2.3Windbg(Windows)375
C. 2.4Bochs(Windows、Linux、macOS)375
C. 3反彙編框架375
C. 3.1Capstone(Windows、Linux、macOS)375
C. 3.2distorm3(Windows、Linux、macOS)375
C. 3.3udis86(Linux、macOS)375
C. 4二進制分析框架376
C. 4.1angr(Windows、Linux、macOS)376
C. 4.2Pin(Windows、Linux、macOS)376
C. 4.3Dyninst(Windows、Linux)376
C. 4.4Unicorn(Windows、Linux、macOS)376
C. 4.5libdft(Linux)376
C. 4.6Triton(Windows、Linux、macOS)376