avatar

漏洞测试作业七:漏洞挖掘示例

模糊测试和Fuzzer编写

在CP VC6生成课本示例6-1的案例(RELEASE模式)

注意修改char des[5]为char des[20]:

//课本示例6-1
# 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)// strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。
makeoverflow(argv[2]); // 在cmd中运行,arg[0]为可执行文件名
}
else
printf("usage:findoverflow XXXX\n");
}

生成程序的Release版本

image-20200504180709347

(1)通过IDA此法分析的手段来实现漏洞挖掘

1. 使用逆向分析工具IDA,得到反汇编后的执行代码

1) 利用IDA打开所生成的EXE文件,view->subviews->proximity browser

image-20200507010506796

通过该视图,可见主要有一个main函数,在该函数中可能有跳转,调用sub_401000函数、_strstr函数和printf函数,此外还定义了两个字符串常量aUsageFindoverfaOverflow

2) 右键点击aUsageFindoverflow->text view,可以看到如下代码

image-20200504174255233

3) 右键点击_main->graph view,查看main函数的汇编代码块

image-20200507010605173

2. 定位敏感函数,也就是容易出现溢出的函数

==arg_x表示函数参数x的位置,var_8表示局部变量的位置==
==[]是内存寻址,[x+arg_x]表示arg_x的值==

==realease版本简洁、执行效率先==
==debug版本严格按照语法结构,增加了很多方便调试的附加信息==

  • 在主函数中,printf函数可能与==字符串格式化漏洞==有关,但通过分析主函数的汇编代码,可以看出该函数并无任何格式化参数存在

    image-20200504181201589

    有格式化字符串的printf函数:image-20200504182759080

  • 敏感函数可能存在于sub_401000函数中

    ==为什么var_14是14?,和char des[20]是否有关???==

image-20200507000054484

sub40100函数的代码大致结构如下

sub_40100(arg_0)
{
char var_14[14];
strcpy(var_14,arg_0);
}

3. 判断是否存在溢出

// 为方便观察,在程序中加入标志性符号
//课本示例6-1
# 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)// strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。
makeoverflow(argv[2]);
}
else
printf("usage:findoverflow XXXX\n");
}

测试程序:

  1. image-20200507002436762

  2. image-20200507001833966
  3. ==存在溢出问题==

    image-20200507003101236

(2)尝试自己写一个Fuzzer程序,实现对此程序的漏洞挖掘,可以在输入构造的时候以overflow为基本输入

1. 样例程序学习

1) memset和memcpy

image-20200507012838037

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);
// printf("%s\n",buf);
ShellExecute(NULL,"open",argv[1],buf,NULL,SW_NORMAL);
delete testbuf;
}
else
printf("Fuzzing X 1\n其中X为被测试目标程序所在路径,1 表示开始循环递增暴力测试\n");
system("pause");
}

2. Fuzzer程序需求分析

  1. 需要提供被测目标程序所在路径
  2. 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");
}

image-20200507015547798

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;
//printf("%s\n",buf);
ShellExecute(NULL,"open",argv[1],buf,NULL,SW_NORMAL);
delete testbuf;
}
else
printf("Fuzzing X 1\n其中X为被测试目标程序所在路径,1 表示开始循环递增暴力测试\n");
system("pause");
}

image-20200507020421987

Author: Michelle19l
Link: https://gitee.com/michelle19l/michelle19l/2020/05/15/漏测作业/漏测作业七/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
    微信
  • 支付寶
    支付寶