- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
0day缓冲区溢出实验报告课件
网络安全
缓冲区溢出实践
班级:信安一班
学号:2013308880017
姓名:吴双可
1 栈溢出
1.1 修改邻接值
首先写一个密码验证程序,正确密码为1234567
在ollydbg中进行调试
在验证密码时输入8888888
提示错误。
堆栈情况:
可以看出,输入的password储存在0012FB7C处
authenticated变量存储在0012FF7C处。由于88888881234567,所以值为1。
如果输入溢出,情况是这样的:
输入8888888wsk,发现sk溢出到了authenticated变量处
而我们的目标是使authenticated被覆盖为0,因此,输入8个字符,字符串最后的’\0\即null会覆盖authenticated使它成为0。
不过并不是所有的8个字符都可以。如果输入的字符串小于1234567,那么authenticated是-1的补码即FFFFFFFF,这时只修改最后的一位还是不能使authenticated成如
这时authenticated值为
=====================================================================
1.2 修改函数返回地址
改为从文件中读取密码
超出buffer范围的字符会依次淹没authenticated、EBP和返回地址。
观察反汇编:
此为验证函数,取出EAX中的返回值与0比较,如果相等则跳
所以将password文件修改如下:
可以覆盖返回地址,使程序跳入验证正确的分支
2 代码植入
通过栈溢出让程序执行输入数据中植入的代码
在输入数据里包含自己想要执行的代码,然后通过返回地址让程序跳转到系统栈里执行。
向password.txt文件里植入二进制的机器码。调用windows的API函数
将buffer长度扩展为44,先将password文件修改为11个4321来进行实验,验证通过后堆栈情况如图:
buffer起始还是0012FB7C,authenticated也还是0012FF7C,后面依次为EBP和返回地址。
接下来,我们需要给password.txt植入机器代码。
因为我们在汇编语言中调用MessageboxA,所以需要获得这个函数的入口地址
在dependency waker中有:
可得MessageboxA在内存中的入口地址为0x77D507EA
机器代码汇编指令注释33DBXOR EBX,EBX压入以NULL结尾的”overflow”字符串。53PUSH EBX68 666C6F77PUSH 776F6C6668 6F766572PUSH 7265766F8BC4MOV EAX,ESPEAX存放字符串指针53PUSH EBX4个参数依次入栈,分别为0,overflow,overflow,050PUSH EAX50 PUSH EAX53PUSH EBXB8EA07D577MOV EAX, 0x77D507EA调用MessageBoxAFFD0CALL EAX将上述汇编指令对应的机器代码逐字写入password.txt,一共26个字节。再填充0x90即nop指令至第52字节(第45-52字节为authenticated和EBP),然后在53-56字节填入buffer的起始0x0012FB7C。如图所示:
执行injection,出现overflow对话框
溢出攻击发生的根源,其实是计算机内存中,数据和代码没有明确区分的。当一块内存中的数据被执行时,它就是代码。所以我们需要DEP,它的基本原理是将数据所在内存页标识为不可执行,这样就不能够利用溢出攻击来执行不应该被执行的地方,如果尝试这样做,CPU就会抛出异常,而不是去执行恶意指令。
DEP针对溢出攻击的本源,完善了内存管理机制,它将内存页设置为不可执行状态,来阻止堆栈中shellcode的执行。
我们将上述实验环境中的DEP打开
noexcute不可执行状态,即开启DEP
然后调试刚才的代码,发现在跳转至堆栈段中的shellcode时出现问题:
虽然跳转到堆栈段中取指令,但是无法执行。这就是DEP的功劳了。
但是它并不能彻底阻止缓冲区溢出攻击。
3 挑战DEP
3.1 利用Ret2Libc挑战DEP
即利用内存中可执行的指令代替shellcode中的指令
3.1.1 跳转到NtSetInformationProcess函数关闭DEP
既然DEP是让我们无法执行被保护的数据段中的内容,那么我们只需要在内存中找到一段在内存中找到一段可执行的用于关闭DEP的指令,跳转到那里
文档评论(0)