最近跟着大佬的博客以及一些视频重新学习了下Canary保护,学到了一些其他的东西,在此记录下来的所学的东西,若有理解错误的地方希望大佬可以指正。
#include<stdio.h> int main() { char str[0x10]; read(0,str,0x20); printf("eur1ka %s."); return 0; }
1. 首先先关闭栈堆保护
gcc -no-pie -fno-stack-protector -m32 -o demo1 demo1.c//关闭堆栈保护
2. 在开启栈堆保护生成另一个可执行文件
gcc -no-pie -fstack-protector-all -m32 -o demo1 demo.c
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会发生变化,进而使程序崩溃结束执行
原文:https://www.cnblogs.com/eur1ka/p/14350078.html