一、栈帧平衡
函数在调用前后栈不变
引入EBP ESP寄存器
EBP:指向栈底
ESP:指向栈顶
数值上:ESP<EBP
call(记住过去与回来的地址)
1、返回地址push进栈
2、jump到要用的函数
return(与call相反)
1、将返回地址pop出来
2、jump到此地址
如何栈帧平衡
将EBP(栈底)push入栈,将EBP指针指向ESP(两个同时指向栈顶),一系列操作完成将ESP指针指向EBP,最后将ESP(栈顶)pop出来复位
二、缓冲区溢出
缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,使得溢出的数据覆盖在合法数据上(输入的内容超出了你开辟的空间,覆盖了返回地址)
注意1:栈的延展顺序:高地址->低地址
注意2:数值输入:低地址->高地址
三、gdb常用命令
(gdb)next 执行下一步
(gdb) next N 执行N次下一步
(gdb)pattc 生出随机数
(gdb)jump 5 跳转执行程序到第5行
(gdb)return 强制返回当前函数
(gdb)patto要查找的东西
(gdb)start开始运行程序
四、一道最基础的 缓冲区溢出漏洞攻破 题目
void cmd(){
system("sh");
}
void A(){
char a[100];
scanf("%s",a);
return;
}
int main(){
A();
}
1、找到cmd地址并记录下来
2、开始运行程序
3、随机生成200个字符(要超过开辟的空间)
4、找到返回地址的具体位置(见下图,为112位)
5、覆盖返回地址
ending
本以为社会实践回来之后已是沧海桑田,没想到还能听懂,感动.jpg