由於畢設需要,這幾天在使用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函式處的格式化字串漏洞未被找出。
知道了問題產生的原因,解決方法就很暴力了,在鉤子處直接把固定地址提出來將符號資料寫入即可。
小小的問題,大大的折磨😭