当前位置: 首页 > news >正文

常见加解密算法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<..]*....Rkey:               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 keyiv:               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里面尝试各种组合,看哪种工作模式匹配:


http://www.mrgr.cn/news/19453.html

相关文章:

  • 【Python】HTMLParser:HTML解析
  • 7.3 溪降技术:跳潭
  • Three.JS编程中如何切换gltf模型动画?
  • Kafka【六】Linux下安装Kafka(Zookeeper)集群
  • 顺序栈的C/C++语言实现
  • 爬虫 可视化 管理:scrapyd、Gerapy、Scrapydweb、spider-admin-pro、crawllab、feaplat、XXL-JOB
  • springboot高校实验室教学管理系统的设计和实现
  • LLM手撕
  • C++学习, 类
  • 代码随想录训练营day35|46. 携带研究材料,416. 分割等和子集
  • 无人机飞手及装配维修技术前景详解
  • 第二证券:大牛股突发,停牌不超3天,此前22个涨停!
  • 如何使 div 居中?CSS 居中终极指南
  • Vue——day08之收集表单数据
  • archery 1.9.1 二开-本地环境搭建
  • Layer Normalization论文解读
  • 【自动驾驶】控制算法(七)离散规划轨迹的误差计算
  • 《OpenCV计算机视觉》—— 对图片的各种操作
  • 每日读源码---Day1_processdata
  • C++11 --- function 包装器以及 bind 适配器