方便大家学习与共同进步
1、VS默认缓冲区溢出保护
VS时默认开启GS缓冲区溢出保护,我们可以关闭后来调试程序,查看缓冲区溢出保护的实现。
2、简单的示例代码
#include <stdio.h>
void test()
{
char name[20];
printf("请输入你的名字:");
scanf("%s", name);
printf("你的名字:%s\n", name);
}
int main()
{
test();
return 0;
}
3、缓冲区溢出原理
(1)未开GS缓冲区溢出检查的汇编(test函数段)
(2)开了GS缓冲区溢出检查的汇编(test函数段)
(3)实现GS缓冲区检查的汇编解释
sub esp,0x18;开辟一部分的局部内存,用于局部变量。但是我们程序里面的局部变量为20字节为0x14,则 0x18-0x14=0x4多出来的4个字节,将用于GS缓冲区溢出检测。
mov eax,dword ptr ds:[0x1113004];将一个安全cookie保存到EAX寄存器,用于随机检查
xor eax,ebp;EAX(保存的cookie)与栈顶指针(EBP)进行异或xor运算(加密),将运算结果保存到EAX
mov [local.1],eax;local.1具体汇编代码为mov dword ptr ss:[ebp-0x4],意思是将EAX寄存器的值(cookie进行异或加密的值)存放在EBP-0x4的地址处,存放值的四个字节就是我们前面提到的多申请出来的0x4。
mov ecx,[local.1];取出[local.1]存放的用于GS检查的值存放到ECX寄存器中
add esp,0x14;ESP+=14后,当前的ESP对应的值就是前面(函数入口)动态计算出来用于GS检查的值(cookie进行异或加密的值)
xor ecx,ebp;ECX与EBP异或,还原原本的cookie值,将其保存到ECX中
call BUffOver.__security_check_cookie->这是我们开启GS后,VS生成的函数调用,通过校验我们的cookie值是否被修改,判断是否有缓冲区溢出
(4)函数栈的视图(结合上面解释查看)
通过函数栈可以很好理解前面提到的安全Cookie,如果你还无法理解,可以结合下面的对比视图查看是否开GS缓冲区的差别
我们知道,通过缓冲区溢出,可以使得EIP指向新的一个地址,执行特定shellcode(注册管理员、后台下载…),从而实现溢出攻击…