前言
文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口均已做脱敏处理。严正声明禁止用于商业和非法用途,否则由此产生的一切后果与作者本人无关。若有侵权,请在vx【amuncocoL】联系我
说明
工具说明
trace: 这里用的棕熊的iOS版本qbdi,链接:https://bbs.kanxue.com/thread-287137.htm#msg_header_h1_1fridacharlesIDA
样本:脱敏!保密!保命!
抓包
抓包可以看到header里xxx中包含x1,x2,x3,x4,x5,x6,x7。 x6就是本次分析的目标。
分析
首先就是定位参数, 然后找到参数算法生成的位置, 都是OC层代码, 很简单直接跳过。
进入核心算法触发的调用点,固定入参发现结果一直在变,找到内部的随机数逻辑hook掉。 跑一个trace,这个样本倒不是很大。
开始进入分析x6
x6:
"x6":"97c8cc421b9ada2d94103c174b5814b617cda51cbf148a8a1eb499609bbc9483"
找到x6生成的地方
可以看到x6的计算为: w8 ^ w9 = target
w8^w9 = target0xf1^0x66 = 0x97 0x69^0xa1 = 0xc80x74^0xb8 = 0xcc0x09^0x4b = 0x420x22^0x39 = 0x1b0x1a^0x80 = 0x9a0x78^0x55 = 0x2d0x57^0xc3 = 0x940xe8^0xf8 = 0x100x4a^0x3c = 0x76...0xf8^0x7b = 0x83
W8分析
查找w8这列数值计算的地方结果计算的地方
同样是由w8,w9两个值add得到
add w8, w9, w8 ;W8=0x42 -> 0xf1, W9=0xaf // 0xf1add w8, w9, w8 ;W8=0x0 -> 0x69, W9=0x69 //0x69add w8, w9, w8 ;W8=0x88 -> 0x174, W9=0xec //0x174 strBadd w8, w9, w8 ;W8=0x73 -> 0x109, W9=0x96add w8, w9, w8 ;W8=0x40 -> 0x122, W9=0xe2add w8, w9, w8 ;W8=0x73 -> 0x109, W9=0x96add w8, w9, w8 ;W8=0x40 -> 0x122, W9=0xe2add w8, w9, w8 ;W8=0xe -> 0x1a, W9=0xc省略N次...
w8即0x42这列分析
搜一下
Call addr: 0x20a19b8d0 [libsystem_platform.dylib!_platform_memmove] (dst=0x13bd375b0, src=0x13bd36ed8, n=32)源内存内容: (dst=0x13bd375b0, src=0x13bd36ed8, n=32)0000: 42 00 88 73 40 0e 03 08 30 6f c1 b1 07 54 11 6d [email protected] (dst=0x13bd375b0, src=0x13bd36ed8, n=32)0010: 8b dc f9 04 c7 7d 26 75 76 84 2e fc 3f a4 ce 94 .....}&uv...?...
继续找这块数据生成的部分
看下0x42008873生成的地方
0x1003e8b40 0xc0b40 add w14, w15, w14 ;W14=0xf485e8dc -> 0x42008873, W15=0x4d7a9f97
继续看W15=0x4d7a9f97的生成
0x1003e8b40 0xc0b40 add w14, w15, w14 ;W14=0xe370b930 -> 0x4d7a9f97, W15=0x6a09e667
熟悉的朋友想必已经发现0x6a09e667是sha256的h0回到上头0x42008873的生成中,看W14=0xf485e8dc
W14=0xf485e8dc = 0xaedaced5+ 0x45ab1a070x1003e8aec 0xc0aec add w13, w3, w15 ;W13=0x23b32947 -> 0xaedaced5, W3=0xa9237f7f, W15=0x5b74f56 0x1003e8af0 0xc0af0 add w13, w13, w14 ;W13=0xaedaced5 -> 0xf485e8dc, W14=0x45ab1a07 // W13+W14 = (w3+w15)+w14
继续W13=0xaedaced5的生成中w3=0xa9237f7f的生成
0x1003e8aec 0xc0aec add w13, w3, w15 ;W13=0x23b32947 -> 0xaedaced5, W3=0xa9237f7f, W15=0x5b74f56
那么w3分支对应sha256中S0,s0组成的temp1会和temp2有add,temp2中有W[i]参与,目的通过w[i]找明文。
找w[i],发现0x5b74f56中有明文操作经过分析:
0x1003e8aa4 0xc0aa4 add w16, w16, w17 ;W16=0x3102044 -> 0x9a4d5032, W17=0x973d2fee0x1003e8aa8 0xc0aa8 add w15, w16, w15 ;W15=0xedfe1951 -> 0x884b6983, W16=0x9a4d50320x1003e8aac 0xc0aac add w15, w15, w3 ;W15=0x884b6983 -> 0x504b6e0b, W3=0xc80004880x1003e8ab0 0xc0ab0 add w15, w15, w5 ;W15=0x504b6e0b -> 0x16bce6fd, W5=0xc67178f2 // w5 = K[i] = 0xc67178f2为K表的常量最后一轮0x1003e8ab4 0xc0ab4 add w15, w15, w4 ;W15=0x16bce6fd -> 0x5b74f56, W4=0xeefa6859 // w16+w17+w15+w3+w5(即K[i])+w4[即W[i]]
w[64] = 0xeefa6859,找到0xeefa6859的生成地方,搜下:
找到W[0]
0x1003e8aa0 0xc0aa0 ldr w4, [x6, x4] ;W4=0x0 -> 0x5f15b545, X6=0x13bd36d58 // W[0]
找0x5f15b545即w[0]的生成,中途看到W[0]参与的计算对应
for i from 16 to 63 s0 := (w[i-15] rightrotate 7) xor (w[i-15] rightrotate 18) xor (w[i-15] rightshift 3) s1 := (w[i-2] rightrotate 17) xor (w[i-2] rightrotate 19) xor (w[i-2] rightshift 10) w[i] := w[i-16] + s0 + w[i-7] + s1
继续找w[0]的生成,找到搜下0xc097c,明文填充0x80,拼接0拼接长度,然后bswap
继续定位 0x5f15b545的来源
0x1003e8b40 0xc0b40 add w14, w15, w14 ;W14=0xaf9a9a47 -> 0x5f15b545, W15=0xaf7b1afe // 得到 0x5f15b545 新一轮sha256
发现又是新一次轮sha256,这里标记下,并且汇编地址0xc0b40上面有看到。 w14-> 0xaf9a9a47的生成
0x1003e8aec 0xc0aec add w13, w3, w15 ;W13=0x65fc8355 -> 0x2fd71d2c, W3=0x20561d14, W15=0xf8100180x1003e8af0 0xc0af0 add w13, w13, w14 ;W13=0x2fd71d2c -> 0xaf9a9a47, W14=0x7fc37d1b0x1003e8af4 0xc0af4 stp w13, w16, [sp, #8] ;W13=0xaf9a9a47, W16=0x37c43fab, SP=0x13bd36d30
0x1003e8aec 0xc0aec add w13, w3, w15 ;W13=0x65fc8355 -> 0x2fd71d2c, W3=0x20561d14, W15=0xf810018
找0xf810018,之前图里提过w4=w[i]
找0x633c8d9f即w[i]
找到w[0]
找到填充bwap的地方
看到这里明文为转了大端序:
38 d7 48 09 f8 1e 1f 55 73 24 fa 38 cf 68 05 b7
长度为0x280对不上,结合上面的0x5c,2次sha56,诸多特征当然还有我后续的分析,确定这是HMAC-256。 验证下没问题:
Key的还原略过,找到后异或就行了。 继续分析数据明文:
38 d7 48 09 f8 1e 1f 55 73 24 fa 38 cf 68 05 b7
0x1003fd29c 0xd529c eor w8, w9, w8 ;W8=0x1c -> 0x38, W9=0x240x1003fd29c 0xd529c eor w8, w9, w8 ;W8=0xfe -> 0xd7, W9=0x290x1003fd29c 0xd529c eor w8, w9, w8 ;W8=0xe8 -> 0x48, W9=0xa00x1003fd29c 0xd529c eor w8, w9, w8 ;W8=0x20 -> 0x9, W9=0x290x1003fd29c 0xd529c eor w8, w9, w8 ;W8=0xfc -> 0xf8, W9=0x40x1003fd29c 0xd529c eor w8, w9, w8 ;W8=0x5 -> 0x1e, W9=0x1b0x1003fd29c 0xd529c eor w8, w9, w8 ;W8=0xa7 -> 0x1f, W9=0xb80x1003fd29c 0xd529c eor w8, w9, w8 ;W8=0xa9 -> 0x55, W9=0xfc0x1003fd29c 0xd529c eor w8, w9, w8 ;W8=0x8c -> 0x73, W9=0xff0x1003fd29c 0xd529c eor w8, w9, w8 ;W8=0xdf -> 0x24, W9=0xfb0x1003fd29c 0xd529c eor w8, w9, w8 ;W8=0x75 -> 0xfa, W9=0x8f0x1003fd29c 0xd529c eor w8, w9, w8 ;W8=0xba -> 0x38, W9=0x820x1003fd29c 0xd529c eor w8, w9, w8 ;W8=0x97 -> 0xcf, W9=0x580x1003fd29c 0xd529c eor w8, w9, w8 ;W8=0x77 -> 0x68, W9=0x1f0x1003fd29c 0xd529c eor w8, w9, w8 ;W8=0x91 -> 0x5, W9=0x940x1003fd29c 0xd529c eor w8, w9, w8 ;W8=0xd0 -> 0xb7, W9=0x67
w9=0x24这列数据
找一下和文章最后w9分析一致,v1通过a45678解码,v1是固定的,a45678也是固定的,结果解出来也是固定的,直接拿到结果保存使用就行。
W8=0x1c这列数据:
0x1003fcea4 0xd4ea4 add w8, w9, w8 ;W8=0x24 -> 0x11c, W9=0xf8 // w8 = w8+w9(ldr)0x1003fcea4 0xd4ea4 add w8, w9, w8 ;W8=0x68 -> 0xfe, W9=0x960x1003fcea4 0xd4ea4 add w8, w9, w8 ;W8=0x96 -> 0xe8, W9=0x520x1003fcea4 0xd4ea4 add w8, w9, w8 ;W8=0x64 -> 0x120, W9=0xbc0x1003fcea4 0xd4ea4 add w8, w9, w8 ;W8=0x39 -> 0xfc, W9=0xc30x1003fcea4 0xd4ea4 add w8, w9, w8 ;W8=0x3c -> 0x105, W9=0xc90x1003fcea4 0xd4ea4 add w8, w9, w8 ;W8=0x29 -> 0xa7, W9=0x7e0x1003fcea4 0xd4ea4 add w8, w9, w8 ;W8=0x83 -> 0xa9, W9=0x260x1003fcea4 0xd4ea4 add w8, w9, w8 ;W8=0xf7 -> 0x18c, W9=0x950x1003fcea4 0xd4ea4 add w8, w9, w8 ;W8=0x3f -> 0xdf, W9=0xa00x1003fcea4 0xd4ea4 add w8, w9, w8 ;W8=0x70 -> 0x75, W9=0x50x1003fcea4 0xd4ea4 add w8, w9, w8 ;W8=0xd9 -> 0x1ba, W9=0xe1省略...
找24 68 96 64
看截图里0x2AD7D2BB,0xeb86d391还有运算这MD5嘛
找下入参明文,由x1, x2, x3, x4, x5, x7组成。
入参拿到后验证下, 标准md5没问题
W9=0xf8这列
0xf8 0x96 0x52 0xbc 0xc3 0xc9 0x7e 0x26保密...
找一下和文章最后w9分析一致, v1通过a45678解码, v1是固定的,a45678也是固定的,结果解出来也是固定的, 直接拿到结果保存使用就行。
w9即0xaf这列分析
省略N次 与下面W9分析那里逻辑一致, 解密出来结果的不同部分而已, 直接保存用就行。
W9分析
查找到w9的值,继续找生成继续查找找到生成的地方
省略N次...
按这个逻辑对应ida伪代码
这块和上边一样也是对v1通过a45678解码, v1是固定的 a45678也是固定的。结果解出来也是固定的, 直接拿到结果保存使用就行。
最后
本次是iOS基于trace法还原vmp的小尝试,vmp可借鉴材料的不多,自己也算摸索出来了一点皮毛。 文中如有错误,欢迎大家斧正,欢迎交流。 后面有时间会接着写剩下的参数还原~欢迎大家关注,你们的关注是我自律的最大动力~
报课优惠、工作避坑&内推(仅成都)、技术交流、商务合作、技术交流群
扫码或者搜ID:geekbyte
原文始发于微信公众号(编角料):【iOS逆向】iOS某大厂vmp参数还原
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论