跟踪函数的返回值做了什么

逆向工程 艾达
2021-06-16 07:48:22

我编写了一个简单的 IDA 插件,它在函数调用后查找mov MEM_LOCATION eax并添加存储返回值的内存的名称。我将我的搜索限制在函数调用之后的几条指令,如果在返回值被存储之前我看到另一个调用,我就会退出。除了这些启发式方法之外,是否有更严格的方法来跟踪返回值的去向?

2个回答

该问题的一个更通用的名称是数据污染。您将一些数据标记为受污染,然后在其余代码中跟踪污染传播。有很多关于污点分析的研究正在进行,并且有很多工具。看看bitblaze尤其是taint tracker编辑:只是发现它不再可用并且已经过时了......),它有一部分用于污点跟踪。

如果您需要更“轻量级”的东西,请查看 julio auto's 和 bsdaemon's VDT,它们更面向漏洞利用开发,但可能会让您了解事情是如何工作的。VDT 实际上做的事情与您所做的非常相似,但它是相反的。给定一个执行跟踪,您可以从某个值进行向后搜索,以查看它是如何初始化的、它在哪里使用以及它影响了哪些代码。

有关更多学术方法,请查看“关于动态污点分析和前向符号执行的所有你想知道的”。

所有这些都是关于动态分析的,虽然一些更简单的东西可以静态实现。我现在想不出任何例子/工具。我相信有人会想出更多的工具和想法。

在静态上下文中,这称为“数据流分析”。例如,Hex-Rays 将函数调用的返回位置信息合并到其函数表示中,以确定数据流向哪些其他位置。你没有详细说明你想用这些信息做什么,但我想说的是,研究编写一个 Hex-Rays 插件是值得的。