bugku rev1(xman) WP
用JEB查看MainActivity
的onCreate
函数。首先创建了一个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:比较v5
与A
的元素是否相等。
case 4:比较v4
与v7
是否相等,相等的话将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
的值通过case1
、case2
和case5
都会发生改变。
我们看一下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),也就是执行8个case1
相当于对你的输入进行计数,如果你的输入长度为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相关推荐
- bugku 杂项 图穷匕见 wp
bugku 杂项 图穷匕见 wp 1.可能是因为自己比较菜,这题我看别人的wp都看了半天才做出来,中间一些弯路也就不说了,就直接说一下重点.下载后是一张图片 2.看到图的第一眼我想到的是,左边肯定还有 ...
- bugku msic 答案wp
bugku msic 答案wp 前言 May you be happy. wp 1.下载附件之后,获得一个文件,使用010Editor打开之后,发现是jpg格式. 2.修改之后,打开图片,发现左下角有 ...
- Bugku 密室逃脱 WP
一.打开题目 二.解压文件夹,查看文件和压缩包,发现压缩包进行了加密 三.查看剧本,发现摩斯密码,并解析得到电脑密码:xjpc 四.输入电脑密码得到一张图片和一个压缩包,查看图片发现图片位置发生错误, ...
- BugKu——snowfall的WP
这题实在是太复杂了,所以特地写了一个WP记录一下我的思路,同时给没思路的小伙伴一点参考. 参考文章: https://blog.csdn.net/weixin_45696568/article/det ...
- 一些bugku的题目wp
题目来源 bugku WEB 成绩单 传送门 手注 类sql注入题目. 直接查询可以查询到id=3. 1' order by 1# 1' order by 2# 到id=5时无返回数据,可以得知有四个 ...
- Bugku Misc 清凉一夏 wp
题目 wp 下载之后得到一个二维码,扫码之后,获得如下内容: 先留着,之后会用到. 查看图片,使用010Editor打开图片,发现里面隐藏着压缩包. 打开kali,使用binwalk分离图片,得到一个 ...
- Bugku-杂项部分题目WP
前言 一个新手学习CTFer的成长之路必定要通过大量的刷题,下面是bugku部分题目wp Bugku-MISC-论剑 把图片放进010发现有一串二进制先转ASCII码获得一个关键词,但不知道是什么东西 ...
- bugku web wp
写在前面: 简单步骤不再复现,只是再复习一下知识点,可以挖深一点. web2 F12 计算器 F12改html $get $post ? & hackbar 矛盾 很多解法 1加一个符号就行了 ...
- BugKu ——WP(MISC[二])
BugKu --MISC部分 [0] 工具: ①Winhex:图片隐写工具,可通过搜索"ctf""CTF""key""flag&q ...
- bugku web题 33-40 wp
md5 collision 要求input a,题目提示很清楚了. 利用php的特性: PHP在处理哈希字符串时,会利用"!="或"=="来对哈希值进行比较,它 ...
最新文章
- python元编程_Python 元编程
- 【HDU - 1412】 {A} + {B} (STL + set)
- Javascript 自定义输出
- simuvex 符号分析形象解释
- pyRedis - 操作指南:增/删/改/查、管道与发布订阅功能
- 【机器学习、神经网络】拟合非线性函数y = x**2 - 2(部分问题未解决)
- 怎么用计算机输出手机的密码,手机连接wifi后怎么看密码?手机连接wifi后看密码的方法-太平洋IT百科...
- 最牛比的NBIOT芯片MDM9206
- 透视分析和即席查询区别
- Centos7 Google输入法安装
- 《畅玩NAS》家庭 NAS 服务器搭建方案
- 最强蜗牛换了手机找不到服务器,最强蜗牛怎么转服?更换服务器方法与条件说明[多图]...
- 使用Telnet 命令行发信
- windows2003通过iis配置ftp服务器
- netcat工具简单使用
- 知识体系:如何构建自己的知识体系
- K-Means聚类实验报告实例
- 基于嵌入式的密码访问的门锁系统
- msi微星绝影2 GS66怎么样?测评值得买吗?详细性能点评
- 成都工程师职称评审,职称评审流程!
热门文章
- AMCL代码详解(二)位姿初始化
- unity简单2D动画制作!
- 软考中级-数据库系统工程师复习知识点汇总
- lstm不收敛_LSTM学习笔记
- php实现wav转mp3,求,用PHP实现MP3转WAV后生成波形图的方法
- float及float浮动坍塌问题
- php oa系统 缺点,PHPOA:被低估的OA自动化系统
- esp32 支持 sd卡 micropython 文件系统_ESP32/ESP8266 MicroPython教程:将文件上传到文件系统...
- tlwr842n服务器无响应,TL-WR842n无线路由器掉线解决方法汇总
- Handsontable使用教程 含授权码LicenseKey