【攻防世界】Moblie系列之基础android

【攻防世界】Mobile系列之基础android

反编译后在MainActivity中找到对密码进行验证的代码如下

1
2
3
4
5
6
7
8
if (new Check().checkPassword(MainActivity.this.passWord.getText().toString())) {
Toast.makeText(MainActivity.this, "Good,Please go on!", 0).show();
MainActivity.this.startActivity(new Intent(MainActivity.this, MainActivity2.class));
MainActivity.this.finish();
return;
}
Toast.makeText(MainActivity.this, "Failed", 0).show();

这里调用check().checkpassword()对输入的字符串进行验证,继续跟踪checkPassword()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.example.test.ctf02;

public class Check {
public boolean checkPassword(String str) {
char[] pass = str.toCharArray();//字符数组
if (pass.length != 12) {
return false;
}
//字符串长度为12
for (int len = 0; len < pass.length; len++) {
pass[len] = (char) (((255 - len) - 100) - pass[len]);
if (pass[len] != '0' || len >= 12) {
return false;
}
}
return true;
}
}

该函数定义了输入字符串长度为12,关键一行代码是”pass[len] = (char) (((255 - len) - 100) - pass[len]);“,对字符串转换后的字符数组进行变换后使得全为”0”。由此我们可以反推回去计算出原来的字符串,代码如下

1
2
3
4
pass_array= []
for i in range(0,12):
pass_array.append(chr(107-i))
print(''.join(pass_array))

得到**kjihgfedcba`**,验证成功后进行下一个界面要求输入图片显示码

我们来继续观察源代码,这里的代码逻辑应当为

1
2
3
4
5
6
7
 MainActivity.this.startActivity(new Intent(MainActivity.this, MainActivity2.class));
MainActivity.this.finish();//使用Intent来进行两个组件之间的交互,这里跳转到了MainActivity2组件

public void onClick(View v) {
MainActivity2.this.sendBroadcast(new Intent(MainActivity2.this.editText.getText().toString()));
}
//输入的字符串作为intent的内容进行广播发送

由上面的代码逻辑可以得出输入的字符串作为Inten的内容进行广播发送,接下来我们就要去AndroidManifest.xml文件中找广播接收器Recevier,如下

1
2
3
4
5
<receiver android:name="com.example.test.ctf02.GetAndChange" android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="android.is.very.fun"/>
</intent-filter>
</receiver>

可以得到这里的android.is.very.fun,输入后可得到flag{08067-wlecome}

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2024 John Doe
  • 访问人数: | 浏览次数:

让我给大家分享喜悦吧!

微信