本書專注于Linux二進制安全。全書包含12章,從二進制底層開始,結合源碼詳細分析了常見的二進制安全漏洞、緩解機制以及漏洞利用方法,并輔以分析工具和環(huán)境搭建的講解。本書在素材的選擇上較為連續(xù)、完整,每個知識點均配以經典例題,并花費了大量篇幅深入講解,以最大程度地還原分析思路和解題過程。讀者完全可以依據本書自主、系統(tǒng)性地學習,達到舉一反三的效果。本書主要面向CTF初學者,也適合對CTF感興趣的人群學習。
楊超,畢業(yè)于西安電子科技大學,L-Team成員。目前就職于中國汽研北京分院,從事車聯(lián)網安全研究和工具開發(fā)工作。曾任職于海康威視、斗象科技;钴S在開源社區(qū), GitHub:firmianay。騰訊eee戰(zhàn)隊,騰訊安全2016年成立的一支具有國際先進技術實戰(zhàn)能力的CTF戰(zhàn)隊。戰(zhàn)隊核心成員均來自騰訊安全科恩實驗室,導師由騰訊安全科恩實驗室負責人、國際著名網絡安全專家吳石擔任。目前,戰(zhàn)隊成員已連續(xù)4年參與征戰(zhàn)DEFCON決賽,并在HITCON、PlaidCTF、SECCON等世界頂級安全賽事中,不斷刷新戰(zhàn)隊歷史最好成績,為國際間的技術交流與人才培養(yǎng)奠定基礎。同時,戰(zhàn)隊還積極參與國內賽事演練,并在2018年連續(xù)榮膺中國網絡安全三大國賽——“強網杯”“網鼎杯”和“護網杯”賽事冠軍,成為第一個實現(xiàn)國賽大滿貫的戰(zhàn)隊;2019年,戰(zhàn)隊再度蟬聯(lián)“強網杯”線上、線下賽冠軍。2020年,戰(zhàn)隊獲得第四屆“強網杯”亞軍。
第1章CTF簡介
1.1賽事介紹
1.1.1賽事起源
1.1.2競賽模式
1.1.3競賽內容
1.2知名賽事及會議
1.2.1網絡安全競賽
1.2.2網絡安全會議
1.2.3網絡安全學術會議
1.3學習經驗
1.3.1二進制安全入門
1.3.2CTF經驗8
1.3.3對安全從業(yè)者的建議8
第2章二進制文件
2.1從源代碼到可執(zhí)行文件11
2.1.1編譯原理11
2.1.2GCC編譯過程12
2.1.3預處理階段13
2.1.4編譯階段14
2.1.5匯編階段15
2.1.6鏈接階段15
2.2ELF文件格式16
2.2.1ELF文件的類型16
2.2.2ELF文件的結構18
2.2.3可執(zhí)行文件的裝載24
2.3靜態(tài)鏈接26
2.3.1地址空間分配26
2.3.2靜態(tài)鏈接的詳細過程27
2.3.3靜態(tài)鏈接庫29
2.4動態(tài)鏈接30
2.4.1什么是動態(tài)鏈接30
2.4.2位置無關代碼31
2.4.3延遲綁定32
第3章匯編基礎
3.1CPU架構與指令集34
3.1.1指令集架構34
3.1.2CISC與RISC對比35
3.2x86/x64匯編基礎36
3.2.1CPU操作模式36
3.2.2語法風格36
3.2.3寄存器與數據類型37
3.2.4數據傳送與訪問38
3.2.5算術運算與邏輯運算39
3.2.6跳轉指令與循環(huán)指令40
3.2.7棧與函數調用41
第4章Linux安全機制
4.1Linux基礎45
4.1.1常用命令45
4.1.2流、管道和重定向46
4.1.3根目錄結構47
4.1.4用戶組及文件權限47
4.1.5環(huán)境變量49
4.1.6procfs文件系統(tǒng)51
4.1.7字節(jié)序52
4.1.8調用約定53
4.1.9核心轉儲54
4.1.10系統(tǒng)調用55
4.2StackCanaries58
4.2.1簡介58
4.2.2實現(xiàn)61
4.2.3NJCTF2017:messager63
4.2.4sixstarsCTF2018:babystack65
4.3No-eXecute69
4.3.1簡介69
4.3.2實現(xiàn)70
4.3.3示例73
4.4ASLR和PIE75
4.4.1ASLR75
4.4.2PIE76
4.4.3實現(xiàn)77
4.4.4示例79
4.5FORTIFY_SOURCE83
4.5.1簡介83
4.5.2實現(xiàn)84
4.5.3示例86
4.5.4安全性89
4.6RELRO90
4.6.1簡介90
4.6.2示例90
4.6.3實現(xiàn)93
第5章分析環(huán)境搭建
5.1虛擬機環(huán)境96
5.1.1虛擬化與虛擬機管理程序96
5.1.2安裝虛擬機97
5.1.3編譯debug版本的glibc98
5.2Docker環(huán)境100
5.2.1容器與Docker100
5.2.2Docker安裝及使用101
5.2.3Pwn題目部署102
第6章分析工具
6.1IDAPro104
6.1.1簡介104
6.1.2基本操作105
6.1.3遠程調試108
6.1.4IDAPython110
6.1.5常用插件114
6.2Radare2115
6.2.1簡介及安裝115
6.2.2框架組成及交互方式115
6.2.3命令行工具118
6.2.4r2命令122
6.3GDB125
6.3.1組成架構125
6.3.2工作原理125
6.3.3基本操作127
6.3.4增強工具130
6.4其他常用工具132
6.4.1dd133
6.4.2file133
6.4.3ldd134
6.4.4objdump134
6.4.5readelf135
6.4.6socat136
6.4.7strace<race136
6.4.8strip137
6.4.9strings138
6.4.10xxd138
第7章漏洞利用開發(fā)
7.1shellcode開發(fā)141
7.1.1shellcode的基本原理141
7.1.2編寫簡單的shellcode141
7.1.3shellcode變形143
7.2Pwntools145
7.2.1簡介及安裝145
7.2.2常用模塊和函數145
7.3zio152
7.3.1簡介及安裝152
7.3.2使用方法153
第8章整數安全
8.1計算機中的整數156
8.2整數安全漏洞157
8.2.1整數溢出157
8.2.2漏洞多發(fā)函數158
8.2.3整數溢出示例159
第9章格式化字符串
9.1格式化輸出函數162
9.1.1變參函數162
9.1.2格式轉換162
9.2格式化字符串漏洞164
9.2.1基本原理164
9.2.2漏洞利用166
9.2.3fmtstr模塊174
9.2.4HITCONCMT2017:pwn200176
9.2.5NJCTF2017:pingme178
第10章棧溢出與ROP
10.1棧溢出原理183
10.1.1函數調用棧183
10.1.2危險函數186
10.1.3ret2libc186
10.2返回導向編程187
10.2.1ROP簡介187
10.2.2ROP的變種189
10.2.3示例191
10.3BlindROP192
10.3.1BROP原理192
10.3.2HCTF2016:brop193
10.4SROP200
10.4.1SROP原理200
10.4.2pwntoolssrop模塊204
10.4.3BackdoorCTF2017:FunSignals204
10.5stackpivoting206
10.5.1stackpivoting原理206
10.5.2GreHackCTF2017:beerfighter209
10.6ret2dl-resolve213
10.6.1ret2dl-resolve原理213
10.6.2XDCTF2015:pwn200217
第11章堆利用
11.1glibc堆概述224
11.1.1內存管理與堆224
11.1.2重要概念和結構體226
11.1.3各類bin介紹229
11.1.4chunk相關源碼231
11.1.5bin相關源碼235
11.1.6malloc_consolidate()函數237
11.1.7malloc()相關源碼239
11.1.8free()相關源碼248
11.2TCache機制251
11.2.1數據結構251
11.2.2使用方法252
11.2.3安全性分析255
11.2.4HITBCTF2018:gundam257
11.2.5BCTF2018:HouseofAtum263
11.3fastbin二次釋放268
11.3.1fastbindup268
11.3.2fastbindupconsolidate273
11.3.30CTF2017:babyheap275
11.4houseofspirit283
11.4.1示例程序284
11.4.2LCTF2016:pwn200287
11.5不安全的unlink291
11.5.1unsafeunlink292
11.5.2HITCONCTF2016:SecretHolder295
11.5.3HITCONCTF2016:SleepyHolder303
11.6off-by-one307
11.6.1off-by-one307
11.6.2poisonnullbyte310
11.6.3ASISCTF2016:b00ks313
11.6.4PlaidCTF2015:PlaidDB320
11.7houseofeinherjar325
11.7.1示例程序325
11.7.2SECCONCTF2016:tinypad328
11.8overlappingchunks336
11.8.1擴展被釋放塊336
11.8.2擴展已分配塊339
11.8.3hack.luCTF2015:bookstore342
11.8.40CTF2018:babyheap349
11.9houseofforce353
11.9.1示例程序353
11.9.2BCTF2016:bcloud356
11.10unsortedbin與largebin攻擊363
11.10.1unsortedbinintostack363
11.10.2unsortedbinattack367
11.10.3largebin攻擊370
11.10.40CTF2018:heapstorm2374
第12章Pwn技巧
12.1one-gadget383
12.1.1尋找one-gadget383
12.1.2ASISCTFQuals2017:Starthard385
12.2通用gadget及Return-to-csu388
12.2.1Linux程序的啟動過程388
12.2.2Return-to-csu390
12.2.3LCTF2016:pwn100392
12.3劫持hook函數395
12.3.1內存分配hook396
12.3.20CTF2017-babyheap397
12.4利用DynELF泄露函數地址401
12.4.1DynELF模塊401
12.4.2DynELF原理402
12.4.3XDCTF2015:pwn200403
12.4.4其他泄露函數406
12.5SSPLeak409
12.5.1SSP409
12.5.2__stack_chk_fail()411
12.5.332C3CTF2015:readme412
12.5.434C3CTF2017:readme_revenge416
12.6利用environ泄露棧地址422
12.7利用_IO_FILE結構429
12.7.1FILE結構體429
12.7.2FSOP431
12.7.3FSOP(libc-2.24版本)433
12.7.4HITCONCTF2016:HouseofOrange438
12.7.5HCTF2017:babyprintf445
12.8利用vsyscall449
12.8.1vsyscall和vDSO449
12.8.2HITBCTF2017:1000levels451