缓冲区溢出3讲义

上传人:今*** 文档编号:109930336 上传时间:2019-10-28 格式:PPT 页数:50 大小:734KB
返回 下载 相关 举报
缓冲区溢出3讲义_第1页
第1页 / 共50页
缓冲区溢出3讲义_第2页
第2页 / 共50页
缓冲区溢出3讲义_第3页
第3页 / 共50页
缓冲区溢出3讲义_第4页
第4页 / 共50页
缓冲区溢出3讲义_第5页
第5页 / 共50页
点击查看更多>>
资源描述

《缓冲区溢出3讲义》由会员分享,可在线阅读,更多相关《缓冲区溢出3讲义(50页珍藏版)》请在金锄头文库上搜索。

1、缓冲区溢出攻击技术 栈溢出攻击技术,诸葛建伟 狩猎女神项目/The Artemis Project 2005-5-31,北京大学计算机科学技术研究所,2,内容,缓冲区溢出攻击简介 基本概念及发展历史 背景知识 (Linux & win32) 缓冲区溢出攻击的原理 栈溢出攻击如何工作? Linux: 栈溢出, shellcode Win32: 栈溢出, shellcode 总结,3,缓冲区溢出攻击的威胁,4,缓冲区溢出攻击的基本概念,向缓冲区中填入过多的数据,超出边界 导致数据外溢,覆盖了相邻的内存空间 利用缓冲区溢出改写数据、改变程序执行流程 干扰系统运行,破坏系统完全性,任意执行恶意代码,5

2、,缓冲区溢出攻击的发展历史,1980s Morris蠕虫fingerd缓冲区溢出攻击 1996 Aleph One, Smashing the Stack for Fun and Profit, Phrack 49 1998 Dildog: 提出利用栈指针的方法完成跳转 The Tao of Windows Buffer Overflows 1999 Dark Spyrit: 提出使用系统核心DLL中的Jmp ESP指令完成跳转, Phrack 55 M. Conover: 基于堆的缓冲区溢出教程,6,缓冲区溢出攻击背景知识与技巧,编译器、调试器的使用 Linux: gcc+gdb Win32

3、: VC6.0+OllyDbg 进程内存空间结构 汇编语言基本知识 栈的基本结构 函数调用过程,7,GCC编译器基础,最著名的GNU的Ansi c/c+编译器 gcc options filenames 编译: gcc -c test.c 生成 test.o 连接: gcc -o test test.o 同时搞定: gcc test.c -o test make: 用于控制编译过程 Makefile How To,8,GDB调试器的使用,断点相关指令 break/clear, disable/enable/delete watch 表达式值改变时,程序中断 执行相关指令 run/continu

4、e/next/step attach 调试已运行的进程 finish/return 信息查看相关指令 info reg/break/files/args/frame/functions/ backtrace 函数调用栈 print /f exp 显示表达式的值 x /nfu addr 显示指定内存地址的内容 list 列出源码 disass func 反汇编指定函数,9,VC6.0命令行,环境变量 我的电脑属性高级环境变量 PATH: C:Program FilesMicrosoft Visual StudioVC98Bin; C:Program FilesMicrosoft Visual S

5、tudioCommonMSDev98Bin; INCLUDE: C:Program FilesMicrosoft Visual StudioVC98Include LIB: C:Program FilesMicrosoft Visual StudioVC98Lib 命令行指令 cl sourcefilename 编译并链接,10,Win32平台调试器,OllyDbg1.10汉化版 32-bit assembler level analysing debugger by Oleh Yuschuk Free 支持插件机制 OllyUni: 查找跳转指令功能 Softice IDA Pro,11,背

6、景知识进程内存空间,ESP,EIP,0xc0000000,0x80000000,Linux,Win32,12,Linux进程内存空间,Highest zone (0xc0000000-3G) 进程环境参数: env strings & pointers 进程参数: argv strings & pointers, argc 栈 存储函数参数、本地参数和栈状态变量 (返回地址, ) LIFO, 向低地址增长 堆 动态分配变量 (malloc) 向高地址增长 .bss: uninitialized data .data: static initialized data .text(0x800000

7、00): 指令, 只读数据 Example: ./linux/memory/memory.c,13,Win32进程内存空间,系统核心内存区间 0xFFFFFFFF0x80000000 (4G2G) 为Win32操作系统保留 用户内存区间 0x000000000x80000000 (2G0G) 堆: 动态分配变量(malloc), 向高地址增长 静态内存区间: 全局变量、静态变量 代码区间: 从0x00400000开始 栈: 向低地址增长 单线程进程: (栈底地址: 0x0012FFXXXX) 多线程进程拥有多个堆/栈 Example: ./win32/background/memory.c,1

8、4,汇编语言基础知识寄存器,15,汇编语言基础知识汇编指令,AT&T 格式与Intel 格式,16,栈的基本结构,栈LIFO抽象数据结构 用于实现函数或过程调用 相关寄存器 BP (Base Pointer) = FP (Frame Pointer): 当前栈底指针 SP (Stack Pointer): 当前栈顶指针 相关操作 PUSH: 压栈 POP: 弹栈,17,函数调用过程,函数调用过程的三个步骤 prologue: 保存当前的栈基址 (ebp). call: 调用参数和返回地址(eip)压栈,跳转到函数入口 return (or epilogue): 恢复调用者原有栈,18,函数调用

9、过程示例,2,1,Ret-add,ebp,retVal,Stack frame,19,缓冲区溢出攻击的本源,没有内嵌支持的边界保护 User funcs Ansi C/C+: strcat(), strcpy(), sprintf(), vsprintf(), bcopy(), gets(), scanf() 程序员安全编程技巧和意识 可执行的栈(堆) 给出Shell或执行任意的代码,20,缓冲区溢出示例,21,栈溢出攻击的原理,当调用函数时 Call指令会将返回地址(Call指令下一条指令地址)压入栈 Ret指令会把压栈的返回地址弹给EIP 栈溢出攻击的原理 通过缓冲区溢出修改栈中的返回地址

10、 当函数调用返回,EIP获得被修改后的返回地址,并执行Shellcode 挑战1: 将修改后的返回地址填到正确的位置 挑战2: 返回地址能正确地指向Shellcode,22,char 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 (i

11、nt) strlen(shellcode); i+) large_stringi = shellcodei; strcpy(buffer, large_string); return 0; ,Return add,Buffer (96bytes),i,long_ptr,高地址,低地址,Para2,Para1,shellcode,栈溢出攻击示例,23,Linux系统下的栈溢出攻击,栈溢出攻击 NSR模式 NRS模式 R.S模式 Shellcode 真实世界中的栈溢出攻击,24,NOP,shellcode,Low Address,NOP,NOP,RET,RET,RET,High Address,v

12、ulnerable1.c: stackexploit1.c:,NSR溢出模式,25,RET,shellcode,Low Address,RET,RET,NOP,NOP,NOP,High Address,vulnerable2. c: stackexploit2.c:,RNS溢出模式,26,shellcode,Low Address,FILE,NULL,High Address,vulnerable2.c: stackexploit3.c:,0xc0000000,RET,RET,RET,R.S溢出模式利用环境变量,27,栈溢出模式分析,挑战 溢出点 (在哪改写返回地址?) Shellcode地址

13、 (将返回地址改写成什么?) NSR模式 最经典的方法 Alpha One 需要漏洞程序有足够大的缓冲区 RNS模式 能够适合小缓冲区情况,更容易计算返回地址 R.S模式 最新的方法: execve (filename, argv , envp); Ret = 0xc0000000 4 strlen (FILENAME) strlen (shellcode), 不需要任何NOP 但对远程缓冲区溢出攻击不适用,28,Shellcode C版本,29,Shellcode 汇编版本,shellcode_asm.c,shellcode_asm_fix.c 去除0,30,Shellcode Opcode

14、版本,31 d2 xor %edx,%edx 52 push %edx 68 6e 2f 73 68 push $0x68732f6e 68 2f 2f 62 69 push $0x69622f2f 89 e3 mov %esp,%ebx 52 push %edx 53 push %ebx 89 e1 mov %esp,%ecx 8d 42 0b lea 0xb(%edx),%eax cd 80 int $0x80,31,给出远程登录的Shellcode,32,渗透防火墙的Shellcode,fcntl设置socket状态 scznsfocus 发送OOB数据 bkbllcnhonke 利用i

15、octl函数的FIONREAD选项 eyasxfocus 文件上传下载功能,33,在真实Linux世界中的栈溢出攻击,2003/09 - /usr/sbin/chat stack overflow 寻找溢出点 gdb /usr/sbin/chat (gdb) run perl -e print “A“ x 1056 * eip 0x41414141 0x41414141 (gdb) run perl -e print “A“ x 1000 Program exited with code 03. 返回地址 ret=0xc0000000-strlen(shellcode)-strlen(“/us

16、r/sbin/chat“)-sizeof(void *); Here we go!(实战训练) char *env=“HOME=/root“,shellcode,NULL; for(i=1000;i1056;i+=4) *(long *) Why not root? - (not setuid program),34,Win32系统下的栈溢出攻击,栈溢出攻击 本地栈溢出示例 远程栈溢出攻击 Shellcode 真实Win32世界中的栈溢出攻击,35,漏洞程序,36,如何利用?与Linux平台有何不同?,Win32平台与Linux平台的不同之处 如何进行系统调用shellcode方式不同 Win32: 通过调用系统DLL提供的

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号