首页
社区
课程
招聘
[原创]2016腾讯游戏安全竞赛android第二轮第二题分析
发表于: 2016-3-31 20:40 11454

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

2016-3-31 20:40
11454

算法流程:
  输入必须是Base64编码的字符串,且Base64解码后为32字节。解码后进行RSA加密,加密后第一字节必须为0x00,第二字节为0x14,才会进入Native层的验证。Native层先将机器码进行一系列运算,得到20字节的一个数组,再将RSA加密后的20字节(22的前2字节不参与后边的运算)的后4字节与程序中固定的4字节进行计算,得到一个8字节的结果,再用这个8字节的结果分别与剩下的两个8字节进行计算,得到16字节的数组,再拼上输入的最后4字节,得到20字节的数组,与机器码计算结果的20字节比较,相同则成功。

分析流程:
1.  用JEB打开,看看java层逻辑。
 
2.  验证长度,且RAS加密后,前2字节必须为0x00,0x20,才能进入Native层,最开始打算修改smali后重新打包,用了几个工具没能成功,就不想尝试这种方法了。于是写了个Xposed插件,hook RSA加密的那个函数,修改函数的返回值。
 
3.  用IDA动态调试so,先还原根据机器码计算的各个函数。
 
 
 
Clac_key内部
 

根据机器码运算还原
 

 
4.  注册机
编写注册机需要先还原机器码运算的过程,计算出20个字节,再根据注册码运行的过程反推出RSA加密后的结果。
在这个过程中,有个算法花了我不少时间:
 
最后用print大法发现了其中规律。
 
 
 
这个算法的代码见附件。

推算出RSA加密后的结果(22字节)后,需要用RSA私钥解密。
题目中的公钥为:
MDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhAMw8CJ6Azv7ak+y+AEJmen4UMMPkGQ5D2QBrG7vKcX6XAgMBAAE=

 

将CC3C089E80CEFEDA93ECBE0042667A7E1430C3E4190E43D9006B1BBBCA717E97换算成10进制:
92377891422080520374820400579771977245937984366175935318313202287429727387287L,到factordb.com查询,得到分解后的p和q。

 
根据p和q,用rsatool.py生成私钥:
MIGqAgEAAiEAzDwInoDO/tqT7L4AQmZ6fhQww+QZDkPZAGsbu8pxfpcCAwEAAQIgIMyfYb00AQ/fY8zbw84ra5yjYMRThI8nvHpluCvTk1kCEQDgVUR8Ua3eFhx0Ihlx3nEdAhEA6RB2ochHf6h8DbAj80A0QwIRAMWW1OebGcVPPGid0EOXZZECEDV18lBv+X6d7j7RjZ2Jt7MCEBY+nMRBZYpEr2o2xCUAMzk=
 
 
有了RSA私钥,注册机就能写出来了。
 

注册机代码太乱,就不放源码了。

参考资料:
335K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6d9j5h3&6V1L8$3#2K6b7#2c8r3i4K6u0r3N6%4u0A6N6r3g2Q4x3X3c8#2M7s2y4Q4x3V1k6@1M7X3g2W2i4K6u0r3j5e0c8W2y4K6c8U0z5o6t1%4z5o6V1@1k6o6f1I4k6h3y4U0j5e0S2T1y4K6M7@1x3U0S2T1j5e0q4X3x3h3j5^5y4h3j5#2j5e0g2V1k6q4)9J5c8W2c8J5k6h3&6V1i4K6t1#2x3U0m8y4K9h3y4J5L8#2)9J5y4e0t1H3b7#2c8r3i4K6t1#2x3U0m8m8M7$3W2S2i4K6t1#2x3U0m8b7j5h3y4A6k6X3W2U0i4K6t1#2x3U0m8Q4x3U0f1J5y4W2)9J5y4e0t1H3d9X3q4H3j5h3&6Q4x3U0f1J5x3o6t1H3x3e0g2Q4x3U0f1J5x3p5!0F1L8r3W2F1k6g2)9J5y4e0t1H3f1i4g2S2L8r3W2X3K9h3g2J5i4K6u0r3b7%4u0&6M7s2c8G2i4K6t1#2x3U0l9I4x3o6m8Q4x3U0f1J5x3q4)9J5y4e0g2n7j5%4u0&6M7s2c8G2i4K6t1#2y4f1c8Q4x3U0f1J5x3q4)9J5z5o6p5H3x3q4)9J5z5b7`.`.

Tencent2016C.apk
Keygen.apk
算法.txt
Tencent2016C_Writeup.pdf


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

上传的附件:
收藏
免费 3
支持
分享
最新回复 (9)
雪    币: 6802
活跃值: (4480)
能力值: (RANK:600 )
在线值:
发帖
回帖
粉丝
2
占个沙发
2016-3-31 21:36
0
雪    币: 1329
活跃值: (5134)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
3
把注册机源码放一下 让大家学习一下呗
2016-3-31 23:07
0
雪    币: 250
活跃值: (65)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
感谢分享,原来私钥是这样得到的,能力还是不行
2016-4-1 08:35
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
都是大神啊
2016-4-1 12:00
0
雪    币: 525
活跃值: (3248)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
6
分析的不错。
2016-4-5 08:59
0
雪    币: 51
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
niub,根据楼主的文章是不是相当于说RSA已经非常不安全了,如果是,那更安全的加密是什么
2016-4-5 15:56
0
雪    币: 507
活跃值: (420)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
前排支持~
2016-4-5 18:41
0
雪    币: 5936
活跃值: (5234)
能力值: ( LV8,RANK:138 )
在线值:
发帖
回帖
粉丝
9
“RSA的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因为没有证明破解RSA就一定需要作大数分解。假设存在一种无须分解大数的算法,那它肯定可以修改成为大数分解算法。 RSA 的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显然的攻击方法。人们已能分解多个十进制位的大素数。因此,模数n必须选大一些,因具体适用情况而定。”

这题中的N是256比特的,比较容易被分解。目前的话,采用1024比特及以上长度的密钥,应该还是安全的。
2016-4-6 19:33
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
模数N如果很难被分解出来就拿不到私钥 也就解密不了了,tx这题用的公钥太简单,所以可以直接分解出p跟q从而生成私钥,如果用1024位的还是比较安全的。
2016-4-7 01:17
0
游客
登录 | 注册 方可回帖
返回