0x00 @!@#~#$
MaoXH(胡小毛)的Android逆向之路系列又来了,本次他分享了一道CTF题的逆向详细过程,希望有缘人能够有所收获~
0x01 开整~
实验环境:雷电模拟器+AndroidStudio+androidKiller+jad-gui
目标apk:
目的:获取inputflag
第一步:安装apk&&反编译
首先将111.apk安装在雷电模拟器上,并且将apk拖入androidKiller反编译(习惯性操作,没有为什么)
第二步:分析如何获取inputflag
思路:首先打开apk,发现一打开就启动了input flag页面,点击go ,弹框Failed
然后获取当前页面的activity(adb shell dumpsys activity | findstr"mFocusedActivity"),也可以借助一款工具
找到当前activity对应的smali代码,由于我是点击GO!才会有回显提示failed,说明这个获取flag应该是和点击按钮事件关联,找到点击事件onGoClick(),分析其逻辑代码:
由于smali代码看起来不太明了,其实是我太菜,看不大懂smali整体逻辑,此时不要紧,然后打开jad-gui工具反编译我们的111.apk,分析onGoClick()处的代码逻辑:
分析知道,点击的时候调用了getFlag()函数并对其加密,然后和encrypt()后的paramView(我们输入的字符)进行比较(同样加密),相等就返回true,否则返回true.
由此可知,我们只需要获取getFlag()函数结果和encrypt()处理我们输入的字符串逻辑即可反向解密获取flag.
第三步:获取getFlag()的值
然后我们打开AndroidKiller的smali语法,修改我们最后点击弹框后返回的Failed为 待获取的getFlag()值,即如图:
然后我们保存,回编译,运行app,发现成功获取到getFlag()的值,之后我们只需要理解了encrypt()函数逻辑就大功告成。
接着我通过分析查看Java代码得知encrypt()的逻辑写在so层,因此无法在smali代码再继续分析,而由于目前我还不大会使用ida对so代码分析,因此我采用另外一种方式来继续探讨,忘了说,其实getFlag()代码也放在了so文件中。
所以我打算采用动态分析来查看encrypt()的逻辑,也即手动分析下其写的逻辑,可能不成功,但这是我目前唯一的手段去获取encrypt()的逻辑。
重要:我们动态调试一定不要忘了application中的android:debuggable="true",如果没有,手动添加上。
第四步:分析encrypt()的逻辑
首先我们将反编译后的111.apk的project导入到AndroidStudio中(后面我简称为AS),然后导入插件smalidea,配置好jdk和配置mark source as 为root,以及配置远程调试端口为8700,然后打开apk,获取当前apk进程的进程号(adbshell ps),以及转发端口(adb forward tcp:8700 jdwp:2345),其中jdwp后的端口号为我们获取的进程pid,然后下断点在onGoClick()处,AS中启动调试
然后我在apk启动页面输入23456789ab来判断点击后encrypt()的逻辑,然后点击GO!,发现成功的在onGoClick()处断掉,然后我一步步调试:
由此得出encrypt()作用就是对输入的字符串的ascill码减一操作,
由此我们就可以将getFlag()的值的ascill码自增一,即可完成最终的inputflag的获取,由此终于大功告成。
0x02 一气呵成,到此结束~
MaoXH的Android逆向之路还在继续,我们继续期待下一次他的学习成果,一起加油、共勉~
往期经典推荐:
----------------------------------------------------------------------
移动安全(一)|Android设备root及神器Xposed框架安装
>>关于我们:
WhITECat安全小组隶属于起源实验室分支安全小组,主要致力于分享小组成员技术研究成果、最新的漏洞新闻、安全招聘以及其他安全相关内容。团队成员暂时由起源实验室核心成员、一线安全厂商、某研究院、漏洞盒TOP10白帽子等人员组成。
欢迎各位大佬关注^_^
本文作者:辞令_WhITECat
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/137100.html