欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

运用WinAFL针对MSXML6 库着手模糊性的试验

来源:本站整理 作者:佚名 时间:2017-09-22 TAG: 我要投稿

大概你尚未应用过 WinAFL,它是由 Ivan(Google's Project Zero)发明的一个大型 fuzzer,它基于 Icumtuf 发明的应用 DynamoRIO 来丈量代码笼罩率的 AFL,和用于内存和过程创立的 Windows API。Axel Souchet 不停在踊跃地供给新功效,如最新稳定版中的 corpus minimization,将鄙人一篇博客中先容的 persistent execution mode 和 afl-tmin 工具。
咱们将从创立一个测试框架(test harness)开端,它可以或许让咱们在库中 fuzz 一些剖析函数,盘算笼罩规模和最小化测试用例,末了以启动 fuzzer 和对成果停止分类来停止。末了,感激来自 0patch 的 Mitja Kolsek 供给的补钉,它展示了如何用 0patch 来修补该破绽!
应用上述步调,我已经在函数 msxml6!DTD::findEntityGeneral 中找到了一个 NULL pointer dereference 的成绩,我向微软申报后被回绝,他们觉得这不是一个平安成绩。公道地说,只要 crash 确切没用,盼望有人能发明一些风趣的器械。
测试框架
在做了一些研讨的时刻,我在这里发明了微软供给的一个 C++ 示例代码,它容许咱们供给一些 XML 文件并验证其布局。我将应用 Visual Studio 2015 来构建上面的法式,但在以前,我轻微做了点改动,应用了 Ivan 的 charToWChar 办法,它接收一个参数作为一个文件:
// xmlvalidate_fuzz.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include
#include
#include
#import
extern "C" __declspec(dllexport)  int main(int argc, char** argv);
// Macro that calls a COM method returning HRESULT value.
#define CHK_HR(stmt)        do { hr=(stmt); if (FAILED(hr)) goto CleanUp; } while(0)
void dump_com_error(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());
    printf("Error\n");
    printf("\a\tCode = %08lx\n", e.Error());
    printf("\a\tCode meaning = %s", e.ErrorMessage());
    printf("\a\tSource = %s\n", (LPCSTR)bstrSource);
    printf("\a\tDescription = %s\n", (LPCSTR)bstrDescription);
}
_bstr_t validateFile(_bstr_t bstrFile)
{
    // Initialize objects and variables.
    MSXML2::IXMLDOMDocument2Ptr pXMLDoc;
    MSXML2::IXMLDOMParseErrorPtr pError;
    _bstr_t bstrResult = L"";
    HRESULT hr = S_OK;
    // Create a DOMDocument and set its properties.
    CHK_HR(pXMLDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60), NULL, CLSCTX_INPROC_SERVER));
    pXMLDoc->async = VARIANT_FALSE;
    pXMLDoc->validateOnParse = VARIANT_TRUE;
    pXMLDoc->resolveExternals = VARIANT_TRUE;
    // Load and validate the specified file into the DOM.
    // And return validation results in message to the user.
    if (pXMLDoc->load(bstrFile) != VARIANT_TRUE)
    {
        pError = pXMLDoc->parseError;
        bstrResult = _bstr_t(L"Validation failed on ") + bstrFile +
            _bstr_t(L"\n=====================") +
            _bstr_t(L"\nReason: ") + _bstr_t(pError->Getreason()) +
            _bstr_t(L"\nSource: ") + _bstr_t(pError->GetsrcText()) +
            _bstr_t(L"\nLine: ") + _bstr_t(pError->Getline()) +
            _bstr_t(L"\n");
    }
    else
    {
        bstrResult = _bstr_t(L"Validation succeeded for ") + bstrFile +
            _bstr_t(L"\n======================\n") +
            _bstr_t(pXMLDoc->xml) + _bstr_t(L"\n");
    }
CleanUp:
    return bstrResult;
}
wchar_t* charToWChar(const char* text)
{
    size_t size = strlen(text) + 1;
    wchar_t* wa = new wchar_t[size];
    mbstowcs(wa, text, size);
    return wa;
}
int main(int argc, char** argv)
{
    if (argc
        printf("Usage: %s \n", argv[0]);
        return 0;
    }
    HRESULT hr = CoInitialize(NULL);
    if (SUCCEEDED(hr))
    {

[1] [2] [3] [4] [5]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载