当前位置:网站首页>软件漏洞分析入门(三)
软件漏洞分析入门(三)
2022-07-17 00:07:00 【默认用户_114514】
漏洞防护机制探索分析
GS安全编译机制
实际上,在之前的实验中,我们已经看到了GS的影子,这次实验我们将深入探讨一下这个GS保护机制
代码我们依然用之前用过的密码程序为例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define PASSWORD "1234567"
int verify_password(char *password){
int authentication;
char buffer[8];
authentication=strcmp(password, PASSWORD);
strcpy(buffer,password);
return authentication;
}
int main(){
int valid_flag=0;
char password[1024];
while(1){
printf("please input password: ");
scanf("%s",password);
valid_flag=verify_password(password);
if(valid_flag)
{
printf("incorrect password!\n\n");
}
else
{
printf("congratulations! you have passed the verification\n\n");
break;
}
}
system("pause");
}
GS 编译保护机制的原理是为每个函数调用增加了一个 security cookie , security cookie 在 EBP 之前,而在 .data 内存区域还存在一个 security cookie 的副本,如果我们按照之前的步骤溢出覆盖掉函数的返回地址,那么这个 security cookie 将也会被覆盖掉,在函数返回之前,系统先将这个 security cookie 和内存存放的副本比较,如果两者不一致,则说明 security cookie 被破坏了,系统会立即抛出异常中止程序运行
自 VS 7.0 之后,所有的 VS 都默认启用了 GS。现在我们把这个 GS 关掉,然后对比一下

我们把这个关掉GS的版本程序拖到 IDA 里面分析

我们对比一下一下默认的版本和关掉GS后的版本
GS 在调用函数前会多生成一个 security cookie

在函数返回前多一个步骤:检查 security cookie

RTC机制
RTC是 Visual Studio 在编译程序时的一个安全选项

RTC机制的原理是调用了VS的 CheckStackVars 函数相关功能,CheckStackVars 是微软开发的一个用来检查局部数据是否访问越界的功能,在数组的初始化阶段,会在数组之间填充 CC 即 int 3 作为数组数据边界来保护缓冲区溢出,在程序运行阶段,一旦有数组缓冲区发生了溢出,_RTC_CheckStackVars 便会检查数组的前后边界有没有改变,一旦发生了改变,程序将抛出异常并提示哪一个数组发生了溢出
和GS对照实验一样,我们也同样分别编译一个打开了RTC检查的程序以及一个没打开的程序

我们把两个程序分别拖到 IDA 里面去静态分析一下

相比原版,RTC机制在初始化阶段多了两个地方,sub esp, 40Ch 这一步是为RTC多引入的函数分配栈空间,将预留的栈空间全部初始化为 cc

在 main 函数内部,每次在涉及到数组的操作之前,都会调用 __RTC_CheckEsp 来对 esp,堆栈,寄存器的正确性进行安全检查,比如在 scanf 函数把我们输入的数据存到 Str1 也就是 Password 数组里面之前,就会调用一次

在程序其他函数的数组操作之前,也同样会有这个 __RTC_CheckEsp 的检查

在程序的结尾处,相比原来的程序,RTC机制又调用了 _RTC_CheckStackVars 函数用上文所说的方式对数组的边界进行了检查,防止数组缓冲区的溢出

下面我们用 x32DBG 来动态调试一下这两个程序,到内存里面去看看RTC的作用
我们先来看看没有RTC保护的程序
在main函数处先打个断点,直接运行到此处

在scanf函数之后打个断点,找一下input进去的数据存在哪儿

输入 777777

这里 ebp+408 的位置就 password 在内存里的位置


我们去转去内存里面看一看

我们接着动态调试一下打开了RTC的程序,可以看到RTC机制让程序 “凭空” 多出来好几个函数,这些函数就是前面提到的保护函数

我们也同样输入 777777 之后转去内存里面看看 password 的结构

可以明显看出来,相比不开RTC的原版程序,password 在内存的位置附近多了很多 cc ,这这就是之前提到过的,在数组之间初始化填充 cc 来保护缓冲区溢出以及数据的越界访问就是RTC的一种工作方式
GS和RTC机制现如今基本上已经成为了编译程序的默认选项,而在windows平台上这类机制对标的就是Linux的canary机制,安全机制由浅入深,现在去各个CTF平台去做做PWN的题目会发现,NX,canary这种级别的防护基本上也都是默认开启的,由此看来,GS和RTC的原理分析还是很重要的,只有学会了原理,在以后绕过这类安全机制的时候才能融会贯通
边栏推荐
猜你喜欢

单页面应用 SPA 和多页面应用 MPA
![Understand PHP from [Fifth space 2021] easycleanup_ session](/img/fc/95332d488dd6096f3a3f6a9fb11644.png)
Understand PHP from [Fifth space 2021] easycleanup_ session

uniapp中text-indent不起作用,uniapp首行缩进不管用如何解决?

Uni app wechat official account (5) - add and modify addresses

openGauss内核分析-统计信息与行数估计

Uni app wechat applet - Mall (8) - order details

Cento7安装mysql5.5以及升级5.7

nmap和nikto扫描

记一次用canvas做出腾讯云首页banner流光效果的经历
![[SWPU 2019] network TTL encryption and some related knowledge](/img/c7/8a4b6e7808be9189e76563848b359d.png)
[SWPU 2019] network TTL encryption and some related knowledge
随机推荐
VsCode建立非工程目录下的头文件自动查找
2022.7.7 一些错误总结
Uni app wechat official account (1) - Web page authorization login
数组操作——判断、去重、合并、展开
数据库连接池、sequelize实现增删改查等操作
el-date-picker时间范围控制
v-on的修饰符
JS高阶函数 filter/map/reduce
v-model原理及修饰符
el-form特殊字符校验
03_el与data的两种写法
JS replaces a character in the string, and JS modifies the specified character in the string
E-commerce background management login
JSX compilation
uni-app微信公众号(5)——新增、修改地址
mmap的 Bus error问题及解决
computed和watch、watchEffect
2022年暑假ACM热身练习1(总结)
uni scroll-view 下拉刷新
微信推送-模版消息参数配置