常见加解密算法07 - 分组密码实战

各位as handsome as Pan An, national beauty and heavenly fragrance的读者们好啊,今天我们来实战一下AES算法的逆向。

样本已上传到 https://github.com/aprz512/Android-Crack

Java层的比较简单就略过了,直接看C层的。

反汇编观察

bool __fastcall Java_com_kanxue_cipher7test_MainActivity_test3(__int64 a1, __int64 a2, __int64 a3)
{
  int i; // [xsp+24h] [xbp-7Ch]
  __int64 v5; // [xsp+28h] [xbp-78h]
  __int64 v6; // [xsp+38h] [xbp-68h]
  __int128 v7[2]; // [xsp+60h] [xbp-40h]
  __int128 v8; // [xsp+80h] [xbp-20h] BYREF
  __int64 v9; // [xsp+98h] [xbp-8h]

  v9 = *(_QWORD *)(_ReadStatusReg(ARM64_SYSREG(3, 3, 13, 0, 2)) + 40);
  v6 = GetStringUTFChars(a1, a3, 0LL);
  v8 = xmmword_2CB77;
  v5 = sub_11210(v6, "i am encrypt key", &v8);
  v7[1] = xmmword_2CB97;
  v7[0] = xmmword_2CB87;
  for ( i = 0; i <= 32 && *(unsigned __int8 *)(v5 + i) == *((unsigned __int8 *)v7 + i); ++i )
    ;
  _ReadStatusReg(ARM64_SYSREG(3, 3, 13, 0, 2));
  return i == 32;
}

使用 findcrypt 跑一下:

sub_11210 是一个AES加密函数。

继续分析可知:

  • i am encrypt key 是密钥,v8 是初始化向量,为:

.rodata:000000000002CB77 00 01 02 03 04 05 06 07 08 09+xmmword_2CB77 DCB 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF
.rodata:000000000002CB77 0A 0B 0C 0D 0E 0F

接下来就是使用重放来确定其工作模式。

使用 frida hook这个函数:

function hook_libnativelib() {
    var nativelibmodule = Process.getModuleByName("libnative-lib.so");
    var sub11210 = nativelibmodule.base.add(0x11210);

    Interceptor.attach(sub11210, {
        onEnter: function (args) {
            console.log("content: ", hexdump(args[0]));
            console.log("key: ", hexdump(args[1]));
            console.log("iv: ", hexdump(args[2]));
        }, onLeave: function (result) {
            console.log("result: ", hexdump(result));
        }
    });

}

function aes_main() {
    if (Java.available) {
        Java.perform(function () {
            console.log("go into main");
            var RuntimeClass = Java.use('java.lang.Runtime');
            RuntimeClass.loadLibrary0.overload('java.lang.Class', 'java.lang.String').implementation = function (arg0: object, arg1: string) {
                var result = this.loadLibrary0(arg0, arg1);
                console.log("Runtime.loadLibrary0:", arg1);
                if (arg1.indexOf('native-lib') != -1) {
                    hook_libnativelib();
                }

                return result;
            }
        })
    }
}

setImmediate(aes_main);

随便输入一个 q

content:               0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  0123456789ABCDEF
74e30d78c8  71 00 00 c2 78 67 3c ad db 5d 2a c5 e0 18 d3 52  q...xg<..]*....R

key:               0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  0123456789ABCDEF
74e2e30b22  69 20 61 6d 20 65 6e 63 72 79 70 74 20 6b 65 79  i am encrypt key

iv:               0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  0123456789ABCDEF
7ffd669b30  00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f  ................

result:               0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  0123456789ABCDEF
753e6dcc90  19 4e e9 8f a6 c6 39 44 b4 af 70 aa d6 7b 63 e9  .N....9D..p..{c.

查看输出为16位,可知,工作模式要么是 ECB 要么是 CBC。再写个32位的重复输入就观察输出就知道是哪中模式了。直接说结论,就是 CBC 模式,可以自行尝试。

当然也可以在 CyberChef里面尝试各种组合,看哪种工作模式匹配:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二手的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值