地穴,XOR,入侵未加密的ZIP和PRSP。 使用r0ot-mi Crypto解决问题。 第二部分

图片

在本文中,我们学习了crypt函数,了解如何为具有未加密文件名的ZIP存档选择密码,熟悉xortool实用程序,还处理了伪随机数生成器。 以前有关此主题的文章:

第1部分- 使用PIL python进行编码,移位密码,暴力哈希和图片创建。

组织信息
特别是对于那些想要学习新知识并在信息和计算机安全性的任何领域中发展的人们,我将撰写和讨论以下类别:

  • PWN;
  • 密码学(加密);
  • 网络技术(网络);
  • 反向(反向工程);
  • 隐写术(Stegano);
  • 搜索和利用Web漏洞。

除此之外,我还将分享我在计算机取证,恶意软件和固件分析,对无线网络和局域网的攻击,进行笔测试和编写漏洞利用程序方面的经验。

为了使您可以查找有关新文章,软件和其他信息的信息,我在Telegram中创建了一个频道,并创建了一个小组来讨论 ICD领域中的所有问题 。 另外,我会亲自考虑您的个人要求,问题,建议和建议, 并会回答所有人

提供所有信息仅出于教育目的。 对于由于使用本文档而获得的知识和方法对某人造成的任何损害,本文档的作者不承担任何责任。


ELF64-PID加密


图片

我们看一下源代码。 程序将字符串作为参数,并将其与cryt函数从程序的PID返回的内容和字符串“ $ 1 $ awesome”进行比较。

cryt函数是一个库函数,用于计算密码哈希。 函数的输出不仅是散列,还包含一行盐,使用的散列算法以及用于接收散列的参数(例如,回合数和其他选项)的一行文本。

图片

该功能包含在Perl,PHP,Pike,Python和Ruby编程语言中。 因此,您需要猜测将用来启动程序的PID。 通过SSH连接后,我们看到它们为我们提供了一个程序,其源代码和一个带有密码的文件。

图片

在Linux上,每个新运行的应用程序将收到最接近的增量免费PID值。 例如,连续执行ps几次。 PID每次递增。

图片

因此,您可以从任何空闲的PID计算散列,并以该值作为参数,无限期地运行程序。 让我们以PID为例,例如30000,并执行crypt函数。 我将在python中完成。

图片

现在运行一个无穷循环的程序执行。

图片

一分钟后,我们从读取密码的地方得到一个外壳。

图片

文件-PKZIP


图片

下载他们给我们的文件。 这是受密码保护的ZIP存档。 让我们通过密码。 由于文件名未加密,因此将其命名为fcrackzip实用程序,并将rockyou.txt作为字典。

图片

解压缩后,我们得到一个文本文件,其中说答案是存档中的密码。

图片

已知的明文-XOR


图片

我们获得了使用XOR BMP加密的图片。 由于我们使用XOR(我假设使用短键)并且密文很大,因此可以使用xortool。

图片

因此,xortool认为最可能的密钥长度是6。让我们请他确定密钥。

图片

太好了 密钥已定义,但是xortool本身已解密该文件并将其保存在xortool_out目录中。

图片

代码-伪随机数生成器


图片

我们提供了一个用于加密文件以及文件本身的程序。 另外,他们说加密发生在2012年12月。让我们清理代码。

在程序的开始,将存储当前时间(更确切地说,是自1970年1月1日以来经过的时间)。 接下来,检查程序参数的存在-文件路径。

图片

图片

然后打开此文件以进行读取,并创建一个新文件以进行写入。 这两个文件的描述符都传递给crypt_file函数。

图片

在crypt_file中,genere_key()函数将32字节的密钥反转,该密钥用于对文件进行XOR加密。 加密结果将写入新创建的文件。

图片

密钥以伪随机方式编译。 从每个步骤显示的字母中,根据holdrand值选择一个值,该值也会在每个步骤中更改,而在最开始时它等于当前时间。

图片

因此,我们需要生成可能的密钥。 python源代码如下所示。
keys = [] charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789" l = len(charset) holdrand = None def Rand(): global holdrand holdrand = holdrand * 214013 + 2531011 return ((holdrand >> 16) & 0x7fff) def genere_key(): key = "".join( [ charset[Rand()%l] for _ in range(32) ] ) keys.append(key) start = ? fin = ? for ts in range(start, fin): holdrand = ts genere_key() 


现在让我们处理时间的界限。 由于加密是在2012年12月执行的,因此我们需要对12月1日至12月31日之间的所有可能值进行排序。

图片

 start = 1354320000 fin = 1356998400 


我们已经确定了边界,但仍然有很多关键。 幸运的是,文件具有扩展名-这是bz2。

图片

也就是说,文件的前三个字节必须是“ BZh”,第四个字节必须是从“ 1”到“ 9”的字符之一,而后六个字节必须是0x314159265359。 让我们为键添加一个过滤器。 为此,我们需要密文的第一个字节。

图片

 def key_filter(key): ctext = "\x23\x17\x5d\x70\x5a\x11\x6d\x67\x37\x08" BZh = "BZh" sign = "".join( [ chr(ord(ctext[i])^ord(BZh[i])) for i in range(3) ] ) byte4 = "".join( [ chr(ord(ctext[3])^ord(i)) for i in "123456789" ] ) bytePI = chr(ord(ctext[4])^0x31) if sign in key[:3] and key[3] in byte4 and key[4] in bytePI: print(key) 


而且我们只有一把钥匙。

图片

使用相同的xortool,您可以使用密钥代理文件。

图片

因此,您解密了存档。

您可以通过Telegram加入我们。 让我们建立一个社区,在这个社区中,会有一些精通IT领域的人,然后我们可以在任何IT和信息安全问题上互相帮助。

Source: https://habr.com/ru/post/zh-CN482680/


All Articles