用JEB查看MainActivityonCreate函数。首先创建了一个CheckClass类的实例c,调用c.a()函数处理输入,最后判断c.check()的返回值。

this.button.setOnClickListener(new View$OnClickListener() {public void onClick(View arg4) {MainActivity.this.c = new CheckClass();MainActivity.this.c.a(MainActivity.this.text.getText().toString());if(MainActivity.this.c.check()) {MainActivity.this.textView1.setText("flag is XMAN{" + MainActivity.this.text.getText().toString() + "}");}else {MainActivity.this.textView1.setText("WORING!");}}

双击c.a()函数查看一下代码,就是将输入 一个字节一个字节的放入A数组中,没有其他的操作。

public void a(String arg5) {int v1 = 30;this.A = new byte[v1];this.B = arg5.getBytes();int v0;for(v0 = 0; v0 < arg5.length(); ++v0) {this.A[v0] = this.B[v0];}this.B = new byte[v1];
}

接下来看一下check()函数,这个函数有点长,定义了一个v0,有一个for循环,将v0传入b函数中,然后根据返回的值进行选择操作

public boolean check() {boolean v9 = false;int[] v0 = new int[]{40, 42, 65, 67, 68, 2, 0x40, 70, 0x60, 98, 0xB5, 7, 10, 0x40, 23, 17, 37, 20, 45, 91, 74, 72, 0x87, 33, 57, 43, 87, 99, 0x93, 53};byte[] v5 = new byte[]{52, 0x6F, 102, 0x71, 52, 52, 98};int v2 = 0;int v4 = 0;int v7 = 0;int v1;for(v1 = 0; v1 < v0.length; ++v1) {int v8 = this.b(v0[v1]);new String();Log.d("now array:", String.valueOf(v8));switch(v8) {case 0: {this.A[v7] = ((byte)(this.A[v7] ^ v7));break;}case 1: {if(this.A[v4] != 0) {++v4;}else {}break;}case 2: {v5[v4] = ((byte)(v5[v4] ^ v4));++v4;break;}case 3: {if(v5[v7] == this.A[v7]) {++v7;}else {}break;}case 4: {if(v7 == v4) {v9 = true;}return v9;}case 5: {if(v4 != v5.length) {v1 = v0.length - 3;}else {v4 = 0;}break;}default: {++v2;break;}}}return v9;}

switch语句中总共有6个分支,我们这个分析一下功能。

case 0:将A数组元素数组下标进行异或A数组就是输入

case 1:计数器的功能。

case 2:将:v5数组元素数组下标进行异或v5数组已经给出了,是一个长度为7的数组

case 3:比较v5A的元素是否相等。

case 4:比较v4v7是否相等,相等的话将v9置为True,v9是返回值,成功的标志。

case 5:对v4进行判断,如果等于v5的长度,那么置0,否则执行v1 = v0.length - 3;

其中v1、v4、v7可以看成i、j、k之类的,方便理解,在JEB中可以通过快捷键n来实现重命名。最终的目的是让返回值v9为True,也就是执行case4,使v4和v7相等v7的值的改变只和case3有关,v4的值通过case1case2case5都会发生改变。

我们看一下b函数b函数的作用是将数字10110101与数组中的数字进行运算,对应位置位1的时候取出数字,相加后得到的数字即为下标,范围是0~5。

public int b(int arg4) {int v0 = 0xB5 & arg4;return (v0 & 1) + ((v0 & 4) >> 2) + ((v0 & 16) >> 4) + ((v0 & 0x20) >> 5) + ((v0 & 0x80) >> 7);
}

写个脚本跑一下,看看程序是怎么运行的。

def fuc_b(arg4):v0 = 0xB5 & arg4return (v0 & 1) + ((v0 & 4) >> 2) + ((v0 & 16) >> 4) + ((v0 & 0x20) >> 5) + ((v0 & 0x80) >> 7)v0 = [40, 42, 65, 67, 68, 2, 0x40, 70, 0x60, 98, 0xB5, 7, 10, 0x40, 23, 17, 37, 20, 45, 91, 74, 72, 0x87, 33, 57, 43, 87, 99, 0x93, 53]
v1 = list(map(fuc_b, v0))
print(v1)
# 结果为[1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 5, 2, 0, 0, 3, 2, 3, 2, 3, 2, 0, 0, 3, 2, 3, 2, 3, 2, 3, 4]

首先case0是异或操作,连续两个case0相当于执行了A[v7] ^ v7 ^ v7没有改动,因为是连续的两个case0,所以v7没有变化,可以忽略掉。

然后注意到前面有8个1(忽略0),也就是执行8case1相当于对你的输入进行计数,如果你的输入长度为7的话,那么v4=7,进入到case5的时候就会重置为0

然后忽略连续的两个0,你会发现是2,3的组合,也就是说执行一次case2就会执行一次case3,也就是v4和v7是同步增加的,实际上就是判断你的输入是否等于v5[v4] ^ v4

最后解题脚本如下

flag = ''
v5 = [52, 0x6F, 102, 0x71, 52, 52, 98]
for i, v in enumerate(v5):flag += chr(v^i)
print(flag)

bugku rev1(xman) WP相关推荐

  1. bugku 杂项 图穷匕见 wp

    bugku 杂项 图穷匕见 wp 1.可能是因为自己比较菜,这题我看别人的wp都看了半天才做出来,中间一些弯路也就不说了,就直接说一下重点.下载后是一张图片 2.看到图的第一眼我想到的是,左边肯定还有 ...

  2. bugku msic 答案wp

    bugku msic 答案wp 前言 May you be happy. wp 1.下载附件之后,获得一个文件,使用010Editor打开之后,发现是jpg格式. 2.修改之后,打开图片,发现左下角有 ...

  3. Bugku 密室逃脱 WP

    一.打开题目 二.解压文件夹,查看文件和压缩包,发现压缩包进行了加密 三.查看剧本,发现摩斯密码,并解析得到电脑密码:xjpc 四.输入电脑密码得到一张图片和一个压缩包,查看图片发现图片位置发生错误, ...

  4. BugKu——snowfall的WP

    这题实在是太复杂了,所以特地写了一个WP记录一下我的思路,同时给没思路的小伙伴一点参考. 参考文章: https://blog.csdn.net/weixin_45696568/article/det ...

  5. 一些bugku的题目wp

    题目来源 bugku WEB 成绩单 传送门 手注 类sql注入题目. 直接查询可以查询到id=3. 1' order by 1# 1' order by 2# 到id=5时无返回数据,可以得知有四个 ...

  6. Bugku Misc 清凉一夏 wp

    题目 wp 下载之后得到一个二维码,扫码之后,获得如下内容: 先留着,之后会用到. 查看图片,使用010Editor打开图片,发现里面隐藏着压缩包. 打开kali,使用binwalk分离图片,得到一个 ...

  7. Bugku-杂项部分题目WP

    前言 一个新手学习CTFer的成长之路必定要通过大量的刷题,下面是bugku部分题目wp Bugku-MISC-论剑 把图片放进010发现有一串二进制先转ASCII码获得一个关键词,但不知道是什么东西 ...

  8. bugku web wp

    写在前面: 简单步骤不再复现,只是再复习一下知识点,可以挖深一点. web2 F12 计算器 F12改html $get $post ? & hackbar 矛盾 很多解法 1加一个符号就行了 ...

  9. BugKu ——WP(MISC[二])

    BugKu --MISC部分 [0] 工具: ①Winhex:图片隐写工具,可通过搜索"ctf""CTF""key""flag&q ...

  10. bugku web题 33-40 wp

    md5 collision 要求input a,题目提示很清楚了. 利用php的特性: PHP在处理哈希字符串时,会利用"!="或"=="来对哈希值进行比较,它 ...

最新文章

  1. python元编程_Python 元编程
  2. 【HDU - 1412】 {A} + {B} (STL + set)
  3. Javascript 自定义输出
  4. simuvex 符号分析形象解释
  5. pyRedis - 操作指南:增/删/改/查、管道与发布订阅功能
  6. 【机器学习、神经网络】拟合非线性函数y = x**2 - 2(部分问题未解决)
  7. 怎么用计算机输出手机的密码,手机连接wifi后怎么看密码?手机连接wifi后看密码的方法-太平洋IT百科...
  8. 最牛比的NBIOT芯片MDM9206
  9. 透视分析和即席查询区别
  10. Centos7 Google输入法安装
  11. 《畅玩NAS》家庭 NAS 服务器搭建方案
  12. 最强蜗牛换了手机找不到服务器,最强蜗牛怎么转服?更换服务器方法与条件说明[多图]...
  13. 使用Telnet 命令行发信
  14. windows2003通过iis配置ftp服务器
  15. netcat工具简单使用
  16. 知识体系:如何构建自己的知识体系
  17. K-Means聚类实验报告实例
  18. 基于嵌入式的密码访问的门锁系统
  19. msi微星绝影2 GS66怎么样?测评值得买吗?详细性能点评
  20. 成都工程师职称评审,职称评审流程!

热门文章

  1. AMCL代码详解(二)位姿初始化
  2. unity简单2D动画制作!
  3. 软考中级-数据库系统工程师复习知识点汇总
  4. lstm不收敛_LSTM学习笔记
  5. php实现wav转mp3,求,用PHP实现MP3转WAV后生成波形图的方法
  6. float及float浮动坍塌问题
  7. php oa系统 缺点,PHPOA:被低估的OA自动化系统
  8. esp32 支持 sd卡 micropython 文件系统_ESP32/ESP8266 MicroPython教程:将文件上传到文件系统...
  9. tlwr842n服务器无响应,TL-WR842n无线路由器掉线解决方法汇总
  10. Handsontable使用教程 含授权码LicenseKey