这篇帖子我也不知道应该设置成分享贴,还是讨论贴,因为我也不知道我下面提到的结论对不对。
之前在看《0day》的时候,看到10.5节,没有手动调试,最近看到论坛有篇帖子"
同时替换栈和.data数据节中的Cookie突破GS安全机制",于是手动实验了一下,但是我的电脑上没有VS2008,所以用的VS2017/2015来编译,然后放到XP sp3下运行,结果就是无法成功挫败GS,原因有很多,其中一个就是发现VS2017/2015和VS2008的GS保护好像有点差别(我不知道有没有人发过类似的帖子,或者已经研究过这一点)
先说结论:VS2017/2015在对security cookie进行检查的时候,并不是像VS2008那样,检查.data的第一个DWROD,而是检查.data的第二个DWORD
代码还是上面那帖子中的代码
#include <stdafx.h>
#include <string.h>
#include <stdlib.h>
char shellcode[]="\x90\x90\x90\x90"//用NOP修改种子
"\x90\x90\x90\x90";
void test(char * str, int i, char * src)
{
char dest[200];
if(i<0x9995)
{
char * buf=str+i;//指向.data,i的值是main函数中申请的内存的起始地址到种子的距离
*buf=*src;//修改.data的第一个字节
*(buf+1)=*(src+1); //修改.data的第二个字节
*(buf+2)=*(src+2); //修改.data的第三个字节
*(buf+3)=*(src+3); //修改.data的第四个字节
strcpy(dest,src);//这个函数产生溢出
}
}
void main()
{
char * str=(char *)malloc(0x10000);//申请一片内存,并用test函数来使用
test(str,0xFFFF2FB8,shellcode);
}
先看VS2008编译的程序:
我不知道原楼主在编译的时候,除了书上提到的禁用优化选项之外,还在编译的时候设置了什么(这也是我说我提到的结论不知道是否正确的一个原因。)
.data段在0x403000
,
然后跟进test函数,strcpy后来到这
,下面的那个call应该就是security cookie check
F7进去,看到
,可以看到,这里是将ecx
与.data段前4个字节进行比较。这个时候的.data段的前4个字节已经是发生改变了的,这里跟踪一下.data段前4个字节到底被改成了什么?
重新载入程序,这个是403000处初始的数据(这里一开始我还是不理解书上提到的“系统以.data节的第一个双字作为cookie种子,程序每次运行时cookie的种子都不同”这句话的意思,每次载入程序后,我看.data 0x403000处的数据都是一样的,后来我才反应过来原因:原来VS编译的程序在OEP处是一个call,而这个call就是生成security cookie的关键,这个call调用了GetSystemTimeAsFileTime等函数来生成security cookie,所以每次的security cookie都不一样,并不是说.data段的前4个字节是随机的,这里就不多说了,可以在OEP处F7跟一下)
然后在数据窗口中,对0x403000设置硬件写入断点,F9后,来到这里:,执行到返回,再F7看看这些代码是在哪个函数里的。
可以看到是OEP处生成security cookie这个call里的代码。
重新载入程序,继续F9,来到这里:
会分别断在这里,这里对应的是原代码中
,下来就是strcpy和check
,然后就会来到最开始提到的地方
,然后因为代码中同时替换了栈中和.data中的cookie于是就能绕过GS了。
这个程序是在XP SP3下调试的,如果之前那篇帖子的楼主编译正确的话,那环境应该就是和书上是一样的
接下来就是VS2017/VS2015和VS2008不同的地方:
然后看VS2017/2015编译的程序:
先看修改的项目属性:(因为我的主机是win7的,要让程序能在XP下运行得修改下面的属性)
,
先看区段:
,数据段是0x413000
老样子,来到main函数,
(这里在调用malloc的时候和上一个程序有区别,这里OD没有直接显示malloc,像这样
,而是像上面那样显示的,我不知道这对最后的结果有没有影响,这也是我说我提到的结论不知道是否正确的另一个原因
)然后F7跟进test,strcpy结束后来到check security cookie,
跟进这个check,
,
看到区别了吗?VS2017/2015不再像VS2008那样去检查前4个字节,而是检查第二个DWORD。所以说如果要让这个实验在VS2017/2015编译情况下成功绕过GS,就需要改变原先的代码,原先的代码是修改了.data段第一个DWORD,现在就需要修改第二个DWORD。
所以对于VS2017/2015编译的程序在绕过GS的时候会有点差别,其实原理还是一样的。
这个程序是在win7下调试的,因为在xp sp3下strcpy之前就开始报错了,但是我之前修改过代码,解决了报错的问题,之后check也是check第二个DWORD,所以应该和平台没关系。(不确定)
大致就是这样。
其实我是感觉自己肯定哪里有错的,或者说项目属性设置的不对,或者平台之类的问题。总之来说就是不确定
自己也是刚开始学,望大神们指教