因某些问题部分算法代码不再提供,如有需要可以联系我主页
目标:nonce=89BD9D8D-69A6-474E-8F46-7CC8796ED151×tamp=1731047246145&devicetoken=910D166A-736E-3231-8B21-8D12DFD75F16&sign=9A2DFE01283DF2583E06643E1AAB7216
这个中的sign值
某算法1是:
26049;7466;<3QJJ:K5<BH=.HQW>>>12:47<B3=5=91694/07;;/2?<3/=DC76?3=677=>C8=36?B31276C88E6=-6>B7266<D/6;
如何变成
677PQC8P36RB31276C88E6P96QB7266ODB6N26049N7466NO3Q12M47OB3P5P91694B07NNB2RO3BPDC76R3PQJJMK5OBHPAHQWQQ
观察可知倒换了一下顺序 然后:
36 13 36 16 677=>C8=36?B31276C88E6=-6>B7266<D/6; 26049;7466;<3 Q12:47<B3=5=91694/07;;/2?<3/=DC76?3= >JJ:K5<BH=.HQW>> 36 13 36 677PQC8P36RB31276C88E6P96QB7266ODB6N 26049N7466NO3 Q12M47OB3P5P91694B07NNB2RO3BPDC76R3P QJJMK5OBHPAHQWQQ
= ascii码表是 61 > ascii码表是 62
P ascii码表是 80 Qascii码表是 81
所以结论就是如果是 非数字就加上19 需要单独处理('@', '9')
3.继续分析ing +1
x2 = 26049;7466;3QJJ:K5<BH=.HQW>>12:47<B3=5=91694/07;;/2?<3/=DC76?3=677=>C8=36?B31276C88E6=-6>B7266<D/6;
这个如何来的呢:

我们针对于一个字节来寻找答案 w9 = 0x36:
[libsfdata.so 0x2b1c0] [897d0153] 0x4002b1c0: "lsr w9, w12, #1" w9=0x1 w12=0x6d => w9=0x36
lsr 是一个 逻辑右移(Logical Shift Right)指令,具体意思是将寄存器中的值向右移动指定的位数,并将结果存储到目标寄存器中
所以我们只需要关注 w12=0x6d 是哪里来的就可以了。
[libsfdata.so 0x2b148] [8c010e0b] 0x4002b148: "add w12, w12, w14" w12=0x36 w14=0x37 => w12=0x6d
[libsfdata.so 0x2b138] [ec014039] 0x4002b138: "ldrb w12, [x15]" x15=0x404530d6 => w12=0x36是从0x404530d6 加载的
看下这个位置:

一共加载了101次
fromhex之后是:
46-7CC8796ED16ED15189BD9D8D-6D15189BD9D8D-69A6-474E-8F46-7CC8796E46-7CC8796ED15189BD9D8D-69A6-474E-8F
这个就有点像我们的入参经过某算法变化后的结果了
nonce=89BD9D8D-69A6-474E-8F46-7CC8796ED151×tamp=1731047246145&devicetoken=910D166A-736E-3231-8B21-8D12DFD75F16&sign=9A2DFE01283DF2583E06643E1AAB7216
接着分析 w14=0x37
[libsfdata.so 0x2afe8] [ce014039] 0x4002afe8: "ldrb w14, [x14]" x14=0x4045f001 => w14=0x37


终于看到明文了1731047246145lPQDb9AKO7$LjkPG910D166A-736E-3231-8B21-8D12DFD75F1689BD9D8D-69A6-474E-8F46-7CC8796ED151
所以 26049;7466;3QJJ:K5<BH=.HQW>>12:47<B3=5=91694/07;;/2?<3/=DC76?3=677=>C8=36?B31276C88E6=-6>B7266<D/6;
[libsfdata.so 0x2b1c0] [897d0153] 0x4002b1c0: "lsr w9, w12, #1" w9=0x1 w12=0x6d => w9=0x36
w9=0x36 是由
w12 = 00000000 31 37 33 31 30 34 37 32 34 36 31 34 35 6c 50 51 |1731047246145lPQ| 00000010 44 62 39 41 4b 4f 37 24 4c 6a 6b 50 47 39 31 30 |Db9AKO7$LjkPG910| 00000020 44 31 36 36 41 2d 37 33 36 45 2d 33 32 33 31 2d |D166A-736E-3231-| 00000030 38 42 32 31 2d 38 44 31 32 44 46 44 37 35 46 31 |8B21-8D12DFD75F1| 00000040 36 38 39 42 44 39 44 38 44 2d 36 39 41 36 2d 34 |689BD9D8D-69A6-4| 00000050 37 34 45 2d 38 46 34 36 2d 37 43 43 38 37 39 36 |74E-8F46-7CC8796| 00000060 45 44 31 35 31 |ED151|
+
00000000 34 36 2d 37 43 43 38 37 39 36 45 44 31 36 45 44 |46-7CC8796ED16ED| 00000010 31 35 31 38 39 42 44 39 44 38 44 2d 36 44 31 35 |15189BD9D8D-6D15| 00000020 31 38 39 42 44 39 44 38 44 2d 36 39 41 36 2d 34 |189BD9D8D-69A6-4| 00000030 37 34 45 2d 38 46 34 36 2d 37 43 43 38 37 39 36 |74E-8F46-7CC8796| 00000040 45 34 36 2d 37 43 43 38 37 39 36 45 44 31 35 31 |E46-7CC8796ED151| 00000050 38 39 42 44 39 44 38 44 2d 36 39 41 36 2d 34 37 |89BD9D8D-69A6-47| 00000060 34 45 2d 38 46 |4E-8F|
再循环右移而来的。
所以说下面的问题就是
1731047246145lPQDb9AKO7$LjkPG910D166A-736E-3231-8B21-8D12DFD75F1689BD9D8D-69A6-474E-8F46-7CC8796ED151是如何变成
46-7CC8796ED16ED15189BD9D8D-6D15189BD9D8D-69A6-474E-8F46-7CC8796E46-7CC8796ED15189BD9D8D-69A6-474E-8F
找到这个位置:

我们还是以第一个字节为例子寻找:
0x2b138] [ec014039] 0x4002b138: "ldrb w12, [x15]" x15=0x404530d5 => w12=0x34
[libsfdata.so 0x2b024] [0f020f8b] 0x4002b024: "add x15, x16, x15" x16=0x404530c0 x15=0x15 => x15=0x404530d5
查看 0x404530c0 内存:

这个0x15其实就是索引了
是nonce
x15=0x15哪来的?继续寻找
[libsfdata.so 0x2b014] [2f820f9b] 0x4002b014: "msub x15, x17, x15, x0" x17=0x1 x15=0x24 x0=0x39 => x15=0x15
-
**`msub x15, x17, x15, x0`** 这条指令的操作顺序是: 1. 将 **`x17`** 和 **`x15`** 相乘。 2. 然后将x0 - 结果 3. 最终将结果存入 **`x15`** 寄存器。 x0 - x17 * x15 = 0x15

x15是固定的0x24,
我们开始追x17:
[libsfdata.so 0x2b00c] [1108cf9a] 0x4002b00c: "udiv x17, x0, x15" x0=0x39 x15=0x24 => x17=0x1
- `udiv` 执行的是无符号除法,即所有操作数都被视为无符号整数。
x15=0x24也是固定的,x0 = 39 我们接着寻找:
0x2aff0] [e05f41f9] 0x4002aff0: "ldr x0, [sp, #0x2b8]" sp=0xbfffeef0 => x0=0x39
[libsfdata.so 0x29830] [e95f01f9] 0x40029830: "str x9, [sp, #0x2b8]" x9=0x39 sp=0xbfffeef0 => x9=0x39
[libsfdata.so 0x29828] [e90b40f9] 0x40029828: "ldr x9, [sp, #0x10]" sp=0xbfffeef0 => x9=0x39
[libsfdata.so 0x2a188] [08014039] 0x4002a188: "ldrb w8, [x8]" x8=0x404530c1 => w8=0x39

这里读取了四次:

所以 x15=0x15 其实就是
nonce的值:46-7CC8796ED16ED151 89BD9D8D-6D15189BD9D8D-69A6-474E-8F46-7CC8796E46-7CC8796ED15189BD9D8D-69A6-474E-8F

x0 = 89BD9D8D-69A6-474E-8F46-7CC8796ED151 取 索引[1] = 0x39
x17 = (x0 整除 0x24) = 0x1
x15 = 0x24
x0 - x17 * x15 = 0x15 => 索引 对比下图 也就是 46-7CC8796ED16ED1

同理 x0 = 89BD9D8D-69A6-474E-8F46-7CC8796ED151 取 索引[2] = 0x42
x17 = (x0 整除 0x24) = 0x1
x15 = 0x24
x0 - x17 * x15 = 0x15 => 0x1e 索引 对比下图 也就是 6ED15189BD9D8D-6
其余两次是:
D15189BD9D8D-69A6-474E-8F46-7CC8796E 46-7CC8796ED15189BD9D8D-69A6-474E-8F
所以算法是先根据 89BD9D8D-69A6-474E-8F46-7CC8796ED151 自己相加自己扩展到至少101个字节长度
然后根据算法求出索引再进行拼接
4.最后一部分:
读者自己可以琢磨一下。

743

被折叠的 条评论
为什么被折叠?



