查看原文
其他

电视节目模糊化处理二维码后,我是如何逆向成功并赢取1000美元的?(第二部分)

代码卫士 2022-05-23


 聚焦源代码安全,网罗国内外最新资讯!


作者: Michel Sassano

翻译:360代码卫士团队


法国电视二台 (France 2) 一档节目公开了一个密币钱包经过模糊化处理的私钥。研究人员借此逆向出完整的私钥二维码并获得钱包中的1000美元。以下是这名研究人员分享的逆向经过(第二部分)。


7. 错误更正代码


截止到目前,我们距离拼凑出完整的私钥还差得很远,不过我们不久之后就会知道我们是否已经收集了足够多的信息能通过利用ECC来恢复密钥。

ECC技术能确保通过不可靠信道进行的通信是可靠的。ECC能通过检测并更正错误和擦除 (erasures) 来重构原始数据。

二维码执行的是Reed-Solomon代码(BCH代码的一种子类型,在第3步解码格式信息字符串时提到过)。

我们不打算详细解释如何编码或解码Reed-Solomon代码。网络上的相关资料很多,不过快速提一下:

Reed-Solomon编码器会生成ECC编码字。它们是为了区分代表信息的多项式和不可约的生成多项式。


Reed-Solomon解码器更为复杂,因为解码信息的方式有很多种。不同的解码算法因这个任务而存在。

 

Reed-Solomon解码器能够同时解码擦除和错误。遗憾的是,它存在一个限制即辛格顿界(Singleton Bound)”

我们所冒的风险就是在这个限制上。Reed-Solomon是一种最理想的FEC而且易受徒壁效应的影响。也就是说如果你越过这个限制,那么你会从EC代码中一无所获,而这正是需要我们暴力破解的地方。

这个限制(擦除和可更正错误的数字)由如下公式所定义(ISO标准的第33页):

e + 2*t ≤ d – p

其中:

e:是指擦除的数量

t:错误的数量

d:错误更正编码字的数量

p:错误解码保护编码字的数量(在我们的案例中是06-H

 

这个公式的意思是你在每个块中能够更改最多14个错误或28个擦除(如果和不超过28,则是两者的混合)。我们利用知道二维码中擦除的位置来得出可能的最高错误更正级别(每个块为28个编码字)。

 

我们来查看下每个块,看下是否低于这个限制还是超过这个限制:

1:数据包含6个擦除,ECC包含22个擦除

2:数据包含6个擦除,ECC包含22个擦除

3:数据包含10个擦除,ECC包含18个擦除

4:数据包含6个擦除,ECC包含21个擦除

 

3和块1都有28个擦除,它们都是限制值,我们恢复的概率是100%。共有27个擦除的块4也是如此。

 

233个擦除,超过限制,我们必须实施暴力破解。幸运的是,暴力破解的组合数量并不多。

 

8. Python & 暴力破解


我们决定通过这个Reed-Solomon Pythoncodec来解码信息。

 

我们将混合使用Python代码和伪代码来说明我们找出最终结果的步骤。

 

我们先来看最佳案例场景,即我们位于限制之下并解码块134

 

3的译码器结果是:

[115,22, 181, 6, 151, 103, 118, 229, 22, 133, 167, 39, 101, 164, 87]

 

4的流程相同,只需修改整体(mess)eccerror_pos变量的值即可。结果如下:

[118,132, 183, 38, 36, 99, 116, 53, 96, 236, 17, 236, 17, 236, 17]

 

1的译码器结果如下:

[67,68, 183, 149, 87, 167, 53, 39, 86, 71, 4, 230, 180, 196, 182]

 

到目前为止一切顺利。遗憾的是,如果我们对块2也开展同样的行为,则会失败,因为我们超过了限制。

 

我们的唯一办法就是暴力破解。我们的负边距是533个抹擦而不是28个),因此我们的目标是恢复(暴力破解)5个编码字并等待译码器返回的结果。

 

为了所见可能性的数量,我们查看了表格n°27n°28,找出未知比特数量较少的字节。数据编码字#17#19#20#27EC编码字#50包含一些有意思的信息。

 

总共有21个未知比特,22²¹ 个组合 (2,097,152) 并没有那么大。如下是暴力破解的伪代码。


我的i5-6600K CPU能够在每个核心每分钟计算约3万个密钥。找到重构密钥的第一个解决方案耗费了30分钟以及838,849次尝试(2,097,152个组合中只有2个解决方案跟过滤器匹配)。

 


2的结果是:

[85,99, 35, 131, 19, 84, 181, 99, 148, 87, 165, 38, 99, 116, 84]

 

现在我们得到了所有的编码字,最后一步就是将所有的这些编码字转换为二进制,填充到表格n°27中,裁剪第一批12比特、最后52个比特,解码就可以了。

 

最终得到的私钥是:

KyUzsRudpNkLKeV2815KV9EzRf7EG1kPivwnQhZrvZEwhKrbF7CV

 

你肯定不会使用这个私钥了,因为现在它已不具私密性了!

 

感谢Roger的慷慨解囊。虽然重新获取BCH的过程不如扫描电视上的二维码那样轻松,但它很有挑战性而且非常有意思。

 

(全文完)

 

 

拓展阅读


电视节目混淆二维码后,我是如何逆向成功并赢取1000美元的?(第一部分)



本文由360代码卫士编译,不代表360观点,转载请注明 “转自360代码卫士www.codesafe.cn”。


原文链接:

https://medium.freecodecamp.org/lets-enhance-how-we-found-rogerkver-s-1000-wallet-obfuscated-private-key-8514e74a5433





您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存