首页
社区
课程
招聘
[原创]入门实战-知乎x-zse-96参数分析
发表于: 2025-11-20 03:28 9073

[原创]入门实战-知乎x-zse-96参数分析

2025-11-20 03:28
9073

图片描述
图片描述
图片描述
其中的第一个参数是变化的byte数组
第二三个参数是固定的值
图片描述

找到了so中注册的具体位置
unidbg中固定参数,运行一下,没有什么问题,配合frida打印一下相同参数下真机的返回值,发现是相同的

这里生成一份trace文件,留待备用

返回值(分成32个字符一组,方便查看):
9b332a80a8edcc723e9dbf64c13e24c2
975451929dc2085c3a8249dd01820eae
fe4d8c7b7861bf24b98819c5f46e0878

已经拿到了trace文件,根据返回值,从后往前找,很快能找到关键点0x07024
图片描述
直接进入这个pc指针0x07024中查看,就能大概找到算法主函数 Bangcle_WB_LAES_encrypt
图片描述
不过我们unidbg中运行中看到的入口地址是 0x9e98

直接上ida中进行查找,内部没有什么严重的混淆,
那么入口的0x9e98是怎么一步步运行到0x07024内部的呢,我们简单分析ida中函数的调用逻辑
Java_com_bangcle_CryptoTool_laesEncryptByteArr一番看下来,就是下图中标记的地方比较有问题
图片描述
进入sub_8B2C中,结合之前分析到的Bangcle_WB_LAES_encrypt算法主函数一起观察,发现如下:
图片描述
所以上述函数调用的整体逻辑就完全清晰了。

so内部函数算法调用逻辑大概清晰了,我们现在来分析一下aes的这个主要算法函数Bangcle_WB_LAES_encrypt的大致逻辑:
函数内部非常符合aes的标准算法流程:字节代换,行位移,列混淆,轮密钥加
可以很清晰的找到一个循环:
图片描述
正常的话这里的v52的值应该是10
这里有多种方式可以查看这个v52的值

找到了aes的主要逻辑位置,以及分组加密中9轮加密的循环过程,其实就可以进行dfa差分攻击获取aes key
差分攻击,需要修改第9轮的state值,所以现在需要找到循环中的state

这里简单分析一下
图片描述
循环的第一个过程是 字节代换, 将一个4*4的矩阵,通过查表,一个个替换成另外的数值
图中很明显,代码是将4*4的矩阵,切分成了v36v51的一个连续存储地址的变量中,
所以进入循环后,这个v36地址对应的长度16个字节的值,就是state,
ida汇编分析如下
图片描述
所以,第二行LDRB W0,[X0] 这个时候的x0的值,就是state,
差分攻击的时候,修改这里就行

但是攻击后没有密钥返回
这里就怀疑是魔改的aes加密了

最开始参数(分成32个字符,也就是16个字节一组):
实际加密参数:
838d8f808f89212888212a8a22288f8f
8a8b22212a8d8b23222289218121818b
iv参数
99303a3a32343a3992923a3b3a999292

返回值:
9b332a80a8edcc723e9dbf64c13e24c2
975451929dc2085c3a8249dd01820eae
fe4d8c7b7861bf24b98819c5f46e0878

图片描述

观察到的参数a4 : 0x99303a3a32343a3992923a3b3a999292, 这个就是iv参数
图片描述
a1:这个就是原始需要加密的参数 (原始输入是32个字节,所以aes算法会补齐16个字节,变成三组,标准算法这里刚好32个字节应该是补0, 但是这里可以观察到补充的是0x9b)
图片描述

所以这里魔改的aes算法中的补位不是标准的PKCS7补位,具体什么时候补充什么,比较简单的方式是一个个尝试出来,这样就不用分析代码

a1 / a2: 根据Bangcle_CRYPTO_cbc128_decrypt中代码可以知道,这个a1参数实际就是和 iv值 异或 第一组原始待加密值
图片描述

a3: 猜测可能是key,或者和key相关的值, 且调整iv, 和planttext,这个值都不改变
图片描述

a3是函数的参数a3, 而在进入的时候,a3的打印是
图片描述
所以,我错误的以为这里的v53他就是a3值,但是其实不是这样的,
这里(_QWORD *)不仅有强转的意思,还有指针取地址的意思
所以*(_QWORD *)a3的实际含义是:

相当于是双层指针获取内容

所以unidbg中拿到的a3的值,并不是v53的实际值,而是要再进行一层指针获取内容
也就是 : 0x123600c0地址下的内容,才是实际的v53的值

ida中去观察一下a3的传入逻辑,发现,最早出现在Bangcle_internal_crypto函数的这个v18
图片描述
往上继续观察,发现v18只有在这个sub_3BA8函数中操作了
图片描述
进入后,发现逻辑也很清晰

这里大概就是最开始的key的赋值相关操作了

图片描述

打印一下输入输出值

ida中伪代码:
图片描述
这段代码执行完后,&v36对应值如下

其中存在一些参数:
unk_B248:这是一张表,直接通过unidbg进行打印

a1: 就是参数a1
v53: 这个上述分析过了

反编译后的代码没有多少混淆,几乎是可读的状态,这样直接手动转换为python代码就很简单,重要的是每一步数据的转换,需要配合实际调试(Frida, trace文件,unidbg动态调试等)
上述第一段代码转成py代码如下

实际输出,和debug调试内容相同

剩下的其他部分伪代码,比如9轮循环等等,也是一样的操作流程
因为没有什么混淆所以转换起来很简单,就不多介绍了
如果这段函数代码存在vmp, 就会变得比较难以还原,估计要一点点细节分析才知道代码做了什么

整体分析流程涉及了jadx + unidbg + frida + ida + trace分析 + aes算法,
侧重点在 so算法分析的

整体蛮适合新手入门

Find native function Java_com_bangcle_CryptoTool_laesEncryptByteArr => RX@0x12009e98[libbangcle_crypto_tool.so]0x9e98
Find native function Java_com_bangcle_CryptoTool_laesEncryptByteArr => RX@0x12009e98[libbangcle_crypto_tool.so]0x9e98
Find native function Java_com_bangcle_CryptoTool_laesEncryptByteArr => RX@0x12009e98[libbangcle_crypto_tool.so]0x9e98
Find native function Java_com_bangcle_CryptoTool_laesEncryptByteArr => RX@0x12009e98[libbangcle_crypto_tool.so]0x9e98
public void hook_so_dfa_attach() { 
    Debugger attach = androidEmulator.attach(); 
    int[] counts = {0}; 
    attach.addBreakPoint(cryptoDDmodule.base + 0x5EB0, new BreakPointCallback() { 
        @Override 
        public boolean onHit(Emulator<?> emulator, long address) { 
            counts[0]++; 
            if (counts[0] == 9) { 
                Random random = new Random(); 
                UnidbgPointer pointerArg = emulator.getContext().getPointerArg(0); 
                pointerArg.setByte(setByteInt, (byte) random.nextInt(255)); 
                // System.out.println("攻击成功!"); 
            
            return true
        
    }); 
}
// 攻击0x5EB0这个地址,修改state
public void hook_so_dfa_attach() { 
    Debugger attach = androidEmulator.attach(); 
    int[] counts = {0}; 
    attach.addBreakPoint(cryptoDDmodule.base + 0x5EB0, new BreakPointCallback() { 
        @Override 
        public boolean onHit(Emulator<?> emulator, long address) { 
            counts[0]++; 
            if (counts[0] == 9) { 
                Random random = new Random(); 
                UnidbgPointer pointerArg = emulator.getContext().getPointerArg(0); 
                pointerArg.setByte(setByteInt, (byte) random.nextInt(255)); 
                // System.out.println("攻击成功!"); 
            
            return true
        
    }); 
}
// 攻击0x5EB0这个地址,修改state
with open("tracefile", "wb") as file:
    # 第一条原始数据
    # 后面是攻击后的数据
    file.write("""
c25ce89be4d780068843417105fdcd63
695ce89be4d78033884381710571cd63
af5ce89be4d780ca8843da71051dcd63
075ce89be4d780bc8843377105cccd63
965ce89be4d780e68843db7105e5cd63
055ce89be4d780aa8843697105f6cd63
965ce89be4d780e68843db7105e5cd63
a65ce89be4d780df8843c2710540cd63
6e5ce89be4d780de884327710522cd63
765ce89be4d780198843717105eecd63
1d5ce89be4d780fe884311710564cd63
495ce89be4d780618843f0710574cd63
a05ce89be4d7801188432971050bcd63
835ce89be4d780358843d77105a3cd63
7f5ce89be4d780518843e6710589cd63
865ce89be4d7807e88438b710544cd63
845ce89be4d78001884359710576cd63
d85ce89be4d780428843d87105aacd63
8c5ce89be4d780ba884368710554cd63
4d5ce89be4d780528843e1710586cd63
705ce89be4d780828843b571051ecd63
""".encode())
phoenixAES.crack_file("tracefile")
with open("tracefile", "wb") as file:
    # 第一条原始数据
    # 后面是攻击后的数据
    file.write("""
c25ce89be4d780068843417105fdcd63
695ce89be4d78033884381710571cd63
af5ce89be4d780ca8843da71051dcd63
075ce89be4d780bc8843377105cccd63
965ce89be4d780e68843db7105e5cd63
055ce89be4d780aa8843697105f6cd63

传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2025-11-20 04:26 被卡卡骨编辑 ,原因:
收藏
免费 45
支持
分享
最新回复 (34)
雪    币: 204
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
66
2025-11-20 09:11
0
雪    币: 31
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
期待更多优质内容的分享,论坛有你更精彩!
2025-11-20 10:17
0
雪    币: 6
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
感谢分享
2025-11-20 10:32
0
雪    币: 2
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
1
2025-11-20 10:40
0
雪    币: 143
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
666
2025-11-20 10:46
0
雪    币: 7
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
感谢分享
2025-11-20 12:07
0
雪    币: 260
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
1
2025-11-20 13:39
0
雪    币: 104
活跃值: (7189)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
tql
2025-11-20 14:31
0
雪    币: 740
活跃值: (2552)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
mark
2025-11-20 14:38
0
雪    币: 425
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
看看
2025-11-20 14:52
0
雪    币: 209
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
感谢分享
2025-11-20 15:07
0
雪    币: 8237
活跃值: (4778)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
tql
2025-11-20 15:35
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
14
111
2025-11-21 10:04
0
雪    币: 14
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
666
2025-11-21 10:35
0
雪    币: 2437
活跃值: (4703)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
666
2025-11-21 22:59
0
雪    币: 10
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
666
2025-11-22 12:12
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
18
111
2025-11-24 14:36
0
雪    币: 226
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
19
11
2025-11-24 15:06
0
雪    币: 293
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
20
666666666666
2025-11-25 15:45
0
雪    币: 141
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
21
666
2025-11-27 15:35
0
雪    币: 141
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
22
666
2025-11-27 15:35
0
雪    币: 77
活跃值: (425)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
1
2025-11-27 15:59
0
雪    币: 4
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
24
666666
2025-11-27 17:06
0
雪    币: 200
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
25
1111
2025-12-3 10:23
0
游客
登录 | 注册 方可回帖
返回