assembly - 混淆的 AES 解密程序集

标签 assembly encryption arm aes reverse-engineering

我最近一直在筛选整个程序集,以尝试确定程序如何解密某些数据。到目前为止,我已经确定了 IV 是如何提取的,IV 是 16 字节长,并且解密方法使用密码块链接。因此,我相信所使用的加密方法是 AES-128-CBC。

下一步是尝试识别用于解密的 key ,问题是单个分组密码加密的程序集大小约为 2.5MB。然而,我观察到的是,它都是一个非常相似的形式,例如,一个片段:

add.w      r0, r12, #0x13
str.w      r0, [lr, #0x44]
tst.w      r0, #0xff
mov        r0, r12
it         eq
eoreq      r0, r12, #0x75

add.w      r1, r12, #0x5d
str.w      r1, [sp, #0xf00]
tst.w      r1, #0xff
it         eq
addeq      r0, #0x3b
r12 包含加密数据,从传入的参数( r0 )加载,如下所示:
mov        r4, r0
add.w      lr, sp, #0x1000
ldrb.w     r12, [r4]

子程序中的所有程序集都是示例形式,一些偏移量被添加到加密数据中,存储,针对 0xff 进行测试( 总是 0xff 079204 ADD 或 MOV 影响另一个寄存器(在示例中为 r0 )。

这对您来说是否是 AES-128,您是否同意加密被故意混淆以隐藏 key ?如果是这样,那么它是如何被混淆的,是否有可能找到 key ?

附加信息

Here's a link 到块密码加密子例程的完整 ASM 文件。

this is a link 到使用 CBC 并调用主要问题中引用的上述子程序的子程序。

最佳答案

检查是否正在使用 AES 非常简单。
AES/Rijndael 使用一个大的魔法常数表。
没有这些神奇的数字,AES 就无法工作。
您可以从任何引用实现中轻松收集这些数字;如果需要,请记住补偿大/小端(我总是检查两个变体)。

此外,Rijndael 是 XOR 的重度用户。指令,它不使用 or它不使用加法。

如果您想确认/排除 AES,请寻找神奇的数字。该例程必须从内存(磁盘)某处的表中读取数字。它无法解码程序集中的数字,因为它使用明文/密文来查找数组中的数字并使用它异或数据。

当将数字保存在寄存器中时,您不能这样做。

从我所看到的只是查看程序集,它看起来根本不像 AES。

仅使用代码审查测试 AES
也许对 AES 最好的测试,只看代码,就是将它与 init_key 的引用实现进行比较。 . AES 使用特定代码来初始化 key ,以便算法可以使用它。

您可以在此处找到 AES 引用源代码:https://tls.mbed.org/aes-source-code
(或者,如果您更喜欢另一种语言而不是 C,则可以在互联网上的任何地方)。

关于assembly - 混淆的 AES 解密程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35282364/

相关文章:

java - 有哪些 JVM 汇编程序?

assembly - 如何在(发布的)Rust版本中找到函数的汇编代码?

encryption - TripleDES key 大小-.NET与Wikipedia

使用 .NET RSAKeyValue XML 字符串时,Java RSA 加密不起作用

c++ - 为什么 gcc 在按值传递微不足道的结构时会发出不需要的内存访问?

linux - 如何打印单个 ASCII 字符?

arrays - NASM - 如何制作结构指针数组并访问它们

c++ - 在 Crypto++ 中加载 PEM 编码的私有(private) RSA key

将 ARM 代码转换为 C

linux - ARM Linux 上的 "Backtrace stopped: previous frame identical to this frame (corrupt stack?)"