本文的3道Crackme来自Android高研2W班6月测试题。
这三题本身难度不大,flag的求解都是通过爆破长度为5位的字符串(只包含数字),求其hash1+salt的摘要与程序中硬编码的密文进行比较,非常适合Frida入门。
这三道题分别考察了:
静态分析可知,输入的用户名和密码的字符串拼接作为参数,然后传入vvvv方法。
进入vvvv方法后,input参数限制长度为5,经过eeeee方法得到的结果和p一致,就可以获得flag。
简单逆向分析可以看出,主要算法在eeeee方法中。
sssss方法在获取字符串的Sha-1值。
ccccc方法将sha-1的摘要转化成了16进制字符串的形式。
因为input的内容都是数字,并且只有5位,所以爆破空间只有10的5次方,直接爆破就可以了。
重新创建工程,可以看出eeeee的逻辑:将输入的字符串 逐字符插入到SALT的byte数组当中。然后再进行sha-1运算,获得其16进制的摘要字符串。
直接进行暴力破解,脚本以及结果如下:
得到结果:
flag:66888
对com.kanxue.pediy1.VVVV类中的方法eeeee进行主动调用。
最终得到flag也是66888。
输入检查一下。
本题在第一题的基础上加入了dex的动态加载以及Native函数的引入。
因为loadDexClass在OnclickListener中调用,所以当点击事件发生之后,要加载的DexClassLoader才会被创建。可以首先Java.choose主动调用loadDexClass方法;然后Java.enumerateClassLoaders枚举所有的类加载器,找到存在“com.kanxue.pediy1.VVVVV”的类加载器,通过Java.classFactory.loader=loader,对类加载器进行替换。
替换掉loader之后,和题目1一样进行暴力破解,得到下面的结果。
但是输入结果并不对。所以,还需要去看一看so文件,分析一下stringFromJNI函数。
静态分析,猜测可能是将字符串转成数字,然后对数字加一。于是我把so文件拿出来,重新创建工程进行加载,如下图所示,验证结果与静态分析一致。
因此,输入结果应该是66999 -1 = 66998。
输入结果,获得flag,66998就是最终结果。check结果没有问题~
本题在第二题的基础上加入了native层对Frida的反调试。
反调试逻辑:
通过一直循环创建Socket连接,遍历端口,检查端口是否被占用,收到“REJECT”时,说明frida-server正在运行,直接杀掉进程。
根据r0ysue
老师的要求,下面从三种方法过掉反调试
反编译重打包
onCreate方法中的init方法就是具有反调试功能的native层函数。
思路:查看对应的smali代码,然后将对调用init方法的smali语句进行删除,就可以了。
使用apktool解包,删除对应的smali代码,然后重打包,最后再重签名一下。
so硬编码
思路:修改跳转地址,使程序无法进入kill(v1, 9LL)的代码段。
修改完之后,效果如下图:
这样进程就不会被杀掉了。
frida hook
思路:除了在strcmp的跳转处hook,还可以hook recvfrom方法,修改返回值为-1,从而无法kill掉进程。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2020-7-7 12:11
被ychangeol编辑
,原因: