angr使用記錄

_Explosion!發表於2024-03-14

由於畢設需要,這幾天在使用angr符號執行自動化挖掘格式化字串漏洞,但是對angr的瞭解不多,導致在使用的時候屢屢碰壁,在此記錄一下。

本來寫了一個簡單的通用檢測指令碼,但是在使用指令碼對CWE-134的一個樣例(SARD)進行分析時,發現無法找出漏洞點。

檢測指令碼測試格式化字串漏洞的邏輯很簡單,就是對關鍵函式的引數進行檢測,看其是否符號化。

初步閱讀待測程式原始碼,發現其漏洞點為swprintf函式,問題程式段如下:

void CWE134_Uncontrolled_Format_String__wchar_t_listen_socket_snprintf_68b_badSink()
{
    wchar_t * data = CWE134_Uncontrolled_Format_String__wchar_t_listen_socket_snprintf_68_badData;
    {
        wchar_t dest[100] = L"";
        /* POTENTIAL FLAW: Do not specify the format allowing a possible format string vulnerability */
        SNPRINTF(dest, 100-1, data);
        printWLine(dest);
    }
}

在符號執行時,我對swprintf函式掛鉤子抓取引數資訊,發現其data地址處內容為空,並未符號化。

輸出結果:

因此對data進行溯源,發現其來源為:recvResult = recv(acceptSocket, (char *)(data + dataLen), sizeof(wchar_t) * (100 - dataLen - 1), 0);

即data處內容為recv函式得到的套接字傳輸資料,對recv函式掛鉤子抓取引數資訊

列印buf引數,發現輸出如下:

可知data地址為0x7ffefdbc,但是後面的引數為一個未初始化的符號變數,且可能是wcslen結果不確定造成的,閱讀待測程式原始碼發現dataLen的定義為size_t dataLen = wcslen(data);

因此可知angr在符號執行時wcslen計算結果不確定導致recv函式未能對data地址處資料符號化,從而導致swprintf函式處的格式化字串漏洞未被找出。

知道了問題產生的原因,解決方法就很暴力了,在鉤子處直接把固定地址提出來將符號資料寫入即可。

小小的問題,大大的折磨😭