JarvisOJ 逆向Writeup
1. 爬楼梯
先运行apk,查看具体的功能
爬一层楼是可以点击的,爬到了,看FLAG是不可以点击的.我们可以大致的了解到到了具体的楼层才可以看到flag,多次打开软件,楼层数目是随机的.
用APKIDE反编译后,用jd-gui查看源码
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 MainActivityextends 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; //每点击一次按钮,已经爬的楼层+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);}}public void btn2_onclick(View paramView){((TextView)findViewById(2131492951)).setText("{Flag:" + get_flag(this.to_reach_int) + "}"); //显示flag}public native String get_flag(int paramInt);protected void onCreate(Bundle paramBundle) //创建{super.onCreate(paramBundle);setContentView(2130968601);((Button)findViewById(2131492950)).setClickable(false); //设置显示flag控件按钮点击无效.也就是说刚开始我们是不能点击的,需要一定的条件. //如果我们将此处改为true,那么开始的时候就可以点击了.this.has_gone_int = 0; //设置已经爬的楼层的默认值为0paramBundle = 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;}}}
}
从源码中我们有非常多的思路来显示flag,因为APKIDE我无法回编译成功,所以用android killer来进行回编译成功了
查看smail源码,查看setclickable字符串,
const/4 v3, 0x1invoke-virtual {v0, v3}, Landroid/widget/Button;->setClickable(Z)V
invoke-virtual {v0, v5}, Landroid/widget/Button;->setClickable(Z)V
有两处调用了setClickable函数,v3和v5的分别是0x0,0x1,这就是传参中的true和false.我们把上面中的false改为true.然后就可以获得flag
FindPass
用jadx打开apk,找到主要函数
public void GetKey(View view) {String fkey = ((EditText) findViewById(R.id.editText1)).getText().toString();if (TextUtils.isEmpty(fkey.trim())) { //如果输入的字符串为空,则输出下面的话Toast.makeText(this, "请输入key值!", 1).show();return;}char[] ekey = getResources().getString(R.string.fkey).toCharArray(); //从资源中获取字符串ekeyint changdu = ekey.length; //资源中的字符串长度char[] cha = new char[1024]; //新建一个1024长度的字符数组try {new InputStreamReader(getResources().getAssets().open("src.jpg")).read(cha); //读取一张图片的数据到cha数组中} catch (Exception e) {e.printStackTrace();}for (int i = 0; i < changdu; i++) {int temp2 = cha[ekey[i]] % 10; if (i % 2 == 1) {ekey[i] = (char) (ekey[i] + temp2);} else {ekey[i] = (char) (ekey[i] - temp2);}}if (fkey.equals(new String(ekey))) {Toast.makeText(this, "恭喜您,输入正确!Flag==flag{Key}", 1).show();} else {Toast.makeText(this, "not right! lol。。。。", 1).show();}}
在这里也学到了一些新的知识,android用id定位某些资源,将这些资源都放在xml文件中.从中提取出来fkey字符串的值
我们可以看到就是用图片的字节数据和资源中的字符串进行运算就可以得到flag.一直弄不出来,后来看别人的WP,写出来了.原来是数据类型的问题.InputStreamReader函数读取8位的字节流.也就是说是byte.它的取值范围从-128~127.而python的取值范围是0~255.所以flag中有一位出现错误,总是找不出来错误原因.贴上抄别人的代码.图片资源从解压的APK中获取.
1 ekey='Tr43Fla92Ch4n93' 2 changdu =len(ekey) 3 cha =[] 4 flag='' 5 f =open('src.jpg','rb') 6 f.seek(0,0) 7 for i in range(0,1024): 8 byte = f.read(1) 9 cha.append(ord(byte)) 10 #print(cha) 11 for i in range(len(ekey)): 12 if cha[ord(ekey[i])]<128: 13 temp2 = cha[ord(ekey[i])] % 10 14 else : 15 temp2 =(-(cha[ord(ekey[i])]%128))%10 16 17 if i % 2 == 1: 18 flag +=chr(ord(ekey[i]) + temp2) 19 else: 20 flag +=chr(ord(ekey[i]) -temp2) 21 22 print(flag) 23 24 #Qv49CmZB2Df4jB-
最后运行模拟器验证,发现终于对了.
Classical Crackme
先运行查看信息,发现一个输入框,查壳.用C#写的直接去看源码
找到了关键信息,base64解密得到flag
转载于:https://www.cnblogs.com/Triomphe/p/9337029.html
JarvisOJ 逆向Writeup相关推荐
- 【UNCTF】逆向WriteUp以及出题笔记
[UNCTF]逆向WriteUp以及出题笔记 WriteUp re_checkin 反编译 babypy easyMaze ICU ezRust base_on_rust Trap ezre ezvm ...
- 西普学院逆向writeup ---------你会吗??
西普学院逆向writeup ---------你会吗?? --------跳跳龙 明天我们学校就要ctf比赛,深夜前10几分钟正好解了一道逆向题,是西普学院的,昨天,在小强的提醒下,也解了一道,今天就 ...
- [逆向][Writeup]ISG2015 flagfinder - .NET程序逆向
这个题目同样是一道.NET的逆向题,.NET的逆向方法在之前的博文中已经介绍过,这里不做重复的说明.本题的源程序可以在我的github上下载:https://github.com/gsharpsh00 ...
- Android逆向writeup,[原创]腾讯apk逆向系列WriteUp
0x00 前言 正在学习安卓逆向的萌新SR绝赞刷题中,昨天做了三道有意思的题目,感觉很适合入门,于是写了个wp发了出来 题目已上传至文章附件,想摸的dalao们可以看看( 0x01 APP1 工具:J ...
- 逆向-360逆向writeup
Crackme逆向分析 逆向第一题,很简单,分分钟能搞定.题目大致是说找一个key,提示success就行. Peid查一下没有任何壳,是vc写的程序,里面没有知名的算法.开始分析 错误的时候是这个样 ...
- Android逆向writeup,【技术分享】春秋杯逆向第一题writeup
最近被春秋杯逆向题坑了两天,记录一下解题过程. 程序一运行,就弹个控制台窗口,啥也没有,拖进IDA看了才知道,是在等待用户输入验证的key: 程序的主框架很简单,就是一运行后初始化一些数据,等待用户输 ...
- 生产力 生产关系 生产工具_我的9个最喜欢的生产力工具
生产力 生产关系 生产工具 重点 (Top highlight) From cold showers to waking up at 4 AM every day - I've done it all ...
- IceCTF 2016
WriteUp Corrupt Transmission Rotated! Blue Monday All your Base are belong to us Thor's a hacker now ...
- 社团的CTF逆向题WriteUp
最近社团弄了CTF比赛,然后我就帮忙写了逆向的题目,这里写一下WriteUp,题目和源码在附件中给出 一个简单的逆向:one_jmp_to_flag.exe 这题算是签到题,直接OD智能搜索就完事了, ...
- JavaScript逆向调试记 —— defcon threefactooorx writeup
defcon 29就这一道Web题目,说实话也没学到啥东西,唯一学到的就是勿钻牛角尖,及时调整策略. 此题严格来说算一道逆向题,只不过逆向的目标是混淆过JavaScript,我方法就是硬逆,等过几天看 ...
最新文章
- Linux-makefile
- 寻找必败态——一类博弈问题的快速解法
- mysql not null 索引_MySQL中 IS NULL、IS NOT NULL、!= 能用上索引吗?
- AFNnetworking快速教程,官方入门教程译
- 推荐:百亿级微信红包的高并发资金交易系统设计方案
- 微信小程序的版本管理
- 关于程序员职业规划的思考
- Altium Designer绘制stm32最小系统原理图
- php使用iframe框架,ThinkPHP后台首页使用iframe(框架)
- 计算机打字练习程序,一个简单的打字练习程序
- python文件操作的几种方法with open,r,w,b
- 在阿里云云虚拟主机上个人网站的Https访问配置
- 赵丽颖冯绍峰结婚官宣!深扒2人10亿商业关系:女方年入过亿,男方是乐视股东...
- 微信小程序登录服务器失败,微信小程序后台登录一直失败
- 微信小程序Canvas卡顿优化解决方法
- ps3slim安装linux,PS3 Slim配置详解 新旧款真机对比
- 3种方法实现弹幕效果
- iOS 组件化-发布组件到远程仓库
- lego-loam数据_使用lego minifigures数据集在fastai中对datablocks api图像进行分类
- MockLab:基于MockLab的第三方平台对接测试