angr使用记录

由于毕设需要,这几天在使用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函数处的格式化字符串漏洞未被找出。

知道了问题产生的原因,解决方法就很暴力了,在钩子处直接把固定地址提出来将符号数据写入即可。

小小的问题,大大的折磨😭

posted @ 2024-03-14 22:12  _Explosion!  阅读(29)  评论(0编辑  收藏  举报