漏洞战争学习笔记
0x00 分析
使用Abysssec组织的exploit做为调试样本,首先打开excel –> attach execel.exe –> 按f9运行 –> 打开exploit文件。程序断下在0x300ce361 处:
向上栈回溯代码:
看到产生错误的代码的调用函数是sub_300ce252
在此处下断点,重新运行程序,看到此时的栈顶是0x0013aa90,也就是该函数的返回地址。
在0x0013aa90处下内存写断点,以便跟踪到覆盖函数返回地址的命令:
在函数返回值处下断点,按f9,断下,看到0x300ce3c8处循环复制数据到栈上,此时的edi地址是0x0013aa9b,ebp的地址是0x0013aa3b,栈空间为0x60。推断是栈空间溢出导致数据覆盖了栈数据照成异常0x300ce361处eax的数据异常造成异常退出。现在我们的目标是先弄清楚函数间的关系,然后调试exploit使之正常运行。
单步执行代码至return处,此时的esp值为0x001379ec。
通过回溯代码可以看到这个函数为sub_300ce380
可以看到这个函数sub_300ce380被0x00306df0dc处调用
重新加载excel.exe,到sub_300ce252函数f8单步执行,看看是哪个函数导致了覆盖函数返回值,顺便理清sub_300ce380和sub_300ce252的关系:
可以看到执行sub_306deefe之前,函数返回地址0x0013aa90的返回值是正常的,执行之后:
返回地址被修改为shellcode了。说明是sub_306deefe函数出现问题,于是重新加载execel.exe 进入该函数单步执行,在0x003060dc处发现了函数sub_300ce380。
说明是 sub_300ce252 调用了sub_306DEEFE然后调用了sub_300CE380。
分析完大致可以了解了导致溢出的过程。
接下来就是调整shellcode使shellcode正确执行的过程。
0x01 复现
首先定位程序出错的0x300ce361 处,发现eax的值为shellcode数据,且不可写入,所以引发异常。向上回溯代码,发现ebp+2c处的值赋给了eax定位到0x0013aab8,获取了这段数据的ascii值。
同时定位函数返回值为0x3042232,2bb0
接下来就可以在shellcode中找这段数据:
首先抬高shellcode,填充90,并在发生异常的地方填充一个可写的地址,再到od中找到一个call esp函数填充再函数返回值,函数返回的时候执行shellcode。
保存后打开exploit发现成功弹计算器: