游戏安全实验室 首页 活动 查看内容

【答案推荐】预赛android进阶版

发布于:2017-8-4 14:09   |    107270次阅读 作者: 管理员    |   原作者: 鲜槟丞   |   来自: 原创

​感谢android组鲜槟丞提供的答题过程



拿到apk,拆包,先把调试打开再说:

android:debuggable="true"

然后拖进jebjava层的逻辑并不复杂,主要是native

首先是CRegCheck::is_user_name_legal()这个函数,传入的是key,看名字就知道是判断输入的key是否合法的函数。


这个地方经过调试发现是判断key的长度

这个地方经过调试发现是判断由'-'分割后是否有8CRegCheck::is_num_or_letter是判断字符是否为数字或者在'a'-'f'之间函数,所以写注册机的时候为了满足这一点直接用了md5

出来之后继续分析CRegCheck::get_formula_param函数这个函数是将分割的key通过某种运算生成一个数字。这里可以直接静态分析出运算方法。


rsa


这一部分比较复杂


程序首先把key作为参数传入了get_rsa_key_seed来生成随机数种子

具体就是把key'-'分割后第一组和第五组运算,第二组和第六组运算,具体的算法静态就可以分析出来。

然后程序用这个种子初始化了一个RSA类。


获取质数的方式比较暴力,依照特定的算法每次从种子生成一个数模10作为位数,

还有就是这个地方,随便跟一个计算的函数可以发现第100位标识了这个大数有几个有效位。

获取完质数之后,就是rsa通常的计算N, e, r, d等数字,比较容易看出来。

之后程序把code传进了CBase64::base64_decode进行解码,跟进去之后发现就是一个魔改的base64算法,只不过索引方法和索引表变了而已。

解码之后,通过调试可以知道,解码之后的第一位标识了输入大数的符号,第二位和第三位联合一起表示大数的位数,然后从这个字符串获取对应的位数。重复这个过程直到遍历完整个序列。生成的大数应该是用链表储存的。

之后对大数进行加密,求出rsa的相关参数之后就比较好逆了。

最后是主要的验证函数is_tangent

这里用armlib跟进去发现都是__int64的数据在做运算,在32位的lib中特别难逆,思考了很久,最后突然想到在x64下会不会简单一点,打开之后果然让我很舒服:



这里可以很容易的发现是一个一元二次方程,其中

ax^2 + bx + c = 0

a = xu1 b = (xu2 - b1) c = (xu3 - b2)

第二个等式直接可以推出方程只有一解: xu4 = (b1 - xu2)/2xu1

之后就可以推导出b1 , b2关于xu 1-4的方程。


最后是用py3写的注册机

运行方法  python3 main.py


程序运行结果:


please input your name : name

key : b068‐931c‐c450‐442b‐63f5‐b3d2‐76ea‐4297

code :

OONPOO0vPiKNO24yWOBoWOiYP2g#O4OWOONOW4BOOOBOP4NWOOgPOiiyW4OyO2GOOiYvO2YWPOBNP4ioP4GoO4OyP4NWOOKOOi

O#O40yO2KoO2gOP4iYW4gNPiGPWOOWO4BnP4KOW4ONWOgWO4gyWOK#O4gPPOOWO4BnO2B#W4OPP2K#Oi0yW4NPO4YOO2OOO4OO

OOYOOONPWONOP2gWW4ioO2OnW4gOWOOPWOGvOONOO20yP2NNP24OOi0PO4N#OONvP4YOOiY#OO0vO4BYPiNnOiB#O4iPOiNWO2

4OOiYoO4BNPiYNWO0NOiGYO2iNPONyP2YOOiYYP4gOP24WO2NnP24WOiiyP4KyO2YOOiYYOOBoWONWO24oWO0#Pi0#OOKvOiNO

OiOWPiiNOiiOO2YnOOgWW4YyW40#OiOWO4OWP2iNW44#P4BYO2BnO24WPO4PP4==


运行成功截图:



分享到:
踩0 赞0

收藏

上一篇:【答案推荐】预赛PC进阶版

下一篇:【答案推荐】复赛第一题学生组android

相关阅读
最新评论
B Color Image Link Quote Code Smilies

发表评论

top 问题反馈

返回顶部