【攻防世界】Moblie系列之easy-java

【攻防世界】Mobile系列之easy-java

反编译后获取源代码,下面一行代码为app判断语句

1
if (MainActivity.b(((EditText) ((MainActivity) this).findViewById(R.id.edit)).getText().toString()).booleanValue()

这里调用b()对输入框字符串进行检验,继续跟进b(),代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private static char a(String str, b bVar, a aVar) {
return aVar.a(bVar.a(str));
}

public static Boolean b(String str) {
if (!str.startsWith("flag{")) {
return false;
}//检查前缀
if (!str.endsWith("}")) {
return false;
}//检查后缀
String substring = str.substring(5, str.length() - 1);//截取字符串[5,lebgth()-1]长度字符串
b bVar = new b(2);
a aVar = new a(3);
//这两行调用了b()和a()
StringBuilder sb = new StringBuilder();
int i = 0;
for (int i2 = 0; i2 < substring.length(); i2++) {
sb.append(a(substring.charAt(i2) + "", bVar, aVar));
Integer valueOf = Integer.valueOf(bVar.b().intValue() / 25);
if (valueOf.intValue() > i && valueOf.intValue() >= 1) {
i++;
}
}
//对输入字符串经过一系列处理后与"wigwrkaugala"作对比
return Boolean.valueOf(sb.toString().equals("wigwrkaugala"));
}

上面的代码我们可以确定密码形式应该为”flag{ }”,我们先来跟进a()和b()的代码逻辑,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
public class b {
public static ArrayList<Integer> a = new ArrayList<>();
static String b = "abcdefghijklmnopqrstuvwxyz";
static Integer d = 0;
Integer[] c = {8, 25, 17, 23, 7, 22, 1, 16, 6, 9, 21, 0, 15, 5, 10, 18, 2, 24, 4, 11, 3, 14, 19, 12, 20, 13};//c.length()为28

public b(Integer num) {
for (int intValue = num.intValue(); intValue < this.c.length; intValue++) {
a.add(this.c[intValue]);//循环往列表a中添加键值对
}
for (int i = 0; i < num.intValue(); i++) {
a.add(this.c[i]);//循环往a中添加键值对
}
}

public static void a() {
int intValue = a.get(0).intValue();//intvalue=8
a.remove(0);//删除列表中索引为0
a.add(Integer.valueOf(intValue));//列表a加上8
b += "" + b.charAt(0);//b="abcdefghijklmnopqrstuvwxyza"
b = b.substring(1, 27);//b="bcdefghijklmnopqrstuvwxyza"
Integer num = d;
d = Integer.valueOf(d.intValue() + 1); //d=1
}//

public Integer a(String str) {
int i = 0;
if (b.contains(str.toLowerCase())) {//判断b中是否存在小写的str字符串
Integer valueOf = Integer.valueOf(b.indexOf(str));
for (int i2 = 0; i2 < a.size() - 1; i2++) {
if (a.get(i2) == valueOf) {
i = Integer.valueOf(i2);
}
}
} else {
i = str.contains(" ") ? -10 : -1;
}
a();
return i;
}

public Integer b() {
return d;
}
}


public class a {
public static ArrayList<Integer> a = new ArrayList<>();
static String b = "abcdefghijklmnopqrstuvwxyz";
static Integer d = 0;
Integer[] c = {7, 14, 16, 21, 4, 24, 25, 20, 5, 15, 9, 17, 6, 13, 3, 18, 12, 10, 19, 0, 22, 2, 11, 23, 1, 8};

public a(Integer num) {
for (int intValue = num.intValue(); intValue < this.c.length; intValue++) {
a.add(this.c[intValue]);
}
for (int i = 0; i < num.intValue(); i++) {
a.add(this.c[i]);
}
}

public static void a() {
Integer num = d;
d = Integer.valueOf(d.intValue() + 1);
if (d.intValue() == 25) {
int intValue = a.get(0).intValue();
a.remove(0);
a.add(Integer.valueOf(intValue));
d = 0;
}
}

public char a(Integer num) {
Integer num2 = 0;
if (num.intValue() == -10) {
a();
return " ".charAt(0);
}
for (int i = 0; i < a.size() - 1; i++) {
if (a.get(i) == num) {
num2 = Integer.valueOf(i);
}
}
a();
return b.charAt(num2.intValue());
}
}

a和b这两个类的构造函数是对各自的列表重新进行变化得到新的列表

我们来总结下正向计算步骤:

  • 主代码调用:调用b.a(str),在调用a.a(str)
  • 将MainActivity.a()循环多次后得到字符串”wigwrkaugala”

逆向分析

  • 先对a.a(str)逆向反推,再对b.a(str)逆向反推

a.a的逆向分析代码如下

1
2
3
4
public int re_a(char args)
{
return (int) a.a.get(a.b.indexOf(args));
}

b.a的逆向代码如下

1
2
3
4
5
public char re_a(int args)
{
char c = b.b.charAt(b.a.get(args));
return c;
}

逆向代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class app_java {
public static void main(String[] args)
{
b b1 = new b;
a a1 = new a(3);
String enflag = "wigwrkaugala";
String flag = "";
for(int i=0;i<enflag.length();i++)
{
flag += b1.re_a(a1.re_a(enflag.charAt(i)));
}
System.out.println(flag);
}
}

得到如下字符串

1
venividivkcr

加上”flag{}”则为”flag{venividivkcr}”

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

让我给大家分享喜悦吧!

微信