栈溢出:
栈溢出是缓冲区溢出的一种,分配的内存空间是有限的,如果输入超长的字符串必然会导致溢出。缓冲区溢出中最危险的是堆栈溢出,因为入侵者可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码比如得到系统权限。
原理:
先看一段代码:
char dest[10];
scanf("%s",dest);
这两行代码声明了一个局部变量,然后用scanf函数读入字符串,但是这个程序没有限制字符串长度的地方。如果用户输入的字符串长度大于十个字符,那么就会产生栈溢出。
而函数的局部变量是存储在栈中的,这种错误就是栈溢出。
利用:
还是刚才的那一段代码:
char dest[10];
scanf("%s",dest);
编译之后用ida打开,应该是一个普通栈应该有的结构:
-0000000C dest db ? ;
-0000000b db ? ;
-0000000a db ? ;
-00000009 db ? ;
-00000008 db ? ;
-00000007 db ? ;
-00000006 db ? ;
-00000005 db ? ;
-00000004 db ? ;
-00000003 db ? ;
-00000002 db ? ;
-00000001 db ? ;
+0000