首页
社区
课程
招聘
[原创]2016腾讯游戏安全竞赛android第二轮第二题分析详解
发表于: 2016-4-1 10:18 12256

[原创]2016腾讯游戏安全竞赛android第二轮第二题分析详解

2016-4-1 10:18
12256

这题还是很丧病的,SHA1,CRC32,RSA256,DES,AES都用了(你们好狠)
        JEB看一下主要流程

就是二维码进来的字符串,Base64解一下,看看是不是32位
之后过a函数,其实是个RSA。

用RSA的公钥解密一下,
出来的数据前两个字节是数据长度, v1 = v0_1[0]*0x100+v0_1[1],必须是20个字节
之后处理成v2数组和DeviceID送Native函数看返回值是不是1
        IDA看so库函数
        EXPORT Java_com_tencent_tencent2016c_MainActivity_NativeCheckRegister
Chk函数,之后就是重头戏了,去鉴定识别一堆加密函数,都是常见的特征比较明显。
接下来挨个说,先是SHA1,几个常量参数。

下面几个函数还是SHA1的

内存交换后是个AES解密

进去之后

主要判定点
进去是AES的S盒,下面好多不一一阐述

下面函数是个CRC32

判定点就是CRC32_m_tab[256]
DCD 0, 0x77073096, 0xEE0E612C, 0x990951BA, 0x76DC419, 0x706AF48F

之后是个DES的初始化

判定点IP_Table以及下面的好多
_DWORD IP_Table[32]
.data:00005004 IP_Table        DCD 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18

下面还是个DES加密


进行了两次,通过调试确定好变量内存位置,重命名之后就是F5大法好
算法很清晰
         

具体流程
        设备ID计算出SHA1 20字节 5个DWORD
        用SHA1 后四个DWORD做 key ,用SHA1 前四个DWORD做密文,解密一次
        计算得到 四个DWORD的 SA ,SA 第五个DWORD是 DeviceID 的 CRC32
        之后是获取RSA 公钥解密后的 五个DWORD 即为 password copy
        DesKey 是8个字节,前四个是 固定的3F 5D 23 13 后四个字节是 password_copy的最后四个字节(上下文判断就是CRC32)
        之后就是两轮Des解密,每次解密8个字节 2个Dword
        用密钥解密 password copy 前 8个字节,最后一个字节不变。
        之后 SA 和解密后的 5个 Dword 对比,此时可以得知 最后一个Dword就是CRC32

所以翻过来的流程就是
        先计算SA , 5个Dword ,这部分流程是不变的
        之后用Deskey 加密 前8个字节
        之后的 5个字节RSA 私钥加密
        之后的字符串就是 验证码

现在的问题是Deskey已知,Aes的是自己算的不用管,RSA的私钥未知
所以要求RSA的私钥
已知X509pem
MDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhAMw8CJ6Azv7ak+y+AEJmen4UMMPkGQ5D2QBrG7vKcX6XAgMBAAE=
首先要获取模数
代码如下

X509EncodedKeySpec x509Key = new X509EncodedKeySpec(Base64.decode(x509pem, 0));
            RSAPublicKey PublicKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(x509Key);
            int ModulusLen = PublicKey.getModulus().bitLength();
            String mod = PublicKey.getModulus().toString(16);
            String exp = PublicKey.getPublicExponent().toString(16);

            Log.i(LOG_TAG, "pubkey len: " + ModulusLen);
            Log.i(LOG_TAG, "module:" + mod);
            Log.i(LOG_TAG, "PublicExponent: " + exp);

LOG里面打印出来抠出来分解模数

我I7的机器差不多1个小时就跑出来了,我出去吃饭,回来就出来了。
这下线索都有了,于是就是编程的问题了
主要代码在KenGen.java,初步测试成功了,由于我用的是在线的验证码生成,接下来是组装APK加验证码功能,上网随便找了个源码把我的东西扔进去就是了。
android studio 发布下APK,任务完成。
运行效果如下(借了同学的手机):
  
再次扫描的结果:


核心代码:
KeyGen.zip


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 3
支持
分享
最新回复 (6)
雪    币: 488
活跃值: (2153)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
2
就是一套密码学算法的应用啊。
2016-4-1 10:27
0
雪    币: 1234
活跃值: (317)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
厉害
2016-4-1 12:23
0
雪    币: 207
活跃值: (58)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不得不说,就像楼主说的,这个太BT了
2016-4-2 09:24
0
雪    币: 261
活跃值: (1366)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼主还是大学生就这么厉害了啊
2016-4-3 10:15
0
雪    币: 222
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
想问下楼主的JEB版本是多少?1.5还是2.0
2016-5-1 16:34
0
雪    币: 14
活跃值: (215)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
7
腾讯不是喜欢用xxtea加密算法嘛 这次咋没用..
2016-6-12 11:27
0
游客
登录 | 注册 方可回帖
返回