ble55ing的技术专栏 code analysis ,fuzzing technique and ctf

IDA Python实现控制流图生成

2019-09-08
ble55ing


IDA Python实现控制流图生成

基于IDA Python的控制流图生成方案。

IDA Python生成的控制流图,其粒度大小与AFL识别的粒度大小基本相同。angr的粒度相比之下要小得多。因此angr所消耗的资源会更多,对于AFL插桩后的程序无法较好的完成控制流图 生成工作,因此尝试使用IDA Python进行控制流图的生成(AFL插桩后的程序大小竟然会扩到约10倍,有点恐怖)

IDA Python 介绍

IDA Python有三个库,其中提供一些API来提供一些功能

import idaapi
import idautils
import idc

使用IDA 打开程序后,按下Alt +F7选择脚本运行。

需求功能

其实只要得到所有函数的F12的图的文件就可以了,那是WinGraph32的控制流图表示文件,用这个文件来得到控制流图会更简洁。。然后没找到批处理的方法。

所以就自己写了一个,处理跳转然后建立基本块间的可达关系然后得到控制流图。

附上依序处理基本块的代码

def main():

    start_time = time.time()

    all_funcs = idautils.Functions()
    GetDeclareFuncName()
    ii=0;
    for fn in all_funcs:
        ii+=1
        func_name = idc.GetFunctionName(fn)
        fflags = idc.GetFunctionFlags(fn)
        if func_name not in DeclareFuncName:
            continue
        #if func_name.find("main")!=0 or len(func_name)!=len("main"):
        #    continue

        fout = open("out.txt", "a")
        fout.write("FuncName: "+func_name +"\r\n")
        fout.close()
        DeclareFuncSit.append(blocknum)

        f_blocks = idaapi.FlowChart(idaapi.get_func(fn), flags=idaapi.FC_PREDS)
        
        for block in f_blocks:
            dealblocks()

遇到的问题

如何解决函数调用的问题

按照正常程序执行的过程进行,在函数中记录一个表示所有正常return的基本块的list,在函数调用结束后,根据这个list生成函数退出时,到达该基本块后一个基本块的可达关系。

jmp eax

关于jmp eax 这样的指令,在静态分析的时候不能很好的解析她接下来可能的跳转关系。可能可以做一个备选跳转路径的表?就是记录所有含有这种间接跳转的基本块的AFL桩点,然后生成这些基本块与所有可达基本块间的路径。图如果在程序的执行过程中,有出现这些路径中的一条,则将其也添加到可达路径的序列中。


Similar Posts

Content