- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
A堆溢出实例
* 植入代码和流程控制的综合 常见的缓冲区溢出攻击是溢出字符串综合使用了代码植入和Activation Records改写技术。 攻击者定位在一个可供溢出的局部变量,然后向程序传递一个设计好的长字符串,在引发缓冲区溢出改变Activation Records的同时植入代码。 即用一个长字符串完成代码植入并覆盖函数的返回地址。 示意图见下面。 植入代码和流程控制的综合图示 * * * * * 11A.2.1 栈溢出 程序中发生函数调用时,计算机做如下操作:首先把指令寄存器EIP(它指向当前CPU将要运行的下一条指令的地址)中的内容压入栈,作为程序的返回地址(下文中用RET表示);之后放入栈的是基址寄存器EBP,它指向当前函数栈帧(stack frame)的底部;然后把当前的栈指针ESP拷贝到EBP,作为新的基地址,最后为本地变量的动态存储分配留出一定空间,并把ESP减去适当的数值。 * 11A.2.1 栈溢出实例 一段简单程序的执行过程中对栈的操作和溢出的产生过程。 #include stdio.h int main(){ char name[16]; gets(name); for(int i=0;i16name[i];i++) printf(“%c”,name[i]); } * * 编译上述代码,输入hello world! 结果会输出hello world! 在调用main()函数时,程序对栈的操作是这样的: 先在栈底压入返回地址 接着将栈指针EBP入栈,并把EBP修改为现在的ESP 之后ESP减16,即向上增长16个字节,用来存放name[]数组 11A.2.1 栈溢出实例 * 现在栈的布局如图所示 11A.2.1 栈溢出实例 * 执行完gets(name)之后,栈中的内容如下图所示 11A.2.1 栈溢出实例 * 接着执行for循环,逐个打印name[]数组中的字符,直到碰到0x00字符 最后,从main返回,将ESP增加16以回收name[]数组占用的空间,此时ESP指向先前保存的EBP值。程序将这个值弹出并赋给EBP,使EBP重新指向main()函数调用者的栈的底部。然后再弹出现在位于栈顶的返回地址RET,赋给EIP,CPU继续执行EIP所指向的命令。 说明1:EIP寄存器的内容表示将要执行的下一条指令地址。 说明2:当调用函数时, Call指令会将返回地址(Call指令下一条指令地址)压入栈 Ret指令会把压栈的返回地址弹给EIP 11A.2.1 栈溢出实例 * 如果输入的字符串长度超过16个字节,例如输入:hello world!AAAAAAAA……,则当执行完gets(name)之后,栈的情况如图所示 11A.2.1 栈溢出实例 * 由于输入的字符串太长,name[]数组容纳不下,只好向栈的底部方向继续写‘A’。这些‘A’覆盖了堆栈的老的元素,从上页图可以看出,EBP,Ret 都已经被‘A’覆盖了。 从main返回时,就必然会把‘AAAA’的ASCII码——0作返回地址,CPU会试图执行0的指令,结果出现难以预料的后果,这样就产生了一次堆栈溢出。 在Windows XP下用VC6.0运行程序,结果如下页图所示。 11A.2.1 栈溢出实例 * 11A.2.2 堆溢出 当我们需要较大的缓冲区或在写代码时不知道包含在缓冲区中对象的大小,常常要使用堆。 堆溢出的工作方式几乎与栈溢出的工作方式完全相同,唯一不同的是,堆没有压栈和入栈操作,而是分配和回收内存。 C语言中使用malloc()和free()函数实现内存的动态分配和回收,C++语言使用new()和delete()函数来实现相同的功能 * 11A.2.2 堆溢出实例 # include stdio.h # include stdlib.h # include unistd.h # include string.h # define BUFFER-SIZE 16 # define OVERLAYSIZE 8 /* 我们将覆盖buf2 的前OVERLAYSIZE 个字节 */ int main() { u-long diff ; char * buf1 = (char * )malloc (BUFFER-SIZE) ; char * buf2 = (char * )malloc (BUFFER-SIZE) ; diff = (u-long) buf2 - (u-long) buf1 ; printf (″buf1 = %p , buf2 = %p , diff = 0x %x ( %d) bytes \n″, buf1 , buf2 , diff , dif
您可能关注的文档
最近下载
- 2014日产玛驰全车电路图维修手册51-仪表和警告灯.pdf VIP
- 软件公司质量手册(含程序文件).doc VIP
- 城市总体规划编制标准.pdf VIP
- 电力系统英文书籍推荐.docx
- Unit 1 Happy Holiday 第5课时(Section B 2a-3c)课件 -2025-2026学年人教版英语八年级上册.pptx VIP
- 一种基于TTE总线的运载火箭全数字互联系统.pdf VIP
- 新译林版英语六年级下册全册教案GG.doc VIP
- 美容心理学概述PPT(完整版)课件.pptx VIP
- 第三章 无土栽培的理论基础.ppt VIP
- 企业管理手册××软件公司质量手册.pdf VIP
文档评论(0)