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.csdn.net/u012573920/article/details/44034397

时间: 2024-08-07 18:33:28

Jarvis OJ - 爬楼梯 -Writeup的相关文章

Jarvis OJ - [XMAN]level1 - Writeup

Jarvis OJ - [XMAN]level1 - Writeup M4x原创,转载请表明出处http://www.cnblogs.com/WangAoBo/p/7594173.html 题目: 分析 checksec检查保护机制如下,NX没开,可以通过执行shellcode来get shell 拖到IDA中,查看函数的流程,vulnerable_function函数打印了缓冲区的起始地址,read可以读取0x100个字符,而buf到ret的偏移为0x88 + 0x4 < 0x100,而该el

Jarvis OJ - [XMAN]level1 - Writeup——简单shellcode利用

100分的pwn 简单查看一下,果然还是比较简单的 放到ida中查看一下,有明显的溢出函数,并且在函数中打印出了字符串的地址,并且字符串比较长,没有NX保护 所以我们很容易想到构造shellcode,在栈中执行shellcode拿shell权限 shellcode是一段恶意代码,在没有NX保护程序中,可能作为输入而写进栈,之后运行到此处时可以执行shellcode指令从而达到目的 所以我们先截取buf的地址,在buf中写入夺shell的shellcode,之后再用buf的地址覆盖函数返回地址 从

Jarvis OJ - [XMAN]level2 - Writeup

简单利用"/bin/sh"夺权 简单看一下 放到ida中发现了"/bin/sh"串,和system函数,可以利用== 所以只要在vuln函数返回时跳转到system函数,同时添加参数"/bin/sh"就可以实现啦 #!/usr/bin/env python # -*- coding: utf-8 -*- from pwn import * io = remote("pwn2.jarvisoj.com",9878) elf =

Jarvis OJ - [XMAN]level3 - Writeup——rop2libc尝试

这次除了elf程序还附带一个动态链接库 先看一下,很一般的保护 思路分析 在ida中查看,可以确定通过read函数输入buf进行溢出,但是并没有看到合适的目标函数 但是用ida打开附带的链接库,可以看到system函数和"/bin/sh"字符串都存在 于是思路就确定为read函数溢出->system函数,同时加入参数"/bin/sh" 通过libc.so文件可以得到write.system和/bin/sh的偏移,但system和/bin/sh在内存的地址是未知

Jarvis OJ - class10 -Writeup

Jarvis OJ - class10 -Writeup 转载请注明出处:http://www.cnblogs.com/WangAoBo/p/7552266.html 题目: Jarivs OJ的一道misc,记录这道题的Writeup主要是想记录解题的脚本 分析: 文件下载后是纯数据,binwalk发现为两段zlib压缩后的数据,其中第2段为default compression,这是信息1:strings查看字符串,发现IHDR, RGB, IDAT等和图像相关的字符,这是信息2: 步骤:

Jarvis OJ Pwn writeup

Jarvis OJ Pwn writeup1.[XMAN]level02.[XMAN]level13.[XMAN]level2(简单64位栈溢出)4.[XMAN]level2(x64)5.[XMAN]level3(32位下两次溢出拿shell)6.[XMAN]level3_x64(基本64位栈溢出,简单ROP)7.[XMAN]level4(DynELF泄露system地址)8.[XMAN]level5(mprotect函数)9.Test Your Memory(简单栈溢出,覆盖返回地址)10.S

Jarvis OJ - DD-Hello -Writeup

Jarvis OJ - DD-Hello -Writeup 转载请注明出处http://www.cnblogs.com/WangAoBo/p/7239216.html 题目: 分析: 第一次做这道题时,file查看发现是OS X和IOS的可执行文件,就果断放弃了 后来又一想,OS X是基于FreeBSD的,那Mach-O文件和elf应该也有相通之处,于是就尝试用IDA打开文件,居然真的打开了 函数较少,并且都可F5出伪代码,逐个分析,整理如下: 关键代码: if ( !(result & 1)

回溯解决爬楼梯问题

1.问题描写叙述 每次爬楼梯有每次可跨1,2,3步.爬上一个N阶楼梯有多少种方式,打印出每种方式. 2.源码 // ConsoleApplication6.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdio.h> #include <vector> #include <map> using namespace std; typedef std::vector<int> V

爬楼梯问题

// 爬楼梯.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h"#include<iostream>using namespace std; int main(){ int n; cin >> n; int a = 1, b = 1, k = 0; if (n == 1 || n == 0) {  cout<<1; } while (--n > 0) {  k = a + b;  b = a;  a = k;