0x00    引子

前段做的一个滴滴CTF的安卓题目,题目并不难,主要分享一下做题过程和思路,如有不对请表哥们指出。

0x01    要求与提示

赛题背景:本挑战结合了Android, Java, C/C++,加密算法等知识点,考察了挑战者的binary逆向技术和加密算法能力。

赛题描述:本题是一个app,请试分析app中隐藏的key,逆向加密算法并得到对应的秘钥。可以在app中尝试输入key,如果正确会显示“correct”,如果错误会显示“Wrong”。
提   示:阅读assembly code,理解xor的加密逻辑和参数,解出答案。
评分标准:key正确则可进入下一题。

Flag格式为:[email protected]

0x02 分析过程

点击test按钮后下方控件显示Wrong,上apkkiller,寻找关键位置,进行关键词搜索。

反编译源码

其中onClickTest响应TEST按钮点击
this.mFlagEntryView.getText().toString().equals(stringFromJNI())
从mFlagEntryView得到view控件内容,tostring转string型,使用equals对比stringFromJNI()返回值。

一般我们应该跟踪stringFromJNI()函数看他返回了什么值,接下来查找该函数的来源。

加载了so模块hello-libs

打开apk包寻找hello-libs.so

这个时候分析so文件获取flag就行了。

这里很简单并没有加什么混淆,直接写在so文件中,到这里就算完成这题。

0x03    另一种思路

如果这个题目的so中是经过运算加密返回的,并无法直接静态看到flag那该怎么办。

this.mFlagEntryView.getText().toString().equals(stringFromJNI())

前面我们分析过这个位置,因为使用equals进行字符串对比,看下equals的java解释:

Equals之前使用了tostring,所以如果mFlagEntryView的内容与stringFromJNI返回值相同才会出现true的情况

那么也就是说stringFromJNI是把flag返回到程序领空的,我们直接修改smil代码把flag显示在mFlagResultView中。

直接获取stringFromJNI返回值然后赋值给mFlagResultView,再安装运行即可。

坐标:杭州

技能:渗透测试、逆向分析、移动端逆向破解

求职意向:甲方  安全研究、安全测试、渗透测试、逆向研究、

求大表哥带走~~~

DDCTF-Normal.zip (1.0 MB) 下载附件
源链接

Hacking more

...