1.栈溢出原理
栈溢出之所以可以修改EIP,是利用局部变量和返回地址是同时保存在栈中的。
当调用call命令时,会将下一条指令的地址push到栈中,然后进入call函数。
而在call函数中,局部变量也会继续在同一个栈中保存。所以当复制字符串时,就有可能向下溢出,将返回地址给覆盖了。这就导致retn时,将被覆盖的返回地址pop到EIP中执行。
2.整数溢出原理
整数溢出其实是利用了整数存在上限的问题。比如一个USHORT类型的数据,他的上限就是65535,当你给他输入65536时就会溢出,此时就变成了0。而我们一般做字符串长度校验时,通常都是
char des[11] = { 0 };
if(strlen(str) > 10)
{
printf("对不起输入的str长度过长,无法复制\n");
return 0;
}
strcpy(des, str);
那么此时的str字符串如果是一个超级长的字符串65536时,这个条件由于整数溢出依旧会成立。所以在其下方的strcpy函数就会发生栈溢出。整数溢出的核心就是突破长度检测。