美文网首页
DDCTF安卓题-writeup

DDCTF安卓题-writeup

作者: dad9 | 来源:发表于2017-06-29 14:27 被阅读0次

    0x01引子

    前段做了一个滴滴CTF的其中一道安卓题目,题目并不难,主要分享一下做题过程和思路。

    apk下载地址
    http://download.csdn.net/detail/dad9988/9887419

    题目包

    0x02要求与提示

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

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

    Flag格式为DDCTF-XXXXXXXXXXXX@didichuxing.com

    还是很好辨认的

    0x02分析与过程

    运行app后

    直接点击下方的TEST按钮显示Wrong
    上apkkiller
    找到关键位置,进行关键词搜索(搜Wrong)。

    appkiller找到关键位置

    反编译源码(appkiller上点击java图标)

    关键位置源码

    这里直接贴上来代码

    public class MainActivity
      extends AppCompatActivity
    {
      private TextView mFlagEntryView;
      private TextView mFlagResultView;
      
      static
      {
        System.loadLibrary("hello-libs");
      }
      
      public void onClickTest(View paramView)
      {
        if (this.mFlagEntryView.getText().toString().equals(stringFromJNI())) {
          this.mFlagResultView.setText("Correct");
        }
        for (;;)
        {
          return;
          this.mFlagResultView.setText("Wrong");
        }
      }
      
      protected void onCreate(Bundle paramBundle)
      {
        super.onCreate(paramBundle);
        setContentView(2130968602);
        this.mFlagEntryView = ((TextView)findViewById(2131427413));
        this.mFlagResultView = ((TextView)findViewById(2131427415));
      }
      
      public native String stringFromJNI();
    }
    

    其中onClickTest响应TEST按钮点击

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

    从mFlagEntryView得到view控件内容,tostring转string型,使用equals对比stringFromJNI()返回值。

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

    static
    {
    System.loadLibrary("hello-libs");
    }

    加载了so模块hello-libs

    7zip打开apk

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

    so文件拖入IDA

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

    0x04另一种思路

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

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

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

    equals解释

    Equals之前使用了tostring,所以如果mFlagEntryView的内容与stringFromJNI返回值相同才会出现true的情况,那么也就是说stringFromJNI是把flag返回到程序领空的,我们直接修改smil代码把flag显示在mFlagResultView中。

    直接修改smail语句实现flag显示在view中 直接修改smail语句实现flag显示在view中

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


    打包运行效果

    首发在先知社区,搬运到这里,稍微做了一些细节修改。

    相关文章

      网友评论

          本文标题:DDCTF安卓题-writeup

          本文链接:https://www.haomeiwen.com/subject/yommcxtx.html