读书笔记5:0day安全:软件漏洞分析技术

对于上个实验出现的指令变动的情况,虽说可以通过抬高栈顶保护shellcode
解决,不过招式不怕多嘛,这次的实验我们使用另外一个套路…
套路的一些简要介绍:
漏洞点位于某个动态链接库,且程序运行过程中被动态装载,此时栈中情况将会是变化的,也就是说之前从调试器中直接抄出来的shellcode起始地址下次就变了。因此,要编写出比较通用的shellcode就必须找到一个让程序自动定位到shellcode的起始地址。(这里假设我们的buffer位置是浮动的,因此,每次想执行跳转回buffer的起始位置,也就是shellcode的起始是有些麻烦的,毕竟浮动…)
解决办法:
书中原话:“一般情况下,ESP寄存器中的地址总是指向系统栈中不会被移除的数据破坏,函数返回时ESP所致的位置恰好是我们所淹没的返回地址下一个位置<假设我们把shellcode放在这里呢?一般这里的诗句不会被破坏,避免了上一篇文章中需要抬高栈顶来避免shellcode被后续的push操作覆写的非预料事件。因为在此之前会有一条存放返回地址的,调用完函数retn会pop出这个地址(此时esp就指向shellcode了)并实现跳转,利用思路是:找一个jmp esp的指令,把地址覆盖成返回地址的位置,这样跳转过去是执行jmp esp,系统回去esp读指令(也就是我们的shellcode),这样我们就不需要考虑buffer的浮动与否了>
(注:函数返回式,ESP所指位置跟函数调用约定、返回指令等有关。如retn3、retn4在返回后,ESP所指位置有所差异)”
巴拉巴拉这么大一串,我们开始实验:
首先找jmp esp的地址。我们寻找程序大多都要加载的动态链接库取寻找这个指令
在这里插入图片描述
记录地址0x76FD01EB小尾存放则是EB 01 FD 76
接下来修改我们的password.txt
在这里插入图片描述
前面的无用数据是为了让我们的输入能够够到返回地址并且淹没它。
执行完verify_password中的strcpy后成功溢出的栈的情况:
在这里插入图片描述
顺着流程,我们看下是否达到预期:
在这里插入图片描述
可以看到,我们成功实现了跳转jmp esp指令,F8单步继续:
在这里插入图片描述
回到了我们构造的shellcode,并且执行顺利,并不会造成上次实验碰到的破坏shellcode的情况
在这里插入图片描述
至此,实验结束
写在最后:由于博主是个新手,文章中有所不当的地方还请各位前辈指出,不胜感激。如果由看不懂文章的朋友,强烈建议往回去看之前的文章。

猜你喜欢

转载自blog.csdn.net/weixin_43084928/article/details/88621518