欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

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

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

算法流程:
  输入必须是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私钥,注册机就能写出来了。
 
注册机代码太乱,就不放源码了。
参考资料:
https://github.com/RandomsCTF/write-ups/tree/a4e74c827894d51ecca8b77428ba1f1f85f5a5dd/Trend%20Micro%20CTF%20Asia%20Pacific%20%26%20Japan%202015%20Online%20Qualifier/Crypto%20100%20%5Bcrypto%5D%20(100)
Tencent2016C.apk
Keygen.apk
算法.txt
Tencent2016C_Writeup.pdf

上传的附件 2.png
3.png
4.png
5.png
6.png
7.png
8.png
9.png
10.png
11.png
12.png
13.png
1.png
14.png
Tencent2016C.apk
Keygen.apk
Tencent2016C_Writeup.pdf
算法.txt

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功