模糊测试和Fuzzer编写
在CP VC6生成课本示例6-1的案例(RELEASE模式)
注意修改char des[5]为char des[20]:
# include <stdio.h> # include <string.h> void makeoverflow(char* b) { char des[20]; strcpy(des,b); } void main(int argc,char* argv[]) { if(argc>1) { if(strstr(argv[1],"overflow")!=0) makeoverflow(argv[2]); } else printf("usage:findoverflow XXXX\n"); }
|
生成程序的Release版本
(1)通过IDA此法分析的手段来实现漏洞挖掘
1. 使用逆向分析工具IDA,得到反汇编后的执行代码
1) 利用IDA打开所生成的EXE文件,view
->subviews
->proximity browser
通过该视图,可见主要有一个main
函数,在该函数中可能有跳转,调用sub_401000
函数、_strstr
函数和printf
函数,此外还定义了两个字符串常量aUsageFindoverf
、aOverflow
2) 右键点击aUsageFindoverflow
->text view,可以看到如下代码
3) 右键点击_main
->graph view
,查看main
函数的汇编代码块
2. 定位敏感函数,也就是容易出现溢出的函数
==arg_x表示函数参数x的位置,var_8表示局部变量的位置==
==[]是内存寻址,[x+arg_x]表示arg_x的值==
==realease版本简洁、执行效率先==
==debug版本严格按照语法结构,增加了很多方便调试的附加信息==
sub40100函数的代码大致结构如下
sub_40100(arg_0) { char var_14[14]; strcpy(var_14,arg_0); }
|
3. 判断是否存在溢出
# include <stdio.h> # include <string.h> void makeoverflow(char* b) { char des[20]; strcpy(des,b); printf(des); } void main(int argc,char* argv[]) { if(argc>1) { printf("%d\n",argc); printf(argv[0]); printf("\n"); printf(argv[1]); printf("\n"); printf(argv[2]); printf("\n\n"); if(strstr(argv[1],"overflow")!=0) makeoverflow(argv[2]); } else printf("usage:findoverflow XXXX\n"); }
|
测试程序:
-
-
==存在溢出问题==
(2)尝试自己写一个Fuzzer程序,实现对此程序的漏洞挖掘,可以在输入构造的时候以overflow
为基本输入
1. 样例程序学习
1) memset和memcpy
2) 样例Fuzzer程序
#include <iostream> #include <windows.h> #include <stdio.h> void main(int argc,char *argv[]) { char * testbuf=""; char buf[1024]; memset(buf,0,1024); if(argc>2) for(int i=20;i<50;i+=2) { testbuf=new char[i]; memset(testbuf,0,i); memset(testbuf,'c',i); memcpy(buf,testbuf,i); ShellExecute(NULL,"open",argv[1],buf,NULL,SW_NORMAL); delete testbuf; } else printf("Fuzzing X 1\n其中X为被测试目标程序所在路径,1 表示开始循环递增暴力测试\n"); system("pause"); }
|
2. Fuzzer程序需求分析
- 需要提供被测目标程序所在路径
- argv[1]=”findoverflow “+待生成字符串
#include <iostream> #include <windows.h> #include <stdio.h> void main(int argc,char *argv[]) { char * testbuf=""; char buf[1024]; memset(buf,0,1024); char a[]="findoverflow "; for(int i=20;i<50;i+=2) { testbuf=new char[i]; memset(testbuf,0,i); memset(testbuf,'c',i); memcpy(buf,a,13); for(int j=0;j<=i+13;j++) buf[j+13]=testbuf[j]; buf[i+13]=0; printf("%s\n",buf); delete testbuf; } system("pause"); }
|
3. Fuzzer程序
#include <iostream> #include <windows.h> #include <stdio.h> void main(int argc,char *argv[]) { char * testbuf=""; char buf[1024]; memset(buf,0,1024); char a[]="findoverflow "; if(argc>2) for(int i=20;i<50;i+=2) { testbuf=new char[i]; memset(testbuf,0,i); memset(testbuf,'c',i); memcpy(buf,a,13); for(int j=0;j<=i+13;j++) buf[j+13]=testbuf[j]; buf[i+13]=0; ShellExecute(NULL,"open",argv[1],buf,NULL,SW_NORMAL); delete testbuf; } else printf("Fuzzing X 1\n其中X为被测试目标程序所在路径,1 表示开始循环递增暴力测试\n"); system("pause"); }
|