关于溢出覆盖的一些总结。

来源:互联网 发布:淘宝评价什么时候生效 编辑:程序博客网 时间:2024/05/16 19:40

最近在学习通过数组溢出覆盖来实现控制台程序弹框由浅入深的一些功能,书里面写的很好,我通过读书,有了一个递进的了解,总结一下:

第一个实验,是通过最简单的数组溢出,实现对函数调用以后本栈帧内部的判定变量,从程序逻辑角度对程序结果进行改变,只需要计算好先前定义的buffer数组的大小和输入内容的关系,保证不要多覆盖也不要少覆盖就行了。


第二个实验,实现在控制台程序中弹出对话框,这需要通过覆盖返回地址实现,让函数程序执行完毕后EIP不回到原来的函数中而是回到程序中buffer数组的起始地址,这样就可以执行buffer中的机器代码,之前只需要把机器代码的长度控制在buffer的容纳范围之内就行。从user.dll中用工具查询出messegeboxA的绝对内存,然后卸载shellcode中进行跳转。但是这个实验最关键的问题是,对于程序运行当中的buffer数组起始地址,每次运行都可能不一样,因此要保证shellcode的通用性,需要改进。


第三个实验,由于观察到ESP这个指针在返回地址弹出后,会直接指向返回地址的下一个地址,因此,可以用它来定位shellcode的位置,这样的话就不会出现实验二所说的问题,保证shellcode的通用性。因此就需要用buffer数组覆盖掉返回地址以及返回地址以下的地址(返回地址以下的地址覆盖为shellcode,让后面执行)。对于返回地址的覆盖,要从user.dll的绝对内存中获取jmp esp这条指令的地址(这个需要写一个小程序,进行搜索,获得这条指令在内存中的地址),然后填入返回地址那一帧,(由于我是汇编白痴,对于为什么不能直接把这个地址覆盖进去我也不太明白,正待研究)这样覆盖完毕后,无论哪次执行程序,都能够跳转到shellcode进行执行。


第四个实验,在第三个实验中,没有良好的exit机制,使得对话框关闭时候都要报错,于是需要像当初查询messageboxA的地址一样,查询exitprocess进程的地址,这样一来,在调用完了对话框之后,再调用一次exitprocess的内存,就可以了。


这一套实验,目的就是最后完成一个简单的溢出,而且使得shellcode不因为内存地址的变化而是去效应。



0 0
原创粉丝点击