本文主要是介绍CTF逆向 re1-e7e4ad1a.apk,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在这里分析一下2016ctf的一道逆向题,apk包:re1-e7e4ad1a.apk。
首先使用adb将apk文件发送到真机模拟器中(模拟器根据自己,也可以使用电脑上的模拟器,这里我使用的是真机模拟器)。界面如下:
从这个APP的界面可以看到需要输入编号和密码,然后单击sign。在这里我们要做的就是寻找到这个编号和密码。
使用jeb打开re1-e7e4ad1a.apk文件,看一下整体的结构不是很乱
在这里看到了onCreate,光标移到此处,点击q键查看C代码,
在这里发现两个按钮,分别是sign和exit。点开b可以看到一个非常关键的判断语句:
可以看到前半句是来判断编号的,后半句是来判断密码的。那么就先看看前半句:
(Seclreg.c(this.a).equals(this.a.getResources().getString(2131034119)))
可以看到getString的值为2131034119,将其转换为十六进制为7f050007,然后在public.xml中找到7f050007,可以看到username,然后在string.xml中找到username,这样我们就找到了编号。
找到了编号就继续分析后半句:
(Seclreg.f(this.a).getpl(Seclreg.e(this.a), Seclreg.d(this.a))))
这里可以看到getpl,找到它发现了native,
看到这里就应该知道这里需要分析so文件
将在jeb里看到的so文件拖到ida进行静态分析:
在窗口exports可以看到我们想要找的getpl,双击进去,转换成C代码发现了关键函数getpl
双击进去查看。因为我们的目的是找到最终的flag,所以不需要每条代码都进行分析,只要找到关键的语句就可以,一般情况都会在最后,果然在最后面可以看到:
这就是关键的判断语句。首先可以看到if ( v11 == 39 )语句,很明显就是告诉我们密码的长度是39位,这里需要修改判断语句将其改为相反的结果。往下看可以看到一个比较函数,将p1和s2进行比较,s2是我们需要输入的密码,那么p1就是我们需要找到的flag了。
回到汇编图形窗口,找到这个关键代码:
在00007FEE处找到了关键代码,BNE代表的是不为0 跳转,与之相对应的是BEQ,两个相对应的机器码分别是D1和D0,
下面要进行ida动态调试:
首先启动android_server,命令:
adb devices
adb push android_server的目录 /data/local/tmp/android_server
adb shell
我在操作的时候遇到了一些错误,大家自己操作时多多注意就好了。
然后重新打开一个cmd进行端口转发:adb forward tcp:23946 tcp:23946
在真机模拟器中打开APP,将要调试的so文件载入ida选择Debugger---Remote ARMLinux/Android debugger 单击OK即可。
Debugger-->Attach to process找到com.ssctf.seclreg,点击OK即可。
下面需要确定断点的位置,偏移地址是7CEC,要需要找到基地址就可以了edit---segments---rebase program即可找到基地址EEE1F000。所以需要下断点的位置就是EEE1F000+7CEC =EEE26CEC ,快捷键G跳转转EEE26CEC ,下断点,然后运行:
然后需要在真机模拟器中填写正确的编号,随便写一个密码,点击sign,程序就会运行到这里,然后我们要找到前面分析过的重要的一个跳转:
找到后点击View--Open subviews--Hex dump,利用F2将D0改为D1,保存即可。
下断点,点击运行进行调试:
在hex view中右键点击Synchronize with选择R0,然后单步调试就可以看到flag了。也看到了前面分析过的P1。
Flag
就是:SSCTF{oty3eaP
$g986iwhw32j%OJ)g0o7J.CG:}
这篇关于CTF逆向 re1-e7e4ad1a.apk的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!