从程序执行中消除随机性

逆向工程 系统调用
2021-07-01 16:49:10

所以我有一个高度混淆的程序,每次都会生成一个独特的输出。为了便于反转,我想让每次运行的输出都相同(遵循逻辑,如果输出相同,则执行的逻辑将大致相同……)

有一点strace表明该程序clock_gettime在生成 id 之前进行了多次调用所以我创建了一个内核模块,使clock_gettime返回的时间完全相同。然而,该程序仍然能够产生独特的输出。

在我看来,所有程序都必须进行系统调用以获得唯一的熵来播种随机函数并且不进行任何系统调用(或者如果他们所做的所有系统调用都是为了返回非唯一的熵)该程序不能产生唯一的(随机) 数据。

有没有什么方法可以让程序在不显示的情况下获得唯一的熵strace(即不进行系统调用)?

1个回答

一般来说,是的,有很多方法可以在没有系统调用的情况下生成熵(这可能是弱熵,但无论如何)。

这是一个很小的(但显然甚至不能装满)列表:

  • rdrand,来自英特尔随机生成器的 rdseed 指令(顺便说一句,AMD 自 2015 年起支持)。
  • rdtsc 指令 - 自通电后为您提供滴答计数
  • 未初始化的内存
  • 作为 ASLR 的结果生成的内部程序地址