首页 - 新闻 - vs2010做缓冲区代码_【配置ARToolKit】——基于VS2010与Win10下

vs2010做缓冲区代码_【配置ARToolKit】——基于VS2010与Win10下

2023-09-18 10:24

初探VS2010缓冲区安全检查

(是原创,转自自己的人人,而该人人已经注销)。

???????? 今天做一个缓冲区溢出的实验,然后各种奇葩,各种与资料出入。然后OD跟进,观察汇编代码和堆栈数据,发现是VS2010的缓冲区安全检查在搞鬼。查阅网上资料,发现还是有点出入或者不全吧。这里与大家分享一下我的发现。

???????? 缓冲区溢出是很多漏洞的具体表现形式,而VS在这方面引入了一个GS编译选项。如果选择该选项,则在编译过程中vs会对相关的“可能有问题的”函数加入自己的代码来检查缓冲区溢出。而_security_cookie是它加入到问题函数堆栈中的一个双字(四字节)变量。根据网上的说法,这个变量是放在堆栈中存放“上个函数的EBP值”的元素上面(以“上”为内存地址小的方向),这样如果缓冲区溢出并且修改了函数返回地址,则一定会覆盖本_security_cookie,通过在函数返回之前检查之则可得出结论是否缓冲区溢出。如果溢出,直接终止进程。

???????? 然而在实验中,并没有修改返回地址,却还是被无情的终结了。通过关闭GS选项,则没有此问题。

???????? 那么就让我们看看GS选项到底干了什么?

???????? 测试代码:

int verify_password (char *password)

{

???????? int authenticated=0x555555;

???????? char buffer[44];

???????? authenticated=strcmp(password,PASSWORD);

???????? strcpy(buffer,password);

???????? return authenticated;

}

???????? OD查看相关部分代码,即有问题的函数,发现在开头多了如下代码:

单步执行,发现压入的是_security_cookie和EBP的异或值,而且这个值是在我们返回值的上面!并不是在原EBP值的上面,而是紧紧贴着缓冲区尾部。这样不一定要修改返回地址,只要修改超出尾部的数据,就会修改安全值,导致被终结。

EAX异或后的值

堆栈中的值

???????? 微软的东西,还真是花样多啊。不过话说这样的溢出在用到C++string类还会有么?呵呵,再议再议。今天也就是我这只小菜鸟练练手吧。

再探VS2010缓冲区溢出检查

?????? (还是转自我的人人,不过人人因为无聊,已经注销)

?????? 有好友凌晨5点QQ问我一个问题:如果函数中有两个缓冲区,然后其中一个被写入的时候覆盖了下一个缓冲区部分数据,这样会不会引起异常呢?本着“实践出真知”的精神,从床上爬起来,我又一次打开了VS和OD。

???????? 测试函数代码如下:

???????? void test(char *pIn)

{

???????? char buff1[50];

???????? char buff2[50];

???????? buff2[0]=buff2[1]=buff2[2]=buff2[3]='a';

???????? strcpy(buff1,pIn);

???????? return;

}

???????? 输入数据pIn长度为75字节。

???????? 说句题外话,按照顺序压栈的话,应该是buff2更靠近栈顶才对啊,就像上次一样。可是VS不知他怎么想的,实验证明是buff2更靠近栈顶,这又折腾了我半天,差点实验结果都解读错了。再议再议。

???????? 结果VS编译选项选择了GS,但是还是没有报错。打开OD,结果如下。

???????? 复制到一半的时候:

注:(KKKK….)是正在修改的缓冲区,aaaa是我们用来标记buff2开头的:

复制开始覆盖buff2:(注意已经开始覆盖)

复制完全覆盖buff2开头几个双字:

但是vs非常和谐的不说话。程序本身也非常和谐的不说话,精神贯彻的非常好。

根据本实验,得出假设:VS的_security_cookie会在该函数的栈中最靠近返回地址的缓冲区的尾部添加安全值,这样符合他的作用:“检查是否覆盖返回地址”,而不是检查是否覆盖另一个缓冲区或数据。

先写这么多,今天又是我这只小菜鸟练练手了:)。谢谢批评指正。

1.OpenGL安装与2010配置

1.1、OpenGL库的安装

1)将下载下来的OpenGL库解压到文件夹,拷贝文件夹中的.h文件到Visual C++ 6.0/Microsoft Visual Studio 10.0\VC的\Include\GL目录中(此处自己建立文件夹GL); 2)将.lib文件拷贝到Visual C++ 6.0/Microsoft Visual Studio 10.0\VC的\lib目录中去; 3)将.dll文件拷贝到操作系统的C:\Windows\system32目录中,如果是windows7 64位操作系统需要拷贝到C:\Windows\SysWOW64目录中去。

1.2、VS2010配置

1)使用VS2010创建一个32位控制台程序; 2)“项目——项目属性——配置属性——C/C++— —预处理器——预处理器定义”,添加“GLUT_BUILDING_LIB”; 3)“项目——项目属性——配置属性——链接器——输入——附加依赖项”,添加“glut32.lib Opengl32.lib Glu32.lib glew32.lib”(由于没有glew32.lib文件,此处可以不添加);

1.3、OpenGL的测试

#include

#include

void RenderScene(void)

{

//OpenGL中设置了多个缓冲区,其中放置了各种内容,

//比如顶点的信息,色彩的信息,命令的信息。

//他们并不会直接生效,要想他们生效就必须清空这些缓冲区,

//glClear就是清空缓冲区的函数,

//在参数里加上GL_COLOR_BUFFER_BIT,就是清空颜色缓冲区,

//比如之前用glClearColor设置了背景色,但是不会立即生效,

//背景色信息会被放入颜色的缓冲区,也就是GL_COLOR_BUFFER_BIT

//这里清空了颜色缓冲区也就是使里面的背景色生效,也就是用背景色填充了屏幕。

glClear(GL_COLOR_BUFFER_BIT);

//gl表示函数属于OpenGL函数库中的哪个工具箱,还有glu、glut。

//Color是一个标记,说明这个函数肯定跟颜色有关。

//3f说明这函数的参数表中应该有三个变量,为GLfloat型

glColor3f(1.0f,0.0f,0.0f);

// 绘制矩形

glRectf(100.0f,150.0f,150.0f,100.0f);

//OpenGL中的绘图命令在被调用时并不会立即生效,而是会被放入一个命令队列

//glFlush的功能就是将命令队列中的命令都生效并清空队列。

//当设置了双缓冲时,glFlush就不在需要了

glFlush();

}

// 当窗口大小改变时,得到的新的宽度和高度

void ChangeSize(GLsizei w,GLsizei h)

{

if(h == 0)

{

h = 1;

}

//1.修剪区(也叫裁剪区)为OpenGL的三维工作空间,

//是右手笛卡尔坐标系空间中被划分出来作为工作空间的区域,注意它是三维的。

//2.视区(也叫视口)就是修剪区在二维平面上的投影区域,

//由于显示屏是二维的平面,因此修剪区没法直接被显示,

//需要被投影在一个二维的平面区域上,也就是视区,

//OpenGL显示的就是视区的内容。

//3.窗口就是在程序中用来放视区的地方,

//视区占窗口的大小是可以设置的,通常设为跟窗口一样大。

// 定义视区,x,y指定窗口内视区的左下角,通常为0

// width和height参数以像素为单位指定宽度和高度

glViewport(0,0,w,h);

// 选择投影矩阵

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

if(w <= h)

{

// 定义修剪区,left和right指定x轴上显示的最小和最大坐标值

// bottom和top用于y轴

// near和far用于z轴,通常是远离观察者的负值

glOrtho(0.0f,250.0f,0.0f,250.0f * h/w,1.0f,-1.0f);

}

else

{

glOrtho(0.0f,250.0f * w/h,0.0f,250.0f,1.0f,-1.0f);

}

//投影矩阵负责为我们的场景增加透视

//选择模型观察矩阵

glMatrixMode(GL_MODELVIEW);

//近似于重置。它将所选的矩阵状态恢复成其原始状态

glLoadIdentity();

}

void SetupRC(void)

{

// 设定窗口内的背景色。

// 前三个参数为红绿蓝,最后一个参数为alpha成分,用于混合的特殊效果

glClearColor(1.0f,1.0f,1.0f,1.0f);

}

void main(void)

{

// 设置单缓冲窗口并使用RGB颜色模式

// GLUT_DOUBLE 设置双缓冲窗口

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

// 设置窗口的位置

glutInitWindowPosition(100,100);

// 设置窗口的大小

glutInitWindowSize(1024,768);

// 创建并设置窗口的标题

glutCreateWindow("GLRect");

// 设置当前窗口的显示回调函数,相当于绘图函数

glutDisplayFunc(RenderScene);

// 窗口的再整形回调函数,

// 窗口被人为改变大小时,图形的位置进行再调整

glutReshapeFunc(ChangeSize);

// 进行OpenGL的初始化

SetupRC();

// 该函数让GLUT框架开始运行,所有设置的回调函数开始工作,

// 直至用户终止程序

glutMainLoop();

}

1.4运行情况

2.ARToolkit在VS2010下的安装与配置

2.1文件的配置

1、解压www.gsm-guard.net到目标文件夹(自己定义),直接解压到当前文件夹即可,如D:\Program Files,此时文件夹为{ARToolKit}; 2、把第一个www.gsm-guard.net解压放在刚才解压的ARToolKit文件夹下,将DSVL\bin文件夹下的DSVL.dll和 DSVLd.dll放到ARToolKit\bin下

3、将OpenVRML解压后文件夹剪切至ARToolKit文件夹中,将ARToolKit\OpenVRML\bin\js32.dll复制,放进{ARToolKit}\bin里面去 4、复制 msvcp71d.dll、msvcr71d.dll到文件夹ARToolKit\bin

5、双击鼠标左键执行 ARToolKit\Configure.win32.bat 文件。

6、ARToolkit文件夹下的include和lib文件夹中的内容分别拷至Microsoft Visual Studio 10.0\VC下对应的文件夹

(如我的路径为:C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC)

7、把ARToolKit\bin下的DSVL.dll, DSVLd.dll,libARvideo.dll,libARvideod.dll复制放在C:\Windows\SysWOW64下,(如果此路径下没有msvcp71d.dll和msvpr71.dll那么需要下载一个然后放入该路径),如果是32位系统则目标文件夹为C:\Windows\System32。

8、双击{ARToolKit}目录下的ARToolKit.sln,转换版本; 9、点击生成-批生成,然后在{ARToolKit}\lib文件夹下面会生成一些lib文件,这一步必须先执行。否则直接运行包含ARToolkit的项目会出现无法解析外部符号的错误。

10、运行测试程序D:\Program Files\ARToolKit\bin\graphicsTest.exe,出现旋转茶壶如下图2所示:

前面这些步骤都可以参考:

http://www.gsm-guard.net/qingyang8513/article/details/45577721

这些步骤完成之后在VS2010中运行代码仍然会报错,还需要进行以下步骤

2.2.我遇到的问题及解决方法(这是我一步步的调试过程,以及可能遇到的错误)

1.单独打开一个例子运行,我的路径如下:D:\programing\AR\ARToolKit\examples\simple

2.运行程序,可能会产生如下错误

3.接下来要修改输出路径

初始路径为:

修改为:

4.再运行程序可能会产生如下错误

这是由于在D:\programing\AR\ARToolKit\examples\simple\Debug目录下缺少一些必要的dll文件,如图:

将这些文件复制到D:\programing\AR\ARToolKit\examples\simple\Debug下,再继续运行程序,仍然无法成功。可能会出现闪退的问题

5.接下来将Data文件复制到D:\programing\AR\ARToolKit\examples\simple,再运行即可成功

6.运行结果

必要的安装包:

链接:https://www.gsm-guard.net/s/1jH5HBpW 密码:krzw**