像我们搞网安这一块儿的,时不时得听大佬扯几句“缓冲区溢出”“栈溢出”等等。那对于刚入手网安的新手来说,理解确实是一件伤透脑筋的事情。那么今天咱们就来给大家简单了解下栈溢出。
(ps:由于用手机,没法传图。。。全程无图)
通俗解释
你可以这么理解栈溢出:
张三和李四分别买了一块地要建房子,碰巧是邻居地。双方为了避免其他意外,均同意在靠近对方的自己的一小片地空下来一块位置,作为中间的岔道。双方建起了房子。
但由于李四建的房子比较大,一不小心出界了,把本来留下来的地区给占用了。张三也无奈,结果导致了两家之间空余太小,意外随即发生。。。。。
技术解释
(听不懂没关系。。。。)
程序执行过的栈,是由操作系统创建维护和管理的。同时,也在支持着程序的函数调用。在函数调用时,程序会将返回地址“压”入栈中,而执行完函数后,会ret回地址,转入EIP指令寄存器,然后继续跑程序。
但是,敏感数据和程序变量同时保存在同一段内存空间中的“冯诺依曼”(呃。。)体系,肯定会会造成溢出。
就等于说,当你在向内存写东东的时候,如果写太多了,超出了给你的空间长度,那。。。(房东找你算账。)
事例溢出代码
(C)
#include <string.h>
void foo(char *bar)
{
char c[8];
strcpy(c, bar);//这就是visual studio会给你打黄警号的原因
}
int main(){
char exp[] = “123456789exp\x18\xFF\x18\x00”;
foo(exp); //调用函数,触发溢出
return 0;
}
如上这段代码便会触发栈溢出漏洞,这也是安全的问题所在。
这也告诉我们一个道理:永远不要相信任何数据,哪怕是一串1也能让你的程序触发可怕的漏洞。
(strcpy在vscode等里基本已全面禁止并选择使用另一种方案。)
版权声明:本文为tiantian520ttjs原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。