支持反向执行的动态检测工具

逆向工程 二元分析 动态分析
2021-07-04 19:37:08

我试图分析一些执行崩溃信息,并更好地确定内存访问错误的根本原因,我想reverse execute从崩溃点开始程序。

比如下面找出内存访问错误的根本原因,我想从第三行逆向执行,利用一些数据流分析技术,我应该可以在第一行找出根本原因。

mov    -0x18(%rbp),%rax       <---- root cause is at memory -0x18(%rbp)
add    %rdx,%rax
mov    (%rax),%eax            <--- crash when reading (%rax)

所以这是我的问题,是否有任何可以支持反向执行的动态分析工具/调试器?我更喜欢Pin,但我不知道Pin可以做到这一点..

3个回答

看看http://rr-project.org网站说它支持反向执行。但是,我不能 100% 确定这是否与您所说的完全相同。

rr 还提供了 gdb 下的高效反向执行。设置断点和数据观察点并快速反向执行到它们被击中的地方。

另请参阅此处的 gdb 记录和重放功能

在某些平台上,gdb 提供了一个特殊的进程记录和重放目标,可以记录进程执行的日志,并在以后使用正向和反向执行命令重放它。

在以前的 Pin 版本中,有用于检查点/重新执行的API 但最近版本不支持它们。相反,它们被转移到一个更完整的框架,称为PinPlay

您还可以reverse execution使用现有的 API(例如 Pin_ExecuteAt、Pin_SaveContext 等)来实现临时的幼稚的想法是跟踪内存写入并存储原始值。我实际上已经实现了这样的引擎(对不起,自我宣传)。

如果您有权访问 IDA,则可以使用trace replayer它并不完全支持反向执行,但我写它的目的是帮助解决您遇到的问题:通过重放记录的执行跟踪来检查崩溃发生的原因。程序不是在执行,而是在重放执行跟踪,但是,在大多数情况下,这已经足够了。