Jarvis OJ - 爬楼梯 -Writeup

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之后的签名有关),在CFF100\CFF100\smali\com\ctf\test\ctf_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.youkuaiyun.com/u012573920/article/details/44034397

 

转载于:https://www.cnblogs.com/WangAoBo/p/7222012.html

### 关于BBUCTF和AFCTF2018的相关信息 在网络安全竞赛领域,CTF(Capture The Flag)是一种非常受欢迎的比赛形式[^2]。对于寻找特定比赛如BBUCTF或AFCTF2018的题目及其解题报告(writeup),可以通过一些公开资源来获取相关内容。 #### 资源推荐 以下是几个可能包含这些比赛题目及写入的内容的网站: 1. **CTFTime**: 这是一个汇集了大量CTF赛事信息的平台,其中包括许多比赛的成绩排名以及参赛者分享的技术文章链接。虽然该站点主要侧重于国际性的大型活动,但也有可能找到关于BBUCTF或者AFCTF2018的信息[^5]。 ```plaintext https://ctftime.org/ ``` 2. **CTF Wiki**: 提供了一个综合性的指南页面,涵盖了从基础概念到高级技巧的各种主题,并且经常会有社区成员贡献最新的挑战解析资料。 ```plaintext https://ctf-wiki.github.io/ctf-wiki/#/introduction ``` 3. **Jarvis OJ Platform 和 XCTF 实训平台**: 它们提供了丰富的练习环境与过往知名赛事的真实案例重现功能,有助于熟悉不同类型的CTF赛题风格[^4]。 - Jarvis OJ Platform: ```plaintext https://www.jarvisoj.com ``` - XCTF实训平台: ```plaintext http://oj.xctf.org.cn ``` 4. **Bugku CTF**: 此外还有像Bugku这样的国内热门在线平台也会不定期更新各类经典CTF赛题集锦及相关解答思路说明文档。 ```plaintext http://ctf.bugku.com/login ``` 如果上述渠道未能满足需求,则建议尝试搜索引擎输入关键词组合例如 `"BBUCTF writeups"` 或 `"AFCTF 2018 solutions"` 来进一步挖掘潜在线索;同时留意各大社交网络论坛比如Reddit、Twitter上活跃的安全研究群体动态也可能带来意想不到收获! --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值