bugku-re-safebox


先模拟器打开软件查看界面,只有一个地方可以输入,其他地方应该是点不了。输入很多次都是停止运行
1.png

jeb打开先看mainactivility。
看代码,在判断flag=1的时候可输出flag。
2.png

Integer.parseInt(((EditText)this.findViewById(0x7F0B0056)).getText().toString()这句其实就是接受那个输入框接受输入的值在转成int类型,把接受到的这个变量改成input。改写全局的变量

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
public void onClick(View v) {
if(Integer.parseInt(((EditText)this.findViewById(0x7F0B0056)).getText().toString()) > 10000000 && Integer.parseInt(((EditText)this.findViewById(0x7F0B0056)).getText().toString()) < 0x5F5E0FF) { // id:editText
int t = 1;
int t1 = 10000000;
int flag = 1;
if(Math.abs(Integer.parseInt(((EditText)this.findViewById(0x7F0B0056)).getText().toString()) / 1000 % 100 - 36) == 3 && Integer.parseInt(((EditText)this.findViewById(0x7F0B0056)).getText().toString()) % 1000 % 584 == 0) { // id:editText
int j;
for(j = 0; j < 4; ++j) {
if(Integer.parseInt(((EditText)this.findViewById(0x7F0B0056)).getText().toString()) / t % 10 != Integer.parseInt(((EditText)this.findViewById(0x7F0B0056)).getText().toString()) / t1 % 10) { // id:editText
flag = 0;
break;
}

t *= 10;
t1 /= 10;
}

if(flag == 1) {
((EditText)this.findViewById(0x7F0B0056)).setText("NJCTF{" + ((char)(Integer.parseInt(((EditText)this.findViewById(0x7F0B0056)).getText().toString()) / 1000000)) + ((char)(Integer.parseInt(((EditText)this.findViewById(0x7F0B0056)).getText().toString()) / 10000 % 100)) + ((char)(Integer.parseInt(((EditText)this.findViewById(0x7F0B0056)).getText().toString()) / 100 % 100)) + "f4n}"); // id:editText
}
}
}
}



简化代码变成下面这样,方便分析。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 public void onClick(View v) {
if(input > 10000000 && input < 99999999) {
int t = 1;
int t1 = 10000000;
int flag = 1;
if(Math.abs(input / 1000 % 100 - 36) == 3 && input % 1000 % 584 == 0) {
int j;
for(j = 0; j < 4; ++j) {
if(input / t % 10 != input / t1 % 10) {
flag = 0;
break;
}

t *= 10;
t1 /= 10;
}

if(flag == 1) {
input.setText("NJCTF{" + ((char)(input / 1000000)) + ((char)(input / 10000 % 100)) + ((char)(input / 100 % 100)) + "f4n}");
}
}
}
}

可以根据java代码写出python暴力爆破脚本。
3.png

1
2
3
4
5
6
7
8
9
10
11
12
for i in range(10000000,99999999):
t=1;t1 = 10000000;flag = 1
if(abs(i / 1000 % 100 - 36) == 3 and (i % 1000) % 584 == 0):
for j in range(0,4):
if ((i / t) % 10 != (i / t1) % 10):
flag = 0
break
t *= 10
t1 /= 10
if(flag == 1):
print(i)
print("NJCTF{" + chr(int(i / 1000000)) + chr(int(i / 10000 % 100)) + chr(int(i / 100 % 100)) + "f4n}")

提交答案。是错误的…..看到别的androidtest类和mainactivity代码相似。

mainfest里可以看到有两个activity,多个Activity可以显示多个不同的界面,setContentView就是设置一个Activity的显示界面,使用setContentView可以在Activity中动态切换显示的View,这样,不需要多个Activity就可以显示不同的界面。
4.png

可以看到明显的调用id值
5.png

public.xml找到id对应的资源
6.png

在到layout文件夹里找到build.xml和activity_main.xml。010editor打开比较两个文件差异,发现相同。
7.png

在线diff一下,看一下两个类有什么不同
8.png

再根据之前diff的mainactivity和androidtest的不同,写一个androidtest类的脚本。
跑出flag,提交正确

和之前的区别的话,就是内层的循环次数由4改为了3。还有最后的输出的chr的改变。
9.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
for i in range(10000000,99999999):
t = 1
t1 = 10000000
flag = 1
if(abs(((i / 1000) % 100) - 36) == 3 and (i % 1000) % 584 == 0):
for j in range(0,3):
if((i / t) % 10) != ((i / t1) % 10):
flag=0
break
t *= 10
t1 /= 10
if(flag == 1):
print(i)
print("NJCTF{have" + chr(i / 1000000) + chr(i / 10000 % 100) + chr(i / 100 % 100 + 10) + "f4n}")

改为python2,并且把i的值改为正好输出的前一位,方便调试。
以下值均满足第一个if条件但48533584可满足flag=1。

1
2
3
4
5
6
48533584

40033000
40033584
40039000
40039584

10.png