猿人学2022-APP出题思路
这里说一下我这十道题的一个出题思路,以及每道题采用的算法(有的算法我改了一点点流程)。提前说一下,本篇文章存在剧透成分。关于题解我这里也没有,期待着其他的大佬们的分享了。逃~~
第一题
第一题所有算法都在Java层,反编译工具如果好用的话,抠出来代码大概率就能直接用了。为了凑字数,我来写一个第一题的题解蛤(单纯的凑字数)。
第一题题解
这里假装一下,我并不知道这是什么算法蛤,偷偷地假装。
我来说一下,这一道题如果是我要还原算法我的思路是什么,首先看到这代码都没混淆,那是相当的开心,然后直接定位到需要还原的函数
package com.yuanrenxue.match2022.security; import java.util.ArrayList; import o00OO.OooO00o; /* compiled from: proguard-dict.txt */ public class Sign { // ... }
大概看一眼,这道题开头的四个常量A, B, C, D这里转换成16进制来看
final private static int A = 0x67452301; final private static int B = 0xefcdab89; final private static int C = 0x98badcfe; final private static int D = 0x10325476;
发现它很像MD5的初始化常量,然后接着往下看,发现它比md5的函数少一个,并且是没有T表的,因此怀疑大概率不是MD5,然后接着看1518565785
这个常量引起了我的兴趣,这里把他转换成16进制0x5A837999
然后Google上搜一把,好像也没搜到啥有用的信息。然后搜索一下第二个常量0x6ED9EBA1
这回,感觉是接近我想要的东西了。
这里通过观察,很明显他不是sha系列的算法,所以呢,看到箭头所示的内容,点进去看一下。感觉这一波稳了啊,大概率就是MD4了,如果对于密码学熟悉,能直接猜出来这个是MD4进行了简单的修改,那么也可以跳过搜索这一步。
有了目标算法,这里就简单了,找一个原始的Python实现,然后对着改一改,py版本就出来了。
这里给出一篇我写的文章哈,偷偷给自己的文章加个链接
第二题&第三题
这两道题,其实都是在native层做的加密,区别在于第二道题没有混淆,没有隐藏符号表,第三道题混淆并且隐藏了符号表,如果使用unidbg的话,大概率一套代码可以搞定俩题。
第二题
第二题所采用的算法是MD2,但是这里结果我返回的是base64编码的哈希值。
第三题
第三题算法采用的是SM4,一个国密算法,但是结果我返回的是hex的字符串。
第四题(grpc)
这道题核心在于grpc上面,搞定grpc怎么发请求应该就可以了,如果使用unidbg的话,有关算法这里采用的是FNV-Hash,整个算法其实是比较短的。
第五题(双向认证)
这道题目比较单纯,只有一个双向认证,并没有添加算法。
第六题(设备指纹)
这道题核心思想来源于珍惜大佬的获取Mac地址(https://bbs.pediy.com/thread-271698.htm)的方法,然后这道题的加密采用的白盒AES,实际上并没有魔改,有兴趣研究的大佬可以尝试搞一下密钥。不过根据后面大佬的分析,我发现我犯了一个错误,这里我模式选取的并不合适,因此可以不通过白盒,来抽取出来加密的方法,这也提示了我,在选取加密算法和模式的时候要注意使用场景,避免出现虽然添加了加密算法,但是安全度并没有提高的问题。逃~~
第七题(quic)
这道题核心是quic协议,这里我采用了cloudflare开源的https://github.com/cloudflare/quiche来实现的quic协议,然后他给的是rust版,因此呢so我就用rust实现了。(逃~~)
然后这一道题算法采用的是ZUC算法。
第八题(upx)
这一道题也是和标题一样,so给加了一个upx的壳。这里其实也来了一个我的非预期解,最新版的unidbg注释掉两行代码,实际上就能运行了,我的本意还是脱掉upx的壳,参赛的大佬们还是强大,给大佬们点赞,有关这道题的算法采用了AES和Base64(Base64实际上是编码,并不是加密哈)。然后这道题的AES是采用了查表法来实现的。
第九题(tcp协议)
这一道题实际上是tcp+tls,直接采用原生的请求发送的tcp包。然后有关这一道题的算法,其实也比较轻量,采用的RC4。
第十题(tls指纹)
这一道题我实现了好长时间,其中考点个人感觉是有三个,第一就是标题所说的tls指纹,第二是我检测了hook, 第三是整个so混淆开的比较大,并且参数有亿点点的多。具体hook检测的思路参考https://github.com/emanriquez/antifridaAndroid 有兴趣的大佬可以继续研究一下,这个监测点还是比较有意思的。有关这道题的算法相比于上面的9道题,涉及的算法其实就比较多了,因为这道题上了tls,因此呢整个openssl的库就直接被打包进来了,所以说呢,这里算法我好多其实可以都不用自己实现,里面的算法可以随便用了,相当的舒服,里面所采用的编码以及加密算法有AES、Base64、Hex编码、Sha256、SM4、RC4、whrloppl。大部分实际上是没有魔改的,真·只修改了一点点。
总结
好了,整个10道题的具体算法到这里就介绍完了,最后感谢平哥对于这次比赛的支持,感谢开源库的作者提供的出题思路,感谢各位参与者对赛题当中不完美地方的包容,在这里期待一下大佬们的分享了。