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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

4、trace 函數(shù)調用棧print /f exp 顯示表達式的值x /nfu addr 顯示指定內存地址的內容list 列出源碼disass func 反匯編指定函數(shù)8VC6.0命令行環(huán)境變量我的電腦屬性高級環(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平臺調試器OllyDbg1.10漢化版32-bit assembler level analysing debugger by Oleh YuschukFree支持插件機制OllyUni: 查找跳轉指令功能SofticeIDA Pro10背景知識進程內存空間ESPEIP0 xc00000000 x80000000LinuxWin3211Linux進程內存空間Highest zone (0 xc0000000-3G)進程環(huán)境參數(shù): env strings & pointers進程參數(shù): argv stri

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

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

8、針esi, dei源、目標索引寄存器在字符串操作指令中,DS:ESI指向源串ES:EDI指向目標串eip 指令寄存器CS:EIP指向下一條指令的地址eflags標志寄存器標志寄存器cs代碼段寄存器當前執(zhí)行的代碼段ss椎棧段寄存器stack segment, 當前堆棧段ds數(shù)據(jù)段寄存器data segment, 當前數(shù)據(jù)段14匯編語言基礎知識匯編指令 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棧的基本結構棧LIFO抽象數(shù)據(jù)結構用于實現(xiàn)函數(shù)或過程調用相關寄存器BP (Base Pointer) = FP (Frame Pointer): 當前棧底指針SP (Stack Pointer): 當前棧頂指針相關操作PUSH: 壓棧POP: 彈棧16函數(shù)調用過程函數(shù)調用過程的三個步驟prologue: 保存當前的棧基址 (ebp).call: 調用參數(shù)和返回地址(eip)壓棧,跳轉到函數(shù)入口return (or epilogue): 恢復調用者原有棧17函數(shù)調用過程示例21Ret-add

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

11、出修改棧中的返回地址當函數(shù)調用返回,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真實世界中的棧溢出攻擊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)溢出點 (在哪改寫返回地址?)Shellcode地址 (將返回地址改寫成什么?)NSR模

14、式最經典的方法 Alpha One 需要漏洞程序有足夠大的緩沖區(qū)RNS模式能夠適合小緩沖區(qū)情況,更容易計算返回地址R.S模式最新的方法: execve (, argv , envp);Ret = 0 xc0000000 4 strlen () strlen (shellcode), 不需要任何NOP但對遠程緩沖區(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給出遠程登錄的Shellcode31滲透防火墻的Shellcodefcntl設置socket狀態(tài)scznsfocus發(fā)送OOB數(shù)據(jù)bkbllcnhonke利用ioctl函數(shù)的FIONREAD選項eyasxfocus文件上傳下載功能32在真實Linux世界中的棧溢出攻擊2003/09 - /usr/sbin/c

16、hat stack overflow尋找溢出點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!(實戰(zhà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)下的棧溢出攻擊棧溢出攻擊本地棧溢出示例遠程棧溢出攻擊Shellcode真實Win32世界中的棧溢出攻擊34漏洞程序35如何利用?與Linux平臺有何不同?Win32平臺與Linux平臺的不同之處如何進行系統(tǒng)調用shellcode方式不同Win32: 通過調用系統(tǒng)DLL提供的接口函數(shù)Linux: 通過中斷進行系統(tǒng)調用對廢棄棧的處理NSR模式不適用于Win32Win32: 寫入一些隨機的數(shù)據(jù)Linux: 不進行

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

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

20、P指令完成跳轉跳轉指令在哪?OllyUni插件提供Overflow Return Address功能代碼頁里的地址: 不受任何系統(tǒng)版本及SP影響,但受語言區(qū)域選擇影響。應用程序加載的用戶DLL,取決于具體的應用程序,可能較通用。系統(tǒng)未變的DLL,特定發(fā)行版本里不受SP影響,但不同語言版本加載基址可能會不同。39通過跳轉指令執(zhí)行Shellcode如何利用跳轉指令讓漏洞程序正確執(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!調用者的棧調用參數(shù)Return addressEBP局部變量SSSSRNNNNNNNNEBPESPESPESPESPJMP ESP40Win32遠程緩沖區(qū)溢出遠程緩沖區(qū)溢出演示緩沖區(qū)溢出漏洞服務器端程序:server.cpp遠程緩沖區(qū)溢出攻擊代碼:exploit.c結構化異常處理SEHserver_seh.cpp進行了異常處理,exploit時返回前異常觸發(fā),程序流進入異常處理SEH保存在棧中,對其進行覆蓋XP和2003的增強異常處理VEH向量化異常處理異常處理次序: 調試器 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 - 三個API調用過程:LoadLibrary(msvcrt.dll);system();exit(0);平臺相關的API入口地址system() and exit()使用LoadLibrary()和GetProcAddress() 獲取其他API函數(shù)入口地址GetProcAddress()和LoadLibrary()的地址可以在漏洞程序的Import Address Table找到G

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論