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函数处的格式化字符串漏洞未被找出。
知道了问题产生的原因,解决方法就很暴力了,在钩子处直接把固定地址提出来将符号数据写入即可。
小小的问题,大大的折磨😭