根据Radare2文档,这是查找路径的命令:

agt [addr]            find paths from current offset to given address


但是当我尝试运行命令时,在运行aaaaa分析之后,出现以下错误:
[0x00430044]> agt 0x0042aa98 > agtoutput.dot
Unable to find source or destination basic block


我可以确认这两个地址是函数,并且可以分别绘制每个函数的图。同样,0x00430044确实导致0x0042aa98。我可以从gdb跟踪中看到这一点。我查看了radare2 canal.c代码,发现它正在通过RAnalFunction->bbs查找所提供的地址。我通过运行abb $s

abb [length]         analyze N bytes and extract basic blocks 


并将输出返回到r2来确保bbs被这些地址填充。我从各个位置运行了abb $s,以查看是否会将基本块添加到bbs列表中。各个位置分别是0x00x004300440x0042aa98。但是没有任何效果,我总是收到“无法找到源或目标基本块”错误消息。我可能会走得很远,但“查找路径”功能将非常有用,我真的想让它正常工作吗?如文档所述,在使用agt功能方面的任何帮助将不胜感激。

评论

您尝试使用官方支持选项吗?

当您说官方支持选项时,您是说aaa而不是aaaaa吗?我只是在您发表评论后尝试过,但结果还是一样。也只是从最新的radare2 git重建而来。我以前一直使用大约一个月的构建。

什么是官方支持选项

我觉得该功能没有完全实现。我浏览了一下代码(canal.c),发现了一个“ bug”,它将使agt调用永远无效。我在本地修复了该错误,因此我克服了最初的错误,但是“ r_core_anal_graph_to”函数基本上不返回任何结果。太可悲了:-(,这将是一个很棒的功能。不确定该选项为何在帮助菜单中,因为它似乎根本无法工作。除非,我会丢失一些东西。

如果您知道这是一个错误,请在r2仓库中打开一个问题,或者如果有此修复程序,甚至更好,然后向他们发送请求请求。我假设您正在从git运行r2。

#1 楼

似乎该功能尚未实现。如您在此功能中所看到的:

...
if (root && dest) {
    if (dest == root) {
        eprintf ("Source and destination are the same\n");
        return NULL;
    }
    eprintf ("ROOT BB 0x%08"PFMT64x"\n", root->addr);
    eprintf ("DEST BB 0x%08"PFMT64x"\n", dest->addr);
    list = r_list_new ();
    printf ("=>  0x%08"PFMT64x"\n", root->jump);
} else {
    eprintf ("Unable to find source or destination basic block\n");
}
return list;
...


随时在官方存储库中打开一个问题,或者更好-尝试自己实现以实现以下目的:我们所有人。

最后,不要使用aaaaa,它甚至不存在,并且aaa之后的任何分析命令都是试验性的,可能会导致您遇到错误。无论如何,您不必如此深入地分析。

有关radare2中分析的更多信息,请参见此答案。

#2 楼

当我意识到此功能尚未实现时,我采取了一种变通方法来获得所需的功能。我输出完整的程序调用图,然后制作了一个非常简单的python脚本,该脚本使用networkx查找节点之间的路径。这不是很理想,但是可以完成工作。

在radare2中,我将完整的程序调用图输出到一个.dot文件:

agC > agCfullProgramCallGraph.dot


然后,我有一个python脚本,可以获取该图并找到我感兴趣的连接节点的路径。

#!/usr/bin/env python
"""
Given a .dot graph, a source node, target node, this script prints out new graphs with all the paths between

"""       
import networkx as nx
from pygraphviz import *
class DotGraphvizUtil(object):

    def find_paths(self, dot_file_path, source, target):
        agraph = AGraph(dot_file_path)
        graphviz_graph = nx.nx_agraph.from_agraph(agraph)

        paths = nx.all_simple_paths(graphviz_graph, source=source, target=target)

        i = 0

        for path in paths:
            subgraph = nx.subgraph(graphviz_graph,path)
            print(path)
            nx.nx_agraph.write_dot(subgraph,"srcTargetGraph{}.dot".format(i))
            i =+ 1

        if i == 0:
            print("No paths found from {} {}".format(source, target))    

if __name__ == '__main__':
    dot_file = "agCfullProgramCallGraph.dot"
    dotGraph = DotGraphvizUtil()
    dotGraph.find_paths(dot_file_path=dot_file, source='0x004669bc', target='0x00466828')