网站大量收购独家精品文档,联系QQ:2885784924

缓冲区溢出技术[精选].ppt

  1. 1、本文档共45页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
缓冲区溢出技术[精选]

缓冲区溢出技术 堆栈 从物理上讲,堆栈是就是一段连续分配的内存空间 静态全局变量是位于数据段并且在程序开始运行的时候被加载 动态的局部变量 则分配在堆栈里面 从操作上来讲,堆栈是一个先入后出的队列,其生长方向与内存的生长方向正好相反 我们规定内存的生长方向为向上,则栈的生长方向为向下 压栈的操作push=ESP-4 出栈的操作是pop=ESP+4 在一次函数调用中,堆栈中将被依次压入:  参数,返回地址,EBP 如果函数有局部变量,接下来,就在堆栈中开辟相应的空间以构造变量 函数执行结束,这些局部变量的内容将 被丢失。但是不被清除 在函数返回的时候,弹出EBP,恢复堆栈到函数调用的地址,弹出返回地址到EIP以继续执行程序 在C语言程序中,参数的压栈顺序是反向的:比如func(a,b,c)。在参数入栈的时候,是先压c,再压b,最后压a 在取参数的时候,由于栈的先入后出,先取栈顶的a,再取b,最后取c 运行时的堆栈分配 我们用gcc -S 来获得汇编语言输出,可以看到main函数的开头部分对应如下语句: pushl %ebp movl %esp,%ebp subl $8,%esp 首先把EBP保存下来,然后EBP等于现在的ESP,这样EBP就可以用来访问本函数的 局部变量 之后ESP减8,就是堆栈向上增长8个字节,用来存放name[]数组。现在堆栈 的布局如下: 之后ESP减8,就是堆栈向上增长8个字节,用来存放name[]数组。现在堆栈 的布局如下: 由于我们输入的name字符串太长,name数组容纳不下,只好向内存顶部继续写‘A’ 由于堆栈的生长方向与内存的生长方向相反,这些‘A’覆盖了堆栈的老的元素 EBP,ret都已经被‘A’覆盖了 在main返回的时候,就会把‘ AAAA’ 的ASCII码:0为返回地址,CPU会试图执行0的指令,结果出现错误,这就是一次堆栈溢出 Shellcode的编写 Shellcode.c #include stdio.h void main() { char *name[2]; name[0] = /bin/sh; name[1] = NULL; execve(name[0], name, NULL); } execve( ) execve函数将执行一个程序 程序的名字地址作为第一个参数 一个内容为该程序的argv[i](argv[n-1]=0)的指针数组作为第二个参数 (char*) 0作为第三个参数 execve的汇编代码 $ gcc -o shellcode -static shellcode.c $ gdb shellcode (gdb) disassemble __execve Dump of assembler code for function __execve: 如何精简? 经过以上的分析,可以得到如下的精简指令算法: movl $execve的系统调用号,%eax movl bin/sh\0的地址,%ebx movl name数组的地址,%ecx movl name[n-1]的地址,%edx int $0x80 ;执行系统调用(execve) 问题 当execve执行成功后,程序shellcode就会退出,/bin/sh将作为子进程继续执行 如果execve执行失败,(比如没有/bin/sh这个文件),CPU就会继续执行后续的 指令,结果不知道跑到哪里去了 所以必须再执行一个exit()系统调用, 结束shellcode.c的执行 exit(0)汇编代码 exit(0) 的汇编代码精简 movl $0x1,%eax ;1号系统调用 movl 0,%ebx ;ebx为exit的参数0 int $0x80 ;引发系统调用 execve + exit movl $execve的系统调用号, %eax movl “bin/sh\0”的地址, %ebx movl name数组的地址, %ecx movl name[n-1]的地址, %edx int $0x80

文档评论(0)

dart003 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档