首发于:http://www.giantbranch.cn/?p=449
前言
这是8月处写的,缓冲区溢出大家估计听了不少了,但是实践过就更好了
为什么会出现缓存区溢出呢?(这里主要针对栈)
简单来说,首先局部变量,返回地址都是储存在栈上的,当我们的输入很长的一串字符,而且程序不检查长度就直接copy到局部变量上,那么局部变量就可以覆盖返回地址,控制漏洞函数的返回地址,从而控制程序的执行(具体实践实例)。
实例实践与分析
首先编译下面的代码,编译用debug版吧
#include <stdio.h>
#include <windows.h>
int overflow_here(char *key){
char buffer[66];
strcpy(buffer, key);
return 0;
}
int main(){
char key[666];
FILE *fp;
LoadLibrary("user32.dll");
if (!(fp = fopen("key.txt", "rw+"))){
exit(0);
}
fscanf(fp, "%s", key);
overflow_here(key);
printf("come on, overflow me!");
return 0;
}
可以看到漏洞函数overflow_here,直接将我们输入的key copy到buffer那,又没有对长度进行检查
解析一下代码
1.LoadLibrary("user32.dll"); 这动态链接库是为我们等一下运行弹框提供支持
2.还有为什么要从文件读取呢,因为我们覆盖返回地址的话,基本都要输入一些不可见字符,在文件中可以用十六进制编辑器区输入
当然还可以用py