前言 :
晚上本来还想搞一下阿里旺旺的那个栈溢出的,但是原先研究过一遍的cve今天还是出了些问题来着,所以说还是重新来了一遍。
正文 :
直接把poc拖到word上,附加上进程,发现程序崩溃在:
在此下断点,重新运行,查看一下edi和esi寄存器各自所存的内容:
可以看到esi中疑似垃圾数据,在和十六进制形式的poc文件做一下对比:
与选中的数据刚好一致,所以可以发现漏洞点在此处,此处可以自行构造payload。且此时ecx的值也与当中的acc一致,所以可以猜测acc8就是复制的次数。栈回溯看看调用它的函数:
这里的坑点找了很久,ub和u的区别就是b,这里的b可以看作back,相当于显示前面部分的汇编代码,u就是单纯的显示汇编代码,从当前开始往后显示,uf是显示该函数所有汇编代码。而这里调用函数基本是ub的最后一个代码段就是调用函数了。所以此处的调用函数是0x30f4cc5d
,在0x30f4cc5d
下断点,重新运行程序:
单步步过(p):
运行到此处,单步步入(t):
随后就进入到了所在的溢出点的地方了。整个执行流程是清除了,来看看溢出的流程,往下走(得换一个不能使得程序崩溃的文件才能继续执行):
框住的为返回地址,箭头为执行完后esp所指向的地址,往下:
跳转了一处,随后又pop了一下,继续往下:
又pop了几处,然后leave,ret返回地址为0x7ffa4512
,此样本为我修改过后的,这个地址是jmp esp
的地址,第二个方框为执行完指令后esp所指向的地址。往后就是弹方框的shellcode了。所以就可以根据上面的执行流程来构造出我们想要的payload了。需要改动的地方就那么几处。注意的点就是jmp esp
往后的地址需要填充0,不然会执行不了程序,具体的原因我也不清除,可能是污染了后面的元素吧。改动后的恶意文档:
这里还得了解一下rtf文档的格式标准:
再来看看后面所执行到的函数栈:
只有20栈空间,所以复制足够多就能覆盖掉返回地址。