有时有必要在程序中使用随机数。根据需要,这可能是如何随机使用的。

关于随机数的讨论可以归结为TRNG(真随机数生成器)和PRNG(伪随机数生成器)。

为什么这甚至很重要?随机是随机的,对吧?

不是真的。由于计算机没有任何想象力,所以从物理上讲,它们不可能得出一个真正的随机数。

如果您使用内置函数随机化一个数字,它将使用复杂算法生成一个伪随机数。

如果您所需要的只是一个随机数,这可能是很好的,但如果您需要它们的序列,则该系列通常以常见的“种子”号码开始,然后遵循它所用的算法。

了解算法并识别种子,您可以通过计算它来预测系列的其余部分。想象一下,能够在线赌博网站上做到这一点!

那么,你打算怎么办?

我们需要的方法不仅仅是一个算法或一组给定的数字。

例如,.net框架提供了System.Security.Cryptography.RandomNumberGenerator函数,它不仅仅是一个算法。它还在计算中考虑了下列环境因素:

  • 当前的进程ID
  • 当前线程ID
  • 自启动时间以来的滴答数
  • 当前时间
  • 各种高精度CPU性能计数器
  • 用户环境(用户名、计算机名、搜索路径等)的MD4散列

但是,所有这些数字都不是随机的。

虽然现实世界似乎是随机的,但计算机不是。因此,开发了从现实世界中抽取数字样本并将其作为随机数使用的方法。

TrueCrypt和其他类似程序,指示您在创建加密密钥时移动鼠标。随机输入用于使关键不太可预测。

用于收集随机数集的其他类型的数据是大气噪声,放射性衰减,视频帧中的模式,甚至熔岩灯

基本上,所有这些方法都是测量一些预期是随机的物理现象,然后补偿测量过程中可能的偏差。在所有这些情况下,为了得到一个均匀的分布,补偿是必要的,因为极端值通常比接近中值的数字更稀疏。

一种稍微更轻松,混合,方法是通过使用高质量的PRNG来使种子进行TRNG并实现输出不可预测性,但如上所述,如果您从不可预测的种子开始,这才有工作。

Photodune-1104832-Waln-Numbers-s

我们能否测试一组数字的随机性?

检查给定的一组数字是否真的是随机的一个简单的测试是用这些数字压缩文件(例如使用WinRar),看看结果文件比原始文件小多少。

压缩程序查找重复和模式并存储这些而不是实际数据。因此,通过使用此方法,完全随机的数字集不会缩小。

恶意软件如何使用随机数?

大多数恶意软件都有两个主要用途,用于随机数生成器,加密和文件名创建。

通过加密,无论是文件加密还是网络流量加密,恶意软件都可以使用自定义的或内置的PRNG,并通过获取特定的系统变量(如硬盘驱动器的ID号或前面提到的启动时间以来的滴答数)来使用唯一的种子。

恶意软件使用PRNG结果并将其用作加密所需的密钥。

在许多情况下,通过普通文本流量传输此密钥,然后返回命令和控制。C2保存该键,以便读取任何传入的加密消息,或者如果说系统被保留赎金,则存储远程解密密钥。

随机数生成和文件名创建对许多恶意软件都很有用,因为它允许输入上面提到的类似的种子,但使用那个随机数创建一个用于创建新文件名的字符串。

这个文件名可以提供给恶意软件在系统上滴入的任何文件,以努力掩盖其身份从扫描仪。

上述方法在域名生成中也有效,允许部署恶意软件,而无需在需要连接到C2时的硬编码域名。

这种方法特别感兴趣,因为它使用内置或自定义PRNG和通过硬编码到恶意软件中获得的种子,所有攻击受害者系统或通过托管的网页远程提供,为恶意软件提供种子。

使用此种子,恶意软件可以通过可预测的一系列域名来循环,全部创建伪随机。攻击者还知道算法,并使用它从算法结果中注册域名。

以一个算法为例,当提供种子时,它将创建三个7个字符的字符串。攻击者在badguy.com/seed.php上创建了一个网页,为特定算法提供了种子。

在执行系统上执行时的恶意软件达到并抓住从在线获取种子并将其馈送到PRNG算法中。

该算法出现了以下字符串:

  • Ietyskk.
  • Loijihd
  • yeuuahg.

现在命令和控制背后的攻击者已经通过自己的本地版本的算法运行此种子,并将上述字符串注册为域名,例如letyskk.com。恶意软件将通过所有三个生成的字符串循环并尝试连接到这些域,直到它得到响应。

如果域名被撤销,则需要做的所有坏人都是将badguy.com/seed.php的值更改为一个新的一个,并注册那些域,相同的恶意软件将检索该值并尝试连接到生成的域。

概括

重要的是要记住,计算机无法轻易使用真正随机数量,有时它会理解如何使用和创建伪随机数。是您自己的使用或恶意软件创作者的使用。