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

最新文章

  1. Spring MVC注解入门
  2. MongoDB 维护Replica Set
  3. 如何在linux Shell脚本里面把一个数组传递到awk内部进行处理
  4. IEnumerable 和 IEnumerator
  5. 【转】 Linux chmod命令
  6. Eclipse中Ant的配置与测试 转
  7. XML解析器(TinyXML)的使用指南
  8. 树莓派高级GPIO库,wiringpi2 for python使用笔记(一)安装
  9. iOS 使用SBJSON创建和解析JSON
  10. K2 BPM项目 基于COM组件调用SAP RFC 问题
  11. 网络叠加模式VLAN、VxLAN、GRE
  12. Vue组件模板形式实现对象数组数据循环为树形结构
  13. 多元线性回归(Multivariate Linear Regression)简单应用
  14. node.js(小案例)_实现学生信息增删改
  15. Mysql 的远程设置 和链接方式
  16. 探讨JS合并两个数组的方法
  17. 使用Twitter异常检测框架遇到的坑
  18. 卸载linux系统上自带的mysql
  19. css有缝隙
  20. SQL Server 存储过程,带事务的存储过程(创建存储过程,删除存储过程,修改存储过

热门文章

  1. 推荐7款用于PHP的代码调试工具,太有用了!
  2. 一个扩展搜索API的优化过程
  3. 通过设置iis在局域网中访问网页
  4. 841. 字符串哈希(hash)
  5. bfs(队列模板)
  6. AcWing 10. 有依赖的背包问题
  7. 题解【AcWing91】最短Hamilton路径
  8. try_except_finally
  9. PHP程序员应该如何提升
  10. detach() 使用和.detach()和.data的区别 、cpu()函数的作用