这篇文章其实是分析angr文档里给出的一个挖漏洞的小例子。
原文链接在此:https://docs.angr.io/examples#beginner-vulnerability-discovery-example-strcpy_find
这是第一个用angr在二进制里找可利用条件的教程。第一个例子是一个非常简单的程序。这个angr脚本会从程序的entry到strcpy找到一条路径。(只有我们能够控制strcpy的参数的时候)
为了找到正确的路径,angr需要去算一个密码参数,算这个密码,angr只要2s。脚本可能看起来很多,但那是因为有很多注释。
二进制程序链接:https://github.com/angr/angr-doc/tree/master/examples/strcpy_find/strcpy_test
脚本链接:https://github.com/angr/angr-doc/tree/master/examples/strcpy_find/solve.py
首先用ida分析下目标二进制看看。反编译main函数。可以看到如果参数小于2,会进入func3函数。否则是比较一下密码,如果密码正确则执行func函数。

再看看func3函数,可以知道是类似打印帮助信息的功能。

接着看看func函数。会发现这里有个strcpy函数,并且strcpy的源操作数由一个函数参数a1控制。而这个a1在main函数里则是argv[2],也就是用户可以控制的输入。如果输入一个很长的字符串,那么就会发生栈溢出。

接下来要分析的angr脚本,就是要去找到能够触发这个漏洞的输入。运行脚本,可以知道password的值。

然后,运行目标二进制,并把之前脚本得到的密码用作输入,可以发现出现了段错误。

接下来就来分析脚本是如何找到可以执行到漏洞的输入。完整脚本见angr-doc的github:https://github.com/angr/angr-doc/tree/master/examples/strcpy_find/solve.py
首先是一个helper 函数,这是用来从符号表找到函数的地址。
def getFuncAddress( funcName, plt=None ):
found = [
addr for addr,func in cfg.kb.functions.items()
if funcName == func.name and (plt is None or func.is_plt == plt)
]
if len( found ) > 0:
print("Found "+funcName+"'s address at "

本文通过一个简单的程序示例,介绍了如何使用angr框架进行二进制漏洞挖掘。通过符号执行技术,找到触发strcpy漏洞的输入,实现了栈溢出攻击。

293

被折叠的 条评论
为什么被折叠?



