首页
社区
课程
招聘
[分享]关于VS2017/2015和VS2008下GS的区别
2018-6-11 11:38 12050

[分享]关于VS2017/2015和VS2008下GS的区别

2018-6-11 11:38
12050
 

 这篇帖子我也不知道应该设置成分享贴,还是讨论贴,因为我也不知道我下面提到的结论对不对。

  之前在看《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,所以应该和平台没关系。(不确定)

大致就是这样。
其实我是感觉自己肯定哪里有错的,或者说项目属性设置的不对,或者平台之类的问题。总之来说就是不确定
自己也是刚开始学,望大神们指教



[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

最后于 2018-6-11 13:01 被xyy吸氧羊编辑 ,原因:
收藏
点赞1
打赏
分享
最新回复 (5)
雪    币: 714
活跃值: (82)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
xyy吸氧羊 2018-6-11 11:42
2
0
其中的一个问题就是为什么VS2017/2015编译出来的程序在调用malloc的时候,没有像VS2008那样直接在OD中显示了malloc,我查找了模块调用,发现根本没有malloc,而是这个函数,是项目属性的问题吗?求大神们指教
雪    币: 714
活跃值: (82)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
xyy吸氧羊 2018-6-11 11:46
3
0
另外一个问题关于执行shellcode的:,到这里之后应该开始执行shellcode了,但是F7单步直接进入异常了,OD报错SEH链太长?
这个问题要怎么解决啊
雪    币: 5676
活跃值: (1303)
能力值: ( LV17,RANK:1185 )
在线值:
发帖
回帖
粉丝
holing 15 2018-6-11 16:56
4
0
xyy吸氧羊 另外一个问题关于执行shellcode的:,到这里之后应该开始执行shellcode了,但是F7单步直接进入异常了,OD报错SEH链太长?这个问题要怎么解决啊
你这个可能是区段不可执行吧
雪    币: 714
活跃值: (82)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
xyy吸氧羊 2018-6-11 17:14
5
0
holing 你这个可能是区段不可执行吧
我在编译的时候已经关了DEP
那现在看来需要设置DEP工作状态为Optout应该就可以解决了。 
雪    币: 114
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
路远_人尚在 2020-3-12 18:31
6
0
有一个问题   在08下边  编译的时候  关闭了GS  为什么在反编译的时候   还是存在 Security_cookies
游客
登录 | 注册 方可回帖
返回