Android加密 看雪,Android加密与解密入门两题

写在最前面

本次题目来自看雪2w班9月题。密码学一直是安全的基础,Android安全也不例外,这次9月份的题分别从java层和C层考察了密码学中常用的对称加密、hash函数以及一些基础的编码,但是不是单纯的算法分析题,可以说是很好的练习题了。

9月第一题

脱壳,脱壳后进行逆向,

4eb177bf8b5f1c17a0e1fa4b248808a0.png

一开始感觉so文件完全没啥用,反而有一个Utils的类十分可疑

很明显的test函数是入口,然后调用bbbbb函数进行加密得到的返回值作为aaaaa函数的参数进行加密,最后确认是否等于Utils.Cipher

一开始一看 不是很明显嘛直接CyberChef,然而。。

4f347c6555ba6d237d8ed577f62af603.png

很明显不对。。想到之前寒冰师傅出的题,一定是动态修改,静态看的肯定不准

于是直接用Objection打印吧

9605e2bea802467cb1ad915b699c3427.png

果然。。。

再来CyberChef

d79e58b517a114d62ea385df5c22b2dc.png

还是不对,难道不是也不是AES嘛 。。

后来经过主动调用发现AES是对的,那么RC4魔改了????直接抠出来用Java工程跑一遍,确实和标准的RC4不一致。。

不过由于RC4这种是一个对称密码,那么我直接拿AES解密后的去再调用一次这个函数就行了。。

最终frida跑出来原来的正确的flag

10dfb139770d0d38fae5d456a68c723f.png

脚本关键函数如下

这里的c3bfc...是我用CyberChef逆出来的。

或者自己写一个java工程,把这个类的所有代码拷出来。。。写个反向的工程就行了。这里我贴出我为了印证RC4的Java工程的代码吧

最后验证索然无味

b90b2b48f85624659e488d7abc15ee71.png

九月第二题

024ca100d17d9b982e04289edf80fab9.png

脱壳后查看代码。。猜测onCreate函数应该是360给native化了,暂时不管,从jnitest函数入手。

先静态看看

124c9a3f3992ee277be128d387ce055b.png

emmmmm这个函数ollvm了,差点就准备放弃。。。F5看看,静态看了看发现实际真实块只有一个

180c6dc9e16f4cf9e3a2f9d7ef1475d0.png

跟进看看,最后跟进到mytest这个函数

038530aa157a300e55718496231d76bc.png

这个混淆的不是很严重,基本块都在,稍微看了看执行顺序,会发现先执行了1基本块,然后执行2号基本块

稍微跟进里面的几个函数一看就能恢复出来,

先看sub_428bc

251cea90d09cbde9dd38397bceb5b617.png

跟进第一个执行的函数

3ac07cf30fd34ae5349045a7bedeff62.png

会发现有几个特别明显的hex值,猜想sub_428bc是md5,emmmm不想看了,猜想这个jnitest的函数是处理我们的输入的,先直接hook吧,最终关键代码如下

3af91b8f1573bb2376362a00e3e16cb8.png

图片左边是hook的结果,右边是CyberChef的加密结果,hook多次后发现,sub_428bc函数确实是md5 hash函数,第一个参数是输入,第二个参数是用于存储md5加密后的byte数组的地址。

c02af7966e9ba97b872cbabd3f50f68a.png

而mytest函数中sub_8748使用FindCrypt插件会发现是一个base64加密函数,hook再次确认,是base64加密,函数的第一个参数是我们md5加密后的值,第二个参数是固定的16.

a64ec1e8f969eecbf4c33935b64f2952.png

在hook的过程中会发现,mytest函数第二个基本块,也就是下面这张图中。也调用了sub_8748函数且生成的结果唯一。其值为4QrcOUm6Wau+VuBX8g+IPg==

8d9abf0a64e936e364c97eff09f15a7c.png

直接逆推对应的md5 哈希值为e10adc3949ba59abbe56e057f20f883e

一解emmmm,flag是123456

93eef467c0733452c899197533b9001d.png

验证发现是对的。。。

小结

在我做这两个练习题的过程中,主要使用静态的代码逆向去进行大概的逻辑分析,使用frida的hook和主动调用去进行动态验证,压根没有什么IDA进行动态调试,所以最后还是喊一句frida牛逼!

另外我在做第一题时,想研究一下如何做到静态jeb看的字符串和动态使用Objection查看的字符串不同的这个技术,可是我竟然在so文件中没有找到操作对应位置的stringID的地方,懵了,希望知道的大佬不吝赐教2333,最后一句,寒冰师傅牛逼!

附件附上

上传的附件:

1.zip

(8.32MB,25次下载)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值