我正在分析一个在手臂上运行QNX的嵌入式系统,uname -a将其标识为: :

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


这看起来像是RSA加密,用于确定文件内容是否已更改。我认为这是文件特定部分的哈希值: >
[Signature]
signature1 = "a73e111de512e09bad2dc08eff685a38"
signature2 = "4fc032192a20fd1e242ad64af5b509a7"
signature3 = "6a7432f754aff0d6b74a7ec2072cbb11"
signature4 = "e91f68f569508b77712d1869edd6d0b9"
signature5 = "923eb77ba815dba8e44d5e09412cdf2e"
signature6 = "830518f3b38d48df892a3a0c65cc67f1"
signature7 = "09e5e0f5f06ce0376d032ab21051510f"
signature8 = "3dab7f75fcdf54a96d8aa7f3c617f76d"


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

#1 楼

你的预感是正确的。在签名域追加所有的号码,你得到的数量

S = 0xa73e111de512e09bad2dc08eff685a384fc032192a20fd1e242ad64af5b509a76a7432f754aff0d6b74a7ec2072cbb11e91f68f569508b77712d1869edd6d0b9923eb77ba815dba8e44d5e09412cdf2e830518f3b38d48df892a3a0c65cc67f109e5e0f5f06ce0376d032ab21051510f3dab7f75fcdf54a96d8aa7f3c617f76d

这是太大,无法与

一模数n = 0x830ACD6556FC2FB47B1B674312E34E7A0AAD1EDFBA7EB279D9513ADB10166148131BBA9C852AB701914916656294616BB1A9B8F8462EBC206DE57F53AFEF000053AB8E4F6329BF00B0ED45E8E920678EF67AF8BCCB7B4DCF880159BBCBF1B104D4A1C05770AAD738E8BD9A284E94995CB79649285AC4049C6B578FC54F746AC9

所以我们将使用

N = 0xC0F389EEC7B66C9DC736508FF88AEB1FB113942EAD020814D08D29E868F14B2086BCD7DDCCBA7559F999E76D24619660BBE17434DA59988087F2A99CD465B1FF423522B78CB0DE463A669613D356DFA9E86E0E2E0B6DAB5DE89131C5A0727AEAB1767278AB101DCD9C3CFC1026705C1DAB3BF53BF50AFAFB3F52DA2CEB0BEE57

的TA模量王签名S升高到3个模量的n次幂,我们风与下面的值

0x1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003021300906052b0e03021a050004145e3246e50a4dad079a61f99fa3297c01d802e038

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

使用OpenSSL解析

openssl.exe asn1parse -inform DER -dump -i

    0:d=0  hl=2 l=  33 cons: SEQUENCE
    2:d=1  hl=2 l=   9 cons:  SEQUENCE
    4:d=2  hl=2 l=   5 prim:   OBJECT            :sha1
   11:d=2  hl=2 l=   0 prim:   NULL
   13:d=1  hl=2 l=  20 prim:  OCTET STRING
      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 ...密钥替换为您自己的公共密钥,更改数据,替换上面数据中的哈希,然后使用您的私钥。

评论


非常感谢Peter!下一步,我试图了解设备如何验证签名并验证签名的哈希确实是MetafileChecksum。有关如何执行此操作的任何提示?

–雷姆科
16 Mar 24 '16 at 8:32

MetafileChecksum可能只是某些文件的SHA1哈希。我会尝试SHA1候选文件,直到您找到匹配项。希望你能走运。

–彼得·安德森(Peter Andersson)
16 Mar 24 '16 at 8:34

是的,我知道如何计算MetafileChecksum,它是文件本身的sha1,不包括签名部分和MetafileChecksum行。我不了解(可能由于缺乏rsa知识)如何使用公钥解密MetafileChecksum以获取与MetafileChecksum相同的值。工作完成后,我可以尝试替换公共密钥。

–雷姆科
16年3月24日在8:37

您实际上不需要解密MetafileChecksum。这是一个哈希,因此无法进行解密。只需修改文件中需要修改的部分,重新​​计算SHA1并更新MetafileChecksum。您需要找到散列为5e 32 ... e0 38的数据。因为那是签名块保护的数据。

–彼得·安德森(Peter Andersson)
16-3-24在8:40



#2 楼

如您所知,MetafileChecksum = "ec5afd6459c3579ebed8841cc41fe17bb61b814d"是初始metainfo2.txt文件的SHA1哈希,然后添加MetafileChecksum行和最终[Signature]块。 RSA公钥/私钥模数(n = C0 F3 .. EE 57)。当与文件的后32个字节中的公共指数(e = 00 00 .. 00 03)结合使用时,会产生RSA公共密钥(n, e)。将其应用于[Signature]块中的数据可得到:在添加5e3246e50a4dad079a61f99fa3297c01d802e038之后,但在附加metainfo2.txt块之前,将发现MetafileChecksum的SHA1哈希值。 )在密钥文件中代表什么?好吧,如果使用相同的公钥解密这些文件,则会得到:

1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffff003021300906052b0e03021a050004145e3246e50a4dad079a61f99fa3297c01d802e038


再次获得一个包含SHA1哈希[Signature]的ASN.1签名结构。而且您会发现这是包含公用密钥(n,e)的密钥文件的前128 + 32 = 160字节的SHA1。不幸的是,这些都无法使我们接近签署c9b809bea9c9d13a87f7ef2212d9d03281da7020文件,因为我们不知道私钥指数(d)。但是,如果要用自己的密钥替换密钥,至少现在您知道如何完全填充metainfo2.txt文件,以及如何使用自己的私钥对MetainfoKey签名。

评论


是的,我得出了相同的结论

–雷姆科
17年9月25日在15:15

#3 楼

经过研究后,我得出结论,我们不能简单地更改键。
在我们的例子中,它恰好是公钥,但是我们不能更改它。您无法使用自己的按键的闪存芯片,因此值得您付出以下努力:)

注意事项。