首页 > 其他 > 详细

记录一次完整的Canary保护

时间:2021-01-30 21:14:38      阅读:29      评论:0      收藏:0      [点我收藏+]

0x00 总述

最近跟着大佬的博客以及一些视频重新学习了下Canary保护,学到了一些其他的东西,在此记录下来的所学的东西,若有理解错误的地方希望大佬可以指正。

0x01 源代码

#include<stdio.h>
int main()
{
    char str[0x10];
    read(0,str,0x20);
    printf("eur1ka %s.");
    return 0;
}

0x02 编译生成可执行文件

1. 首先先关闭栈堆保护

gcc -no-pie -fno-stack-protector -m32 -o demo1 demo1.c//关闭堆栈保护

技术分享图片

2. 在开启栈堆保护生成另一个可执行文件

gcc -no-pie -fstack-protector-all -m32 -o demo1 demo.c

技术分享图片

 

 

 0x03 对这两个文件调试

1. 首先对两个文件的main函数反汇编进行对比

技术分享图片

 

 

 

 在开启canary保护前后栈中数据存储格式如下:

技术分享图片

在开启Canary保护后对边代码多出了几行,接下来我来说明下多出来这几行的意义:

前面几行

   0x080484ac <+17>:    mov    eax,gs:0x14  //将gs:0x14这个段中的数据(即canary的值)放到eax
   0x080484b2 <+23>:    mov    DWORD PTR [ebp-0xc],eax  //再将eax(canary)放到地址为[ebp-0xc]中

后面几行

   0x080484df <+68>:    mov    edx,DWORD PTR [ebp-0xc]  //将[ebp-0xc]中的数据(即之前放到栈上的canary)房贷edx寄存器中
   0x080484e2 <+71>:    xor    edx,DWORD PTR gs:0x14  //将正确的canary值与之前存放到栈上的canary进行异或比较
   0x080484e9 <+78>:    je     0x80484f0 <main+85>   //正确的话跳转到main函数中继续执行
   0x080484eb <+80>:    call   0x8048370 <__stack_chk_fail@plt>  //错误则跳转到__stack_chk_fail函数,程序执行错误

由以上我们可知,若数据发生溢出,之前存放到栈上的canary会发生变化,进而使程序崩溃结束执行

 

记录一次完整的Canary保护

原文:https://www.cnblogs.com/eur1ka/p/14350078.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!