我正在进行一项任务,我有一个passwd文件,我将在其中找到所有密码。其中大多数都很容易与开膛手杰克和一些调整,但额外的功劳要求我找到由perl 5.10.0中的rand生成并用crypt加密的8字节字母数字密码。 我提出了三种方法来解决这个问题:
Break Crypt :不确定这个,但我已经生成了一个 我发现的其他密码中的字符集,减少了增量 蛮力到5天,但我认为只有这样才有效 密码仅包含先前存在的字符(17 普通文本),也许如果我幸运的话! (非常不可能)
Break rand :如果我能找到用于生成的相同种子 密码。然后,我可以生成字典以供给杰克。为了 从我提供的文件中获取种子然而我必须这样做 了解perl如何创造种子(如果甚至可能的话) 在5.10.0)。
根据我在早期Perl版本上的研究,只有System Time被用作种子。我创建了一个脚本,它使用m_time
(Time From Epoch)给我的passwd文件(+ -10,以确保我确定文件在一秒内生成)作为生成的种子一个字典,这种格式,因为我不知道rand()
我的密码的实际调用是什么:
abcdefgh
bcdefghi
cdefhijk
我把字典送给杰克。当然这没有用,因为在Perl 5.004之后Perl使用其他东西(我的问题的要点)来生成种子。
所以,我的问题是,是否有人知道在哪里可以找到Perl用来生成种子的源代码,和/或rand / srand的源代码。我正在寻找看起来像这样的东西,但对于版本5.10.0:
What are the weaknesses of Perl's srand() default seed, post version 5.004?
我尝试在/lib/perl
目录中使用grep,但我迷失在所有#define
结构文件中。
如果您认为我完全偏离了作业和/或有关此事的任何建议,也请随时告诉我。
答案 0 :(得分:4)
你不想查看/ 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的暴力破解工具?