首页
论坛
课程
招聘
[求助]winafl测试用例导致目标程序崩溃问题
2020-7-20 21:36 1241

[求助]winafl测试用例导致目标程序崩溃问题

2020-7-20 21:36
1241

    我在用winafl测试一个DLL。fuzzer运行到perform_dry_run()中的calibrate_case()的时候,在循环run_target时,第一次成功,第二次就失败了。第二次失败的原因是WriteCommandToPipe('F')后,目标程序崩溃了,ReadCommandFromPipe收到0,然后程序返回Test case 'id_000000' results in a crash。


    calibrate_case在循环执行run_target时,第一次成功了,而且此时目标程序没有崩溃,说明我的测试用例id_000000是正常的(实际上这是正常运行时的一个用例,它没有问题)。   


    第二次失败的原因我不知道如何跟踪。如果哪位大哥知道原因,或者有好的调试这类问题的办法,请指导我一下,感激。


    我的目标程序是我自己写的,主要是参考了Fuzz 工具 WinAFL 的使用感受 - 对 FreeImage 图片解析库进行模糊测试 ^_^


    下面是我自己写的目标程序:

#include <Winsock2.h>
#include "windows.h"
#include "stdio.h"
#pragma comment (lib, "ws2_32.lib")

//typedef void(*GetSysIniFile)(char *dest);
//typedef int(*RealDB_GetPrivateProfileInt)(LPCSTR lpAppName, LPCSTR lpKeyName, INT nDefault, LPCSTR lpFileName);
typedef void(*RealDBInit)();
typedef bool(*RtdbManagerInit)(bool a2);

extern "C" __declspec(dllexport) void fuzzMe(RtdbManagerInit pRtdbManagerInit, DWORD pNodeName);

extern "C" __declspec(dllexport) int main(int argc, char** argv);

char A4F0[0x1000] = "";

int main(int argc, char *argv[])
{
    HMODULE module = LoadLibraryA("RealDB.dll");
    BOOL b = FALSE;
    

    //GetSysIniFile pGetSysIniFile = (GetSysIniFile)GetProcAddress(module, (LPCSTR)313);
    //RealDB_GetPrivateProfileInt pGetPrivateProfileInt = (RealDB_GetPrivateProfileInt)GetProcAddress(module, (LPCSTR)587);
    RealDBInit pRealDBInit = (RealDBInit)GetProcAddress(module, (LPCSTR)16);
    RtdbManagerInit pRtdbManagerInit = (RtdbManagerInit)GetProcAddress(module, (LPCSTR)441);
    
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 0), &wsaData);
    
    DWORD pNodeName;
    pNodeName = (DWORD)A4F0;
    
    __asm {
        mov ecx, pNodeName;
    }
    pRealDBInit();

    fuzzMe(pRtdbManagerInit, pNodeName);
    
    FreeLibrary(module);

    return 0;
}

void fuzzMe(RtdbManagerInit pRtdbManagerInit, DWORD pNodeName)
{
    __asm {
        mov ecx, pNodeName;
    }
    pRtdbManagerInit(FALSE);
    __asm {
        sub esp, 4;
    }
}



     这是我的fuzz命令:

afl-fuzz.exe -i Path_in -o Path_out -D Path_DynamoRIO\bin32 -t 20000 -f Path\currentsize -- -coverage_module RealDB.dll -fuzz_iterations 5000 -target_module test2.exe -target_offset 0x1000 -nargs 1 -- Path\test2.exe @@






[注意] 招人!base上海,课程运营、市场多个坑位等你投递!

最后于 2020-7-20 21:37 被吴俊编辑 ,原因:
收藏
点赞0
打赏
分享
最新回复 (4)
雪    币: 1
活跃值: 活跃值 (202)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Flyour 活跃值 2020-7-21 11:56
2
0
main 函数里 死循环跑一下fuzzMe 函数,不是每个函数都可以被重复调用,更何况还是个init函数
雪    币: 187
活跃值: 活跃值 (192)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
吴俊 活跃值 2020-7-21 14:52
3
0
Flyour main 函数里 死循环跑一下fuzzMe 函数,不是每个函数都可以被重复调用,更何况还是个init函数
确实是这个原因,谢谢
雪    币: 1037
活跃值: 活跃值 (106)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
bksaro 活跃值 1 2020-7-21 17:10
4
0
你这个接受的命令行参数呢?也就是样本用来干什么了呢?
雪    币: 187
活跃值: 活跃值 (192)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
吴俊 活跃值 2020-7-21 18:42
5
0
bksaro 你这个接受的命令行参数呢?也就是样本用来干什么了呢?
我用-f指定的测试文件,它不是通过命令行接收的
游客
登录 | 注册 方可回帖
返回