符号化执行与angr框架初探 2018-10-23 02:14:33 Steven Xeldax ## angr框架 angr有几个基本的概念 * 中间语言(Intermediate Representation) * 求解引擎(Solver Engine) * 程序状态(Program States) * 程序路径(Program Paths) * 语义表达(Semantic Representation) * 符号执行(Symbolic Execution) 关于这些官方文档已经说了很清楚,这里不再阐述 ## angr简要过程 1) 将二进制程序载入angr分析系统 2) 将二进制程序转换成中间件语言 3) 将IR语言转换成语义较强的表达形式 4) 执行进一步的分析 ## angr使用步骤 1. 新建一个angr的工程。Project()中是目标二进制程序的路径 ``` p = angr.Project('exe') ``` 2. 接着新建一个SimState的对象 ``` state = p.factory.entry_state() ``` 3. 接着,我们使用factory.path这个容器获取state的起点path对象,我的理解是相当于path的开端,之后将沿着这个开端往后进行。 ``` path = p.factory.path(state) ``` 4. 我们根据前面获取的函数入口点的path对象,利用path_group容器获取沿着path开端下面将会执行的path列表 ``` pathgroup = p.factory.path_group(path) ``` 5. 接下来就让pathgroup对象一直执行下去,直到执行到可选择的路径个数大于一个,即产生选择分支的时候,再停止。 ``` pathgroup.step(until=lambda lpg: len(lpg.active) > 1) ``` 6. dump出所有分支的内容,看看哪个答案应该是最可能的。 ``` for I in range(len(pathgroup.active)): print “possible %d: ” % I , pathgroup.active[i].state.posix.dumps(0) ``` ## slover解决引擎 ### Explorer ``` import angr b = angr.Project("./examples/Bin") # 第一就是基本的载入二进制文件 e = b.surveyor.Explore() print e.step() # 暂停 print e.run() # 开始 print "%d paths are still running" % len(e.active) print "%d paths are backgrounded due to lack of resources" % len(e.spilled) print "%d paths are suspended due to user action" % len(e.suspended) print "%d paths had errors" % len(e.errored) print "%d paths deadended" % len(e.deadended) ``` ``` import angr e = b.surveyors.Explorer(find=(0x4006ed,), avoid=(0x4006aa,0x4006fd)) e.run() if len(e.found) > 0: print "Found backdoor path:", e.found[0] print "Avoided %d paths" % len(e.avoided) print e.found[ 0 ].state.se._solver.result.model ``` ### Path group ``` import angr p = angr.Project("./examples/Bin") s = p.factory.blank_state(addr = 0x4006ed) pg = p.factory.Path_group(s,immutable = False) path = pg.explore(find = (0x4006aa,)) print path print pg.found[0].state.se._solver.result.model ```