zoukankan      html  css  js  c++  java
  • Jarvis OJ

    Jarvis OJ - 爬楼梯 -Writeup

    本来是想逆一下算法的,后来在学长的指导下发现可以直接修改关键函数,这个题做完有种四两拨千斤的感觉,记录在这里

    转载请标明出处:http://www.cnblogs.com/WangAoBo/p/7222012.html

    题目:

    分析:

    先看apk的外部特征,在模拟器中安装apk,如下:

    每次点击爬一层楼按钮以爬的楼层会加1,爬到了,看FLAG按钮点击无效,于是猜测需要爬到指定的楼层才可以看到flag。

    首先大致浏览apk的java代码(这里使用的是dex2jar+jd-jui的方法),代码的命名和逻辑都很清晰,MainActivity的代码如下:

    package com.ctf.test.ctf_100;
    
    import android.os.Bundle;
    import android.os.Debug;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import java.util.Random;
    
    public class MainActivity
      extends AppCompatActivity
    {
      public int has_gone_int;
      public int to_reach_int;
      
      static
      {
        if (!Debug.isDebuggerConnected()) {
          System.loadLibrary("ctf");
        }
      }
      
      public void Btn_up_onclick(View paramView)
      {
        this.has_gone_int += 1;
        paramView = "" + this.has_gone_int;
        ((TextView)findViewById(2131492948)).setText(paramView);
        if (this.to_reach_int <= this.has_gone_int) {
          ((Button)findViewById(2131492950)).setClickable(true);#第一个setClickable
        }
      }
      
      public void btn2_onclick(View paramView)
      {
        ((TextView)findViewById(2131492951)).setText("{Flag:" + get_flag(this.to_reach_int) + "}");
      }
      
      public native String get_flag(int paramInt);
      
      protected void onCreate(Bundle paramBundle)
      {
        super.onCreate(paramBundle);
        setContentView(2130968601);
        ((Button)findViewById(2131492950)).setClickable(false);#第二个setClickable
        this.has_gone_int = 0;
        paramBundle = new Random();
        for (this.to_reach_int = paramBundle.nextInt();; this.to_reach_int = paramBundle.nextInt())
        {
          if (this.to_reach_int < 0) {
            this.to_reach_int *= -1;
          }
          if (5 < this.to_reach_int)
          {
            this.to_reach_int %= 32;
            this.to_reach_int *= 16384;
            ((TextView)findViewById(2131492947)).setText("" + this.to_reach_int);
            ((TextView)findViewById(2131492951)).setText("");
            return;
          }
        }
      }
    }

    可以看到有这样一段:

    结合之前的分析,可以推测该段代码的作用即为当以爬的楼层(has_gone_int)大于要爬的楼层(to_reach_int)时,设置爬到了,看FLAG按钮的属性为可以点击的(setClickable),于此对应的还有:

    于是我们可以设想修改setClickable的属性永为ture,这样就不用管以爬的楼层(has_gone_int)是否大于了要爬的楼层(to_reach_int)

    步骤:

    先用APKTOOL BOX反编译apk:

    打开反编译后的文件夹,删除整个unknown文件夹(听学长说这个和之后生成apk之后的签名有关),在CFF100CFF100smalicomctf estctf_100中找到MainActivity.smali,即为MainActivity函数的smali

    smali之于java就如同汇编之于C语言,因此我们只需要修改smali就可以修改app

    用记事本打开,搜索关键字setClickable,找到了两处,刚好和java代码中的两处对应:

    对比两处,推测V5和V3即为true或false的标记位,第一张图中的v3又永为0x1,因此只需要修改v5为1,找到V5的定义部分,修改其为0x1

    保存,整个文件夹拖到APKTOOL BOX中,回编译APK

    安装APK,会发现修改已经完成了,无论楼层是多少都可以直接拿到flag

    于是flag即为268796A5E68A25A1

    需要先卸载没修改的程序才能安装修改后的程序,否则会报错

    附一片smali的学习连接http://blog.csdn.net/u012573920/article/details/44034397

  • 相关阅读:
    基于微软平台IIS/ASP.NET开发的大型网站
    谈谈用ASP.NET开发的大型网站有哪些架构方式(成本)
    微软Expression Blend基础教程系列
    Silverlight类库介绍FJCore
    Blend基础数据绑定
    Windows Embedded 版 Silverlight “Cashmere”
    Blend基础动画
    Blend基础控件与用户控件
    Silverlight 4 新特性归纳整理
    SQL经典短小代码收集
  • 原文地址:https://www.cnblogs.com/WangAoBo/p/7222012.html
Copyright © 2011-2022 走看看