溢出原理和破解一段程序_第1页
溢出原理和破解一段程序_第2页
溢出原理和破解一段程序_第3页
溢出原理和破解一段程序_第4页
溢出原理和破解一段程序_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、兴趣来了挡也挡不住使用xp自带的ntsd调试Crack(破解)一段小程序,主要原理:汇编中call指令相当于push 返回地址,push 下一指令地址,通过修改返回地址的指向,可以执行任何代码,这里尝试了修改成 main和bar函数的地址。这段程序源代码是网上找的,自己懒得写,其中双斜杠是我自己加的,没加双斜杠的情况下这段程序演示了一个覆盖返回地址溢出,加上斜杠后,俺让它随便调用任何存在的函数,这里存在三个函数,main函数,bar函数,foo函数,请看代码,使用vc6的debug方式编译连接。#include <windows.h>#include <conio.h>

2、#include <stdio.h>#include <process.h>#include <string.h>void foo(const char *input)printf("hello ,cracked!n");/char buf4; /buf 占4字节,后4字节为ebp,再后4个字节为返回地址。/strcpy(buf, input); /传入的字符串去覆盖返回地址,从而使用程序执行bar()函数void bar(void)printf("Augh! This program have been hacked by M

3、oreWindows!n");getch();exit(0);/由于这时的ebp已经破坏了, 所以在这直接退出程序. 不然会弹出错误对话框int main(int argc, char *argv) printf("Address of main = %pn", main);printf("Address of foo = %pn", foo);printf("Address of bar = %pn", bar); /构造字符串,前8个填充字符,再跟一个bar()函数的地址。 char szbuf50 = "12

4、341234" / DWORD *pbarAddress = (DWORD *)&szbuf8;/*pbarAddress = (DWORD)bar;foo(szbuf);system("pause");return 0; 编译好后执行一遍试试,正常执行时截图如下下面crack她:使用xp自带的ntsd调试器,这个调试器非常的强大,体积也很小巧,最重要的是她实xp系统自带的,使用很方便。编译好后的程序名为:dd.exe使用ntsd -2 dd.exe 解释:ntsd 就是启用调试器,-2参数表示单独使用一个窗口显示。执行后显示两个窗口,一个是ntsd的本身

5、窗口,另一个是dd.exe程序被调试挂起的窗口截图如下:左边的为ntsd,右边的为dd.exe程序挂起窗口。看到ntsd中的> 符号是用来输入命令的输入 bp main 解释:bp 为breakpoint的意思设置断点,main为函数明对于一个地址,可以使用x dd!main 查看,截图,可以看出main就是地址0x4010e0然后输入指令 g 解释:g就是go的意思,相当于gdb里的run截图:然后输入 p指令 回车,不断地回车直到出现如图停止:然后使用 t指令 :解释p指令相当于vc6中单步步出,t相当于步入,这里使用t意思就是想进入call dd+0x1005中看看样子。输入t回车

6、后,截图记录下当前的esp 值(12fef8)和上一个图的eip 401159这两个值要记住。然后使用x指令查看main ,bar 和foo 函数的地址如图:Main 4010e0Bar 401080Foo 401030这几个地址先记下,留着备用使用e指令将 bar函数地址写入 0x12fef8如图:注意这里数据在内存中表示方式。使用p指令单步执行,不断回车,回车,直到dd.exe这个窗口比原先多出一行输出为止:如图:直接执行dd.exe截图:比较一下,是不是比直接执行dd.exe多出了一行“Augh! This program have been hacked by MoreWindows!

7、”,(*_*) 嘻嘻。Crack成功!然后一路p回车知道gech()这个函数,t指令进入call dd!_getch,截图:看一下此时的esp 为12fea8,如前面的这次将main函数地址写入12fea8看看效果,输入p指令,回车。一路回车,截图:程序直接执行截图:比较一下就知道crack的结果了,多输出了五行,(*_*) 嘻嘻可以看出程序并没有结束,而是又从main函数开始执行了,因为刚才把main函数的地址写到esp对应的地址中。细心的可能已经看出来了,程序执行输出的函数地址和调试的地址不一样,这个是因为编译器编译后的debug版本代码是这样的Call bar(地址)Bar:Jmp ba

8、r截图编译后如图方式,跳转之前的地址就是 程序执行输出的地址,而真实的地址位jmp后的地址,所以不一样。总结,这个比较好玩,也能学到东西。修改的返回地址不一定是函数的地址,可以是任何一个可以执行的地址,只不过程序有可能会崩溃,也可以使用e指令向内存中直接写机器码,然后将这个地址付给 call以后的esp减去4。觉得这个比较好玩,算是抛出个砖块吧。下面是溢出的分析,利用的原理和本文开始时是一样的将上面的源代码的被注释的代码还原(去掉双斜杠),运行,可以发现源代码中虽然没有调用bar函数但是也输出了,Augh! This program have been hacked by MoreWindow

9、s!原因代码的注释加上我第一段说的原理差不多就很清楚了,目前的操作系统对于溢出也做了补丁,下面就验证一下xp下栈溢出的可行性,代码还是本文开头的代码,但是修改bar函数体为Void bar(void) _asmmov eax,ebx先来解释一下栈溢出:栈溢出是指将某段可执行机器码复制进栈中,然后把程序执行指针设置成这段代码对应的栈地址。方法:将bar函数的机器码复制到栈中,然后将地址通过返回地址的方式付给eip,来验证是否能在栈中执行代码,使用的验证工具还是ntsd ,这个工具 很强大。Ntsd -2 dd.exe加载程序。下完main断点后使用p执行到call foo ,使用t进入,使用e指令将返回地址处12fef8设置成12fe00(栈地址)如图:然后p执行到foo返回指令ret。使用m指令将bar中的mov eax,ebx机器码 移到12fe00处,然后p回车,可以看到eip为12fe00如图:然后p单步执行,直到foo返回,此时返回地址为12fe00,如果从12fe00执行没错的话可以验证栈中代码可以执行。从

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论