击败 rsa 哈希验证

逆向工程 qnx
2021-07-08 21:26:25

我正在分析在 armle 上运行 QNX 的嵌入式系统,uname -a将其识别为:

QNX mmx 6.5.0 2012/06/20-13:49:13EDT nVidia_Tegra2(T20)_Devlite_Boards armle

固件更新附带一个名为的文件,该文件metainfo2.txt始终以签名块结尾,例如:

[Signature]
signature1 = "a73e111de512e09bad2dc08eff685a38"
signature2 = "4fc032192a20fd1e242ad64af5b509a7"
signature3 = "6a7432f754aff0d6b74a7ec2072cbb11"
signature4 = "e91f68f569508b77712d1869edd6d0b9"
signature5 = "923eb77ba815dba8e44d5e09412cdf2e"
signature6 = "830518f3b38d48df892a3a0c65cc67f1"
signature7 = "09e5e0f5f06ce0376d032ab21051510f"
signature8 = "3dab7f75fcdf54a96d8aa7f3c617f76d"

这看起来像是 RSA 加密,用于确定文件内容是否已更改。认为它是文件特定部分的哈希:MetafileChecksum = "ec5afd6459c3579ebed8841cc41fe17bb61b814d"

我找到了一个带有公钥的文件夹,它有一个子文件夹名称 MetainfoKey 并且可能包含公钥,一个 288 字节的文件:

C0 F3 89 EE C7 B6 6C 9D C7 36 50 8F F8 8A EB 1F
B1 13 94 2E AD 02 08 14 D0 8D 29 E8 68 F1 4B 20
86 BC D7 DD CC BA 75 59 F9 99 E7 6D 24 61 96 60
BB E1 74 34 DA 59 98 80 87 F2 A9 9C D4 65 B1 FF
42 35 22 B7 8C B0 DE 46 3A 66 96 13 D3 56 DF A9
E8 6E 0E 2E 0B 6D AB 5D E8 91 31 C5 A0 72 7A EA
B1 76 72 78 AB 10 1D CD 9C 3C FC 10 26 70 5C 1D
AB 3B F5 3B F5 0A FA FB 3F 52 DA 2C EB 0B EE 57
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03
83 0A CD 65 56 FC 2F B4 7B 1B 67 43 12 E3 4E 7A
0A AD 1E DF BA 7E B2 79 D9 51 3A DB 10 16 61 48
13 1B BA 9C 85 2A B7 01 91 49 16 65 62 94 61 6B
B1 A9 B8 F8 46 2E BC 20 6D E5 7F 53 AF EF 00 00
53 AB 8E 4F 63 29 BF 00 B0 ED 45 E8 E9 20 67 8E
F6 7A F8 BC CB 7B 4D CF 88 01 59 BB CB F1 B1 04
D4 A1 C0 57 70 AA D7 38 E8 BD 9A 28 4E 94 99 5C
B7 96 49 28 5A C4 04 9C 6B 57 8F C5 4F 74 6A C9

我的目标是能够更改metainfo2.txt,一种可能的方法是用新的公钥替换公钥,但我需要了解如何使用签名部分来验证文件内容。我正在寻找有关如何实现这一目标的答案或指示......

3个回答

你的预感是正确的。在签名字段中附加所有数字,您将获得数字

小号= 0xa73e111de512e09bad2dc08eff685a384fc032192a20fd1e242ad64af5b509a76a7432f754aff0d6b74a7ec2072cbb11e91f68f569508b77712d1869edd6d0b9923eb77ba815dba8e44d5e09412cdf2e830518f3b38d48df892a3a0c65cc67f109e5e0f5f06ce0376d032ab21051510f3dab7f75fcdf54a96d8aa7f3c617f76d

它太大而无法拟合模数

Ñ = 0x830ACD6556FC2FB47B1B674312E34E7A0AAD1EDFBA7EB279D9513ADB10166148131BBA9C852AB701914916656294616BB1A9B8F8462EBC206DE57F53AFEF000053AB8E4F6329BF00B0ED45E8E920678EF67AF8BCCB7B4DCF880159BBCBF1B104D4A1C05770AAD738E8BD9A284E94995CB79649285AC4049C6B578FC54F746AC9

所以我们将使用一个模数

Ñ = 0xC0F389EEC7B66C9DC736508FF88AEB1FB113942EAD020814D08D29E868F14B2086BCD7DDCCBA7559F999E76D24619660BBE17434DA59988087F2A99CD465B1FF423522B78CB0DE463A669613D356DFA9E86E0E2E0B6DAB5DE89131C5A0727AEAB1767278AB101DCD9C3CFC1026705C1DAB3BF53BF50AFAFB3F52DA2CEB0BEE57

将签名s提高到 3 模数n的幂,我们最终得到以下值

0x1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003021300906052b0e03021a050004145e3246e50a4dad079a61f99fa3297c01d802e038

这是标准的签名格式。0x1ffff...00 是填充。3021... 是 ASN.1 编码结构。

使用 OpenSSL 解析

openssl.exe asn1parse -inform DER -dump -i

    0:d=0 hl=2 l= 33 缺点:序列
    2:d=1 hl=2 l= 9 缺点:序列
    4:d=2 hl=2 l= 5 prim: 对象:sha1
   11:d=2 hl=2 l= 0 prim: NULL
   13:d=1 hl=2 l= 20 prim:八位字节串
      0000 - 5e 32 46 e5 0a 4d ad 07-9a 61 f9 9f a3 29 7c 01 ^2F..M...a...)|。
      0010 - d8 02 e0 38 ...8

这告诉我们签名基于 SHA1 哈希。要更改由这些密钥签名的数据,您需要生成自己的 1024 位 RSA 密钥,用您自己的公钥替换 c0... 密钥,更改数据,替换上面数据中的哈希值并使用你的私钥。

如您所知,在添加行和最终之前MetafileChecksum = "ec5afd6459c3579ebed8841cc41fe17bb61b814d",初始metainfo2.txt文件的 SHA1 哈希值MetafileChecksum[Signature]

正如彼得安德森指出的那样,公钥文件的前 128 个字节是 RSA 公钥/私钥模数 ( n = C0 F3 .. EE 57)。当与e = 00 00 .. 00 03文件接下来的 32 个字节中的公共指数 ( )结合时,我们会得到 RSA 公共密钥(n, e)。将其应用于[Signature]中的数据会产生:

1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffff003021300906052b0e03021a050004145e3246e50a4dad079a61f99fa3297c01d802e038

包含 SHA1 哈希的标准 ASN.1 签名结构5e3246e50a4dad079a61f99fa3297c01d802e038

你会发现那是的SHA1哈希metainfo2.txt 您已经添加了MetafileChecksum,但之前追加[Signature]块。

此外,您可能想知道密钥文件中剩余的 128 个字节 (83 0A .. 6A C9) 代表什么?好吧,如果你使用相同的公钥解密这些,你会得到:

1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffff003021300906052b0e03021a05000414c9b809bea9c9d13a87f7ef2212d9d03281da7020

同样是包含 SHA1 哈希的 ASN.1 签名结构c9b809bea9c9d13a87f7ef2212d9d03281da7020您会发现这是包含公钥 (n, e) 的密钥文件的前 128+32=160 个字节的 SHA1。

不幸的是,这一切都无法让我们接近能够签署metainfo2.txt文件,因为我们不知道私钥指数 (d)。但是,如果您用自己的密钥替换密钥,至少您现在知道如何完全填充MetainfoKey文件,以及如何metainfo2.txt使用自己的私钥签名

经过一些研究,我得出结论,我们不能简单地更改密钥。正如您已经知道的那样,它们都已签名,尽管签名密钥看起来是 MIB-High_MI_public,但它实际上是 NOR 闪存 OTP 区域中的密钥。在我们的例子中,公钥恰好是一样的,但我们不能改变它。MIBRoot 在使用找到持久区域的密钥之前检查这一点。除非您更换闪存芯片,否则您无法使用自己的密钥,因此不值得付出努力:)

问候。