1. 案例来源

https://github.com/OWASP/mastg/tree/master/Crackmes/Android

2. 分析过程

先安装apk后运行看一眼,看起来是要输入正确的内容然后验证,先随便输入一个试试看。
alt text

用jadx-gui打开,定位到核心代码。
alt text

看一下this.check.check_code函数,重定向到了Native库。
alt text

找到bar函数,恢复类型后看一下大概逻辑。
alt text

这里v8数组和qword_15038都是动态填充的,硬分析逻辑比较麻烦,这里采取动态调试的方法来Get flag会比较简单。

3. 调试之前先干掉反调试

在调试之前,我们要先干掉程序的反调试机制。

简单看一下MainActivity的逻辑,可以看到程序进行了so文件完整性检测、调试状态检测和Root检测,这里可以用修改代码、Frida Hook等方式干掉他们。这里简单起见,我就用修改代码的方式来操作。
alt text

在APK Editor里面定位到OnCreate函数。
alt text

注释掉相关检测代码,然后重新打包APK。
alt text

可以重新反编译新打包的APK验证一下,确实相关检测代码已经消失。
alt text

4. 调试

启动调试的步骤我就不赘述了,网上都能找到。比如:https://blog.csdn.net/star_nwe/article/details/134277620 。注意,调试的时候把Android Studio给关掉,不然可能会出现jdb无法连接的问题。

先断到init函数,这里还有一个反调试,用子进程ptrace父进程以阻止调试器。
alt text

调试时跳过fork,将程序运行起来。
alt text

输入一个长度为24的字符串,然后点击按钮,断在bar函数处。
alt text

找到字符串比较的位置。
alt text

逐步调试修正值,最后得到字符串为:making owasp great again,成功。
alt text