在 perl 5.10.0 中反转 rand,有人知道在哪里可以找到 rand/srand 的源代码吗?
Reversing rand in perl 5.10.0, anyone know where to find the source code for rand/srand?
我正在做一个作业,我有一个密码文件,我要在其中找到所有密码。其中大部分通过开膛手杰克和一些调整都很容易,但额外的功劳需要我找到一个由 rand 在 perl 5.10.0 中生成并使用 crypt 加密的 8 字节字母数字密码。
我想出了三种方法来解决这个问题:
- 蛮力:在我的机器上 62^8 次计算 = 300 周。我可以
在 1 周内租用 300 倍我的机器功率的服务器。
不知何故,这感觉像是在浪费 resources/electricity
加分。
Break Crypt:不确定这个,但是我生成了一个
我发现的其他密码的字符集,减少了增量
蛮力到 5 天,但我认为只有这样才能奏效
密码仅包含之前出现的字符(17
纯文本),所以也许如果我幸运的话! (极不可能)
Break rand: 如果我能找到用于生成
密码。然后我可以生成字典以提供给杰克。为了
从给我的文件中获取种子但是我必须
了解 perl 是如何创建种子的(如果有可能的话
在 5.10.0).
根据我对早期 Perl 版本的研究,只有系统时间被用作种子。我制作了一个脚本,该脚本使用给我的 passwd 文件上的 m_time
(从纪元开始的时间)(尽管我确定文件是在一秒钟内生成的,但可以确定是 +-10)作为生成字典的种子,以这种格式,因为我不知道 rand()
我的密码实际上是从什么调用开始的:
abcdefgh
bcdefghi
cdefhijk
我把字典给了杰克。当然这不起作用,因为在 Perl 5.004 之后 Perl 使用其他东西(我的问题的重点)来生成种子。
所以,我的问题是,是否有人知道在哪里可以找到 Perl 用于生成种子的源代码,and/or rand/srand 的源代码。我一直在寻找看起来像这样的东西,但对于版本 5.10.0:
What are the weaknesses of Perl's srand() default seed, post version 5.004?
我尝试在 /lib/perl
目录中使用 grep,但我迷失在所有 #define
结构文件中。
如果您认为我完全偏离了作业的轨道,也请随时告诉我 and/or 关于此事的任何建议。
您不想查看 /lib/perl,您想要查看 Perl 源代码。
这里是 Perl_seed() in util.c as of v5.10.0,如果 srand
不带参数调用,或者如果 rand
没有先调用 srand
就调用函数。
如您所见,在支持随机设备的 Unix 系统上,它使用来自 /dev/urandom
的字节来为 RNG 设定种子。在没有这种支持的系统上,它结合使用时间(如果可能的话使用微秒分辨率)、Perl 进程的 PID 以及 Perl 解释器中各种数据结构的内存位置。
在 urandom
的情况下,猜测种子实际上是不可能的。在第二种情况下,它仍然很困难,可能类似于暴力破解密码;你有来自微秒时间戳的 20 位不可预测性,来自 PID 的最多 16 位,以及来自内存地址的未知数量,如果你知道它所在系统的详细信息,则可能在 0 到 20 位之间 运行,但如果您完全不了解,则最多 64 或 96 位。
我想说通过猜测种子来攻击 Perl 的 rand
可能是不切实际的,并且从它的输出中反转它可能也不可行,特别是如果它是 运行 在具有 drand48
。您是否考虑过基于 GPU 的暴力破解工具?
我正在做一个作业,我有一个密码文件,我要在其中找到所有密码。其中大部分通过开膛手杰克和一些调整都很容易,但额外的功劳需要我找到一个由 rand 在 perl 5.10.0 中生成并使用 crypt 加密的 8 字节字母数字密码。 我想出了三种方法来解决这个问题:
- 蛮力:在我的机器上 62^8 次计算 = 300 周。我可以 在 1 周内租用 300 倍我的机器功率的服务器。 不知何故,这感觉像是在浪费 resources/electricity 加分。
Break Crypt:不确定这个,但是我生成了一个 我发现的其他密码的字符集,减少了增量 蛮力到 5 天,但我认为只有这样才能奏效 密码仅包含之前出现的字符(17 纯文本),所以也许如果我幸运的话! (极不可能)
Break rand: 如果我能找到用于生成 密码。然后我可以生成字典以提供给杰克。为了 从给我的文件中获取种子但是我必须 了解 perl 是如何创建种子的(如果有可能的话 在 5.10.0).
根据我对早期 Perl 版本的研究,只有系统时间被用作种子。我制作了一个脚本,该脚本使用给我的 passwd 文件上的 m_time
(从纪元开始的时间)(尽管我确定文件是在一秒钟内生成的,但可以确定是 +-10)作为生成字典的种子,以这种格式,因为我不知道 rand()
我的密码实际上是从什么调用开始的:
abcdefgh
bcdefghi
cdefhijk
我把字典给了杰克。当然这不起作用,因为在 Perl 5.004 之后 Perl 使用其他东西(我的问题的重点)来生成种子。
所以,我的问题是,是否有人知道在哪里可以找到 Perl 用于生成种子的源代码,and/or rand/srand 的源代码。我一直在寻找看起来像这样的东西,但对于版本 5.10.0:
What are the weaknesses of Perl's srand() default seed, post version 5.004?
我尝试在 /lib/perl
目录中使用 grep,但我迷失在所有 #define
结构文件中。
如果您认为我完全偏离了作业的轨道,也请随时告诉我 and/or 关于此事的任何建议。
您不想查看 /lib/perl,您想要查看 Perl 源代码。
这里是 Perl_seed() in util.c as of v5.10.0,如果 srand
不带参数调用,或者如果 rand
没有先调用 srand
就调用函数。
如您所见,在支持随机设备的 Unix 系统上,它使用来自 /dev/urandom
的字节来为 RNG 设定种子。在没有这种支持的系统上,它结合使用时间(如果可能的话使用微秒分辨率)、Perl 进程的 PID 以及 Perl 解释器中各种数据结构的内存位置。
在 urandom
的情况下,猜测种子实际上是不可能的。在第二种情况下,它仍然很困难,可能类似于暴力破解密码;你有来自微秒时间戳的 20 位不可预测性,来自 PID 的最多 16 位,以及来自内存地址的未知数量,如果你知道它所在系统的详细信息,则可能在 0 到 20 位之间 运行,但如果您完全不了解,则最多 64 或 96 位。
我想说通过猜测种子来攻击 Perl 的 rand
可能是不切实际的,并且从它的输出中反转它可能也不可行,特别是如果它是 运行 在具有 drand48
。您是否考虑过基于 GPU 的暴力破解工具?