




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、缓冲区溢出攻击技术栈溢出攻击技术本资料由-|创业|创业网提供资料在线代理|网页代理|代理网页| 减肥药排行榜|淘宝最好的减肥药|什么减肥药效果最好|减肥瘦身药|1内容缓冲区溢出攻击简介基本概念及发展历史背景知识 (Linux & win32)缓冲区溢出攻击的原理栈溢出攻击如何工作?Linux: 栈溢出, shellcodeWin32: 栈溢出, shellcode总结2缓冲区溢出攻击的威胁3缓冲区溢出攻击的基本概念向缓冲区中填入过多的数据,超出边界导致数据外溢,覆盖了相邻的内存空间利用缓冲区溢出改写数据、改变程序执行流程干扰系统运行,破坏系统完全性,任意执行恶意代码4缓冲区溢出攻击的发展历史1
2、980sMorris蠕虫fingerd缓冲区溢出攻击1996Aleph One, Smashing the Stack for Fun and Profit, Phrack 491998Dildog: 提出利用栈指针的方法完成跳转The Tao of Windows Buffer Overflows1999Dark Spyrit: 提出使用系统核心DLL中的Jmp ESP指令完成跳转, Phrack 55M. Conover: 基于堆的缓冲区溢出教程5缓冲区溢出攻击背景知识与技巧编译器、调试器的使用Linux: gcc+gdbWin32: VC6.0+OllyDbg进程内存空间结构汇编语言基本
3、知识栈的基本结构函数调用过程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 表达式值改变时,程序中断执行相关指令run/continue/next/stepattach 调试已运行的进程finish/return信息查看相关指令info reg/break/back
4、trace 函数调用栈print /f exp 显示表达式的值x /nfu addr 显示指定内存地址的内容list 列出源码disass func 反汇编指定函数8VC6.0命令行环境变量我的电脑属性高级环境变量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)进程环境参数: env strings & pointers进程参数: argv stri
6、ngs & pointers, argc 栈存储函数参数、本地参数和栈状态变量 (返回地址, )LIFO, 向低地址增长堆动态分配变量 (malloc)向高地址增长.bss: uninitialized data.data: static initialized data.text(0 x80000000): 指令, 只读数据Example: ./linux/memory/memory.c12Win32进程内存空间系统核心内存区间0 xFFFFFFFF0 x80000000 (4G2G)为Win32操作系统保留用户内存区间0 x000000000 x80000000 (2G0G)堆: 动态分配
7、变量(malloc), 向高地址增长静态内存区间: 全局变量、静态变量代码区间: 从0 x00400000开始栈: 向低地址增长单线程进程: (栈底地址: 0 x0012FFXXXX)多线程进程拥有多个堆/栈Example: ./win32/background/memory.c13汇编语言基础知识寄存器寄存器名说明功能eax:累加器加法乘法指令的缺省寄存器, 函数返回值ecx计数器REP & LOOP指令的内定计数器edx除法寄存器存放整数除法产生的余数ebx: 基址寄存器在内存寻址时存放基地址esp栈顶指针寄存器SS:ESP当前堆栈的栈顶指针ebp栈底指针寄存器SS:EBP当前堆栈的栈底指
8、针esi, dei源、目标索引寄存器在字符串操作指令中,DS:ESI指向源串ES:EDI指向目标串eip 指令寄存器CS:EIP指向下一条指令的地址eflags标志寄存器标志寄存器cs代码段寄存器当前执行的代码段ss椎栈段寄存器stack segment, 当前堆栈段ds数据段寄存器data segment, 当前数据段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抽象数据结构用于实现函数或过程调用相关寄存器BP (Base Pointer) = FP (Frame Pointer): 当前栈底指针SP (Stack Pointer): 当前栈顶指针相关操作PUSH: 压栈POP: 弹栈16函数调用过程函数调用过程的三个步骤prologue: 保存当前的栈基址 (ebp).call: 调用参数和返回地址(eip)压栈,跳转到函数入口return (or epilogue): 恢复调用者原有栈17函数调用过程示例21Ret-add
10、ebpretValStack frameespespespespmain ebpespfunc ebpespespespespesp18缓冲区溢出攻击的本源没有内嵌支持的边界保护User funcsAnsi C/C+: strcat(), strcpy(), sprintf(), vsprintf(), bcopy(), gets(), scanf()程序员安全编程技巧和意识可执行的栈(堆)给出Shell或执行任意的代码19缓冲区溢出示例20栈溢出攻击的原理当调用函数时Call指令会将返回地址(Call指令下一条指令地址)压入栈Ret指令会把压栈的返回地址弹给EIP栈溢出攻击的原理通过缓冲区溢
11、出修改栈中的返回地址当函数调用返回,EIP获得被修改后的返回地址,并执行Shellcode挑战1: 将修改后的返回地址填到正确的位置挑战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系统下的栈溢出攻击栈溢出攻击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溢出模式利用环境变量26栈溢出模式分析挑战溢出点 (在哪改写返回地址?)Shellcode地址 (将返回地址改写成什么?)NSR模
14、式最经典的方法 Alpha One 需要漏洞程序有足够大的缓冲区RNS模式能够适合小缓冲区情况,更容易计算返回地址R.S模式最新的方法: execve (, argv , envp);Ret = 0 xc0000000 4 strlen () strlen (shellcode), 不需要任何NOP但对远程缓冲区溢出攻击不适用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状态scznsfocus发送OOB数据bkbllcnhonke利用ioctl函数的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!(实战训练)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系统下的栈溢出攻击栈溢出攻击本地栈溢出示例远程栈溢出攻击Shellcode真实Win32世界中的栈溢出攻击34漏洞程序35如何利用?与Linux平台有何不同?Win32平台与Linux平台的不同之处如何进行系统调用shellcode方式不同Win32: 通过调用系统DLL提供的接口函数Linux: 通过中断进行系统调用对废弃栈的处理NSR模式不适用于Win32Win32: 写入一些随机的数据Linux: 不进行
18、任何处理进程内存空间的分布NRS与R.S模式同样不适用于Win32Win32: 栈在1G以下的用户空间,地址中有空字节Linux: 栈在3G(0 xc0000000)附近,地址中没有空字节36Win32对废弃栈的处理如何以Shellcode地址覆盖返回地址?NSR模式R指向了Shellcode地址, 但执行“mov esp,ebp”恢复调用者栈信息时,Win32会在被废弃的栈中填入一些随机数据。WE LOST SHELLCODE! 调用者的栈调用参数返回地址EBP局部变量 Shellcode地址RSSSSSSSSNNNNNNNNEBPESPESP%37如何以Shellcode地址覆盖返回地址?
19、NRS模式栈在1G(0 x00FFFFFF)以下如果R直接指向Shellcode,则在R中必然含有空字节0. Shellcode将被截断 we lost shellcode AGAIN!R.S模式Win32平台无SUID机制,本地溢出没有意义同样会由于R中含空字节被截断调用者的栈调用参数Return addressEBP局部变量 Shellcode地址地址R中含空字节SSSSRNNNNNNNNWin32栈地址含有空字节38如何解决?通过Jmp/Call ESP指令跳转1998: Dildog-提出利用栈指针的方法完成跳转1999: Dark Spyrit-提出使用系统核心DLL中的Jmp ES
20、P指令完成跳转跳转指令在哪?OllyUni插件提供Overflow Return Address功能代码页里的地址: 不受任何系统版本及SP影响,但受语言区域选择影响。应用程序加载的用户DLL,取决于具体的应用程序,可能较通用。系统未变的DLL,特定发行版本里不受SP影响,但不同语言版本加载基址可能会不同。39通过跳转指令执行Shellcode如何利用跳转指令让漏洞程序正确执行我们的Shellcode0040100F |. E8 0C000000 CALL 00401014 |. 83C4 08 ADD ESP,800401017 |. 8BE5 MOV ESP,EBP00401019 |.
21、5D POP EBP0040101A . C3 RETNNOW ESP POINTS TO SHELLCODE!调用者的栈调用参数Return addressEBP局部变量SSSSRNNNNNNNNEBPESPESPESPESPJMP ESP40Win32远程缓冲区溢出远程缓冲区溢出演示缓冲区溢出漏洞服务器端程序:server.cpp远程缓冲区溢出攻击代码:exploit.c结构化异常处理SEHserver_seh.cpp进行了异常处理,exploit时返回前异常触发,程序流进入异常处理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函数入口地址GetProcAddress()和LoadLibrary()的地址可以在漏洞程序的Import Address Table找到G
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年驾校教练员资格考试模拟试卷:理论教学与实操技能提升手册
- 甘肃省白银市会宁县第一中学2020-2021学年高二化学上学期第二次月考试题
- 2025年注册消防工程师消防安全技术综合能力模拟试卷(消防设施维护与管理)-系统化学习宝典
- 2025年注册会计师考试《会计》合并财务报表考点梳理试题
- 2025年消防执业资格考试题库:消防标准化建设消防安全责任追究法规难点试题集
- 2025年校园新媒体运营策略与规范解读
- 2025年注册会计师考试《会计》高频考点预测模拟试题(一百)助你通关
- 【《基于L指标的电力系统电压稳定裕度分析》18000字】
- 2025年征信考试题库个人征信基础知识与征信报告解读技巧汇编
- 2025学年重庆市江北区七年级下学期数学月考试卷(整式运算深度解析)
- 高等数学上册ppt课件完整版
- 电力建设热工热控作业指导书
- 自主探究式教学活动模式结题报告
- 甲醇及制氢装置预试车方案
- 110kV升压站土建监理实施细则
- 分子的立体构型
- 公司业务运营流程图(共1页)
- GB 25595-2018 食品安全国家标准 乳糖(高清版)
- 部编版七年级语文下册文言文专项练习
- 供应商社会准则符合性自审问卷
- 医院禁止胎儿性别鉴定的承诺书和责任书
评论
0/150
提交评论