本書專注于Linux二進(jìn)制安全。全書包含12章,從二進(jìn)制底層開始,結(jié)合源碼詳細(xì)分析了常見的二進(jìn)制安全漏洞、緩解機(jī)制以及漏洞利用方法,并輔以分析工具和環(huán)境搭建的講解。本書在素材的選擇上較為連續(xù)、完整,每個(gè)知識點(diǎn)均配以經(jīng)典例題,并花費(fèi)了大量篇幅深入講解,以最大程度地還原分析思路和解題過程。讀者完全可以依據(jù)本書自主、系統(tǒng)性地學(xué)習(xí),達(dá)到舉一反三的效果。本書主要面向CTF初學(xué)者,也適合對CTF感興趣的人群學(xué)習(xí)。
楊超,畢業(yè)于西安電子科技大學(xué),L-Team成員。目前就職于中國汽研北京分院,從事車聯(lián)網(wǎng)安全研究和工具開發(fā)工作。曾任職于?低、斗象科技;钴S在開源社區(qū), GitHub:firmianay。騰訊eee戰(zhàn)隊(duì),騰訊安全2016年成立的一支具有國際先進(jìn)技術(shù)實(shí)戰(zhàn)能力的CTF戰(zhàn)隊(duì)。戰(zhàn)隊(duì)核心成員均來自騰訊安全科恩實(shí)驗(yàn)室,導(dǎo)師由騰訊安全科恩實(shí)驗(yàn)室負(fù)責(zé)人、國際著名網(wǎng)絡(luò)安全專家吳石擔(dān)任。目前,戰(zhàn)隊(duì)成員已連續(xù)4年參與征戰(zhàn)DEFCON決賽,并在HITCON、PlaidCTF、SECCON等世界頂級安全賽事中,不斷刷新戰(zhàn)隊(duì)歷史最好成績,為國際間的技術(shù)交流與人才培養(yǎng)奠定基礎(chǔ)。同時(shí),戰(zhàn)隊(duì)還積極參與國內(nèi)賽事演練,并在2018年連續(xù)榮膺中國網(wǎng)絡(luò)安全三大國賽——“強(qiáng)網(wǎng)杯”“網(wǎng)鼎杯”和“護(hù)網(wǎng)杯”賽事冠軍,成為第一個(gè)實(shí)現(xiàn)國賽大滿貫的戰(zhàn)隊(duì);2019年,戰(zhàn)隊(duì)再度蟬聯(lián)“強(qiáng)網(wǎng)杯”線上、線下賽冠軍。2020年,戰(zhàn)隊(duì)獲得第四屆“強(qiáng)網(wǎng)杯”亞軍。
第1章CTF簡介
1.1賽事介紹
1.1.1賽事起源
1.1.2競賽模式
1.1.3競賽內(nèi)容
1.2知名賽事及會(huì)議
1.2.1網(wǎng)絡(luò)安全競賽
1.2.2網(wǎng)絡(luò)安全會(huì)議
1.2.3網(wǎng)絡(luò)安全學(xué)術(shù)會(huì)議
1.3學(xué)習(xí)經(jīng)驗(yàn)
1.3.1二進(jìn)制安全入門
1.3.2CTF經(jīng)驗(yàn)8
1.3.3對安全從業(yè)者的建議8
第2章二進(jìn)制文件
2.1從源代碼到可執(zhí)行文件11
2.1.1編譯原理11
2.1.2GCC編譯過程12
2.1.3預(yù)處理階段13
2.1.4編譯階段14
2.1.5匯編階段15
2.1.6鏈接階段15
2.2ELF文件格式16
2.2.1ELF文件的類型16
2.2.2ELF文件的結(jié)構(gòu)18
2.2.3可執(zhí)行文件的裝載24
2.3靜態(tài)鏈接26
2.3.1地址空間分配26
2.3.2靜態(tài)鏈接的詳細(xì)過程27
2.3.3靜態(tài)鏈接庫29
2.4動(dòng)態(tài)鏈接30
2.4.1什么是動(dòng)態(tài)鏈接30
2.4.2位置無關(guān)代碼31
2.4.3延遲綁定32
第3章匯編基礎(chǔ)
3.1CPU架構(gòu)與指令集34
3.1.1指令集架構(gòu)34
3.1.2CISC與RISC對比35
3.2x86/x64匯編基礎(chǔ)36
3.2.1CPU操作模式36
3.2.2語法風(fēng)格36
3.2.3寄存器與數(shù)據(jù)類型37
3.2.4數(shù)據(jù)傳送與訪問38
3.2.5算術(shù)運(yùn)算與邏輯運(yùn)算39
3.2.6跳轉(zhuǎn)指令與循環(huán)指令40
3.2.7棧與函數(shù)調(diào)用41
第4章Linux安全機(jī)制
4.1Linux基礎(chǔ)45
4.1.1常用命令45
4.1.2流、管道和重定向46
4.1.3根目錄結(jié)構(gòu)47
4.1.4用戶組及文件權(quán)限47
4.1.5環(huán)境變量49
4.1.6procfs文件系統(tǒng)51
4.1.7字節(jié)序52
4.1.8調(diào)用約定53
4.1.9核心轉(zhuǎn)儲54
4.1.10系統(tǒng)調(diào)用55
4.2StackCanaries58
4.2.1簡介58
4.2.2實(shí)現(xiàn)61
4.2.3NJCTF2017:messager63
4.2.4sixstarsCTF2018:babystack65
4.3No-eXecute69
4.3.1簡介69
4.3.2實(shí)現(xiàn)70
4.3.3示例73
4.4ASLR和PIE75
4.4.1ASLR75
4.4.2PIE76
4.4.3實(shí)現(xiàn)77
4.4.4示例79
4.5FORTIFY_SOURCE83
4.5.1簡介83
4.5.2實(shí)現(xiàn)84
4.5.3示例86
4.5.4安全性89
4.6RELRO90
4.6.1簡介90
4.6.2示例90
4.6.3實(shí)現(xiàn)93
第5章分析環(huán)境搭建
5.1虛擬機(jī)環(huán)境96
5.1.1虛擬化與虛擬機(jī)管理程序96
5.1.2安裝虛擬機(jī)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遠(yuǎn)程調(diào)試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組成架構(gòu)125
6.3.2工作原理125
6.3.3基本操作127
6.3.4增強(qiáng)工具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常用模塊和函數(shù)145
7.3zio152
7.3.1簡介及安裝152
7.3.2使用方法153
第8章整數(shù)安全
8.1計(jì)算機(jī)中的整數(shù)156
8.2整數(shù)安全漏洞157
8.2.1整數(shù)溢出157
8.2.2漏洞多發(fā)函數(shù)158
8.2.3整數(shù)溢出示例159
第9章格式化字符串
9.1格式化輸出函數(shù)162
9.1.1變參函數(shù)162
9.1.2格式轉(zhuǎn)換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函數(shù)調(diào)用棧183
10.1.2危險(xiǎn)函數(shù)186
10.1.3ret2libc186
10.2返回導(dǎo)向編程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內(nèi)存管理與堆224
11.1.2重要概念和結(jié)構(gòu)體226
11.1.3各類bin介紹229
11.1.4chunk相關(guān)源碼231
11.1.5bin相關(guān)源碼235
11.1.6malloc_consolidate()函數(shù)237
11.1.7malloc()相關(guān)源碼239
11.1.8free()相關(guān)源碼248
11.2TCache機(jī)制251
11.2.1數(shù)據(jù)結(jié)構(gòu)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擴(kuò)展被釋放塊336
11.8.2擴(kuò)展已分配塊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程序的啟動(dòng)過程388
12.2.2Return-to-csu390
12.2.3LCTF2016:pwn100392
12.3劫持hook函數(shù)395
12.3.1內(nèi)存分配hook396
12.3.20CTF2017-babyheap397
12.4利用DynELF泄露函數(shù)地址401
12.4.1DynELF模塊401
12.4.2DynELF原理402
12.4.3XDCTF2015:pwn200403
12.4.4其他泄露函數(shù)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結(jié)構(gòu)429
12.7.1FILE結(jié)構(gòu)體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