首页 文章

混淆的AES解密程序集

提问于
浏览
5

我最近一直在整个装配过程中试图找出一个程序如何解密一些数据 . 到目前为止,我已经确定了如何提取IV,IV是16字节长,并且解密方法使用密码块链接 . 因此,我认为使用的加密方法是AES-128-CBC .

下一步是尝试识别用于解密的密钥,问题是单个分组密码加密的程序集大小约为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]

子例程中的所有程序集都是示例形式,一些偏移量被添加到加密数据中,存储,针对 0xffalways 0xff )进行测试,然后执行某些操作,影响XOR,OR,ADD或MOV另一个寄存器(在例子中是 r0 ) .

这对您来说看起来是AES-128吗?您是否同意加密被故意混淆以隐藏密钥?如果是,那么它是如何被混淆的,是否可以找到钥匙?

Additional info

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

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

1 回答

  • 0

    检查是否正在使用AES非常简单 .
    AES / Rijndael使用了一个巨大的魔法常数表 .
    没有那些神奇的数字AES无法工作 .
    您可以从任何参考实现中轻松收集这些数字;记得在需要时补偿大/小端(我总是检查两种变体) .

    Rijndael也是 XOR 指令的一个非常重的用户,它不使用 or 并且它不使用加法 .

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

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

    从我所看到的只是看组件,它看起来根本不像AES .

    Test AES using code review only
    也许AES的最佳测试,仅查看代码,是将它与 init_key 的参考实现进行比较 . AES使用特定代码初始化密钥,以便算法可以使用它 .

    您可以在此处找到AES参考源代码:https://tls.mbed.org/aes-source-code
    (或者,如果您更喜欢C语言,请在互联网上的任何地方) .

相关问题