攻防世界题解easyjava

好无聊啊,找个CTF做做,攻防世界有一栏Mobile的 正好适合

下载文件地址:

https://adworld.xctf.org.cn/media/task/attachments/3f06e60ded5e44e3b0f4c47020cbcb3c.apk

分析

使用jadx工具 反编译查看代码,先看看App 的oncreate方法

有一个if判断,判断正确 返回You are right 否则 返回 Your are wrong! Bye~

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

大致意思是 传入了一个值,然后在b方法中调用 ,返回的结果转为bool类型,那么就是说这里的返回值要求为1 才能进入if判断

看一下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
public static Boolean b(String str) { // 传入一个String类型
if (!str.startsWith("flag{")) { // 判断是否以flag{ 开始
return false;
}
if (!str.endsWith("}")) { // 判断是否以} 结尾
return false;
}
String substring = str.substring(5, str.length() - 1); // 去除 flag{ 和} 之后的结果保存到substring中
b bVar = new b(2); // 这里我单独拉出来了 运行了一下,得到了结果
a aVar = new a(3);
// 这里就讲bvar 和aVar 写成明文
String bVar = "ctf.demo.b@1540e19d";
String aVar = "ctf.demo.a@1540e19d";
// 分析for循环
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++;
}
}
return Boolean.valueOf(sb.toString().equals("wigwrkaugala"));
}

bVar: ctf.demo.b@1540e19d

aVar: ctf.demo.a@1540e19d

通过加注释获得了了解到整个流程

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
flag{zdgd}
-----------------------
b->abcdefghijklmnopqrstuvwxyz
b.a(String str) ->z
Integer.valueOf(b.indexOf(str))->25
a->[17, 23, 7, 22, 1, 16, 6, 9, 21, 0, 15, 5, 10, 18, 2, 24, 4, 11, 3, 14, 19, 12, 20, 13, 8, 25] 因为每次判断都是长度减一 所以当判断25次就结束了 第一次给z 循环判断失败。i等于0
b: i ->0
a.a a(Integer num)->0 将i 传入 aVar.a(i)
a: a(Integer num) -> [21, 4, 24, 25, 20, 5, 15, 9, 17, 6, 13, 3, 18, 12, 10, 19, 0, 22, 2, 11, 23, 1, 8, 7, 14, 16] 寻找0的位置 在第16次找到
a:a ->[21, 4, 24, 25, 20, 5, 15, 9, 17, 6, 13, 3, 18, 12, 10, 19, 0, 22, 2, 11, 23, 1, 8, 7, 14, 16]
num2 ->16 a类中的b 是个固定的。所以最后得到的第16位就是q
b->abcdefghijklmnopqrstuvwxyz
b.charAt(num2.intValue())->q
-----------------------
b->bcdefghijklmnopqrstuvwxyza
b.a(String str) ->d
Integer.valueOf(b.indexOf(str))2
a->[23, 7, 22, 1, 16, 6, 9, 21, 0, 15, 5, 10, 18, 2, 24, 4, 11, 3, 14, 19, 12, 20, 13, 8, 25, 17]
a.get(i2)->13
b: i ->13
a.a a(Integer num)->13
a: a(Integer num) -> [21, 4, 24, 25, 20, 5, 15, 9, 17, 6, 13, 3, 18, 12, 10, 19, 0, 22, 2, 11, 23, 1, 8, 7, 14, 16]
a:a ->[21, 4, 24, 25, 20, 5, 15, 9, 17, 6, 13, 3, 18, 12, 10, 19, 0, 22, 2, 11, 23, 1, 8, 7, 14, 16]
num2 ->10
b->abcdefghijklmnopqrstuvwxyz
b.charAt(num2.intValue())->k
-----------------------
b->cdefghijklmnopqrstuvwxyzab
b.a(String str) ->g
Integer.valueOf(b.indexOf(str))4
a->[7, 22, 1, 16, 6, 9, 21, 0, 15, 5, 10, 18, 2, 24, 4, 11, 3, 14, 19, 12, 20, 13, 8, 25, 17, 23]
a.get(i2)->14
b: i ->14
a.a a(Integer num)->14
a: a(Integer num) -> [21, 4, 24, 25, 20, 5, 15, 9, 17, 6, 13, 3, 18, 12, 10, 19, 0, 22, 2, 11, 23, 1, 8, 7, 14, 16]
a:a ->[21, 4, 24, 25, 20, 5, 15, 9, 17, 6, 13, 3, 18, 12, 10, 19, 0, 22, 2, 11, 23, 1, 8, 7, 14, 16]
num2 ->24
b->abcdefghijklmnopqrstuvwxyz
b.charAt(num2.intValue())->y
-----------------------
b->defghijklmnopqrstuvwxyzabc
b.a(String str) ->d
Integer.valueOf(b.indexOf(str))0
a->[22, 1, 16, 6, 9, 21, 0, 15, 5, 10, 18, 2, 24, 4, 11, 3, 14, 19, 12, 20, 13, 8, 25, 17, 23, 7]
a.get(i2)->6
b: i ->6
a.a a(Integer num)->6
a: a(Integer num) -> [21, 4, 24, 25, 20, 5, 15, 9, 17, 6, 13, 3, 18, 12, 10, 19, 0, 22, 2, 11, 23, 1, 8, 7, 14, 16]
a:a ->[21, 4, 24, 25, 20, 5, 15, 9, 17, 6, 13, 3, 18, 12, 10, 19, 0, 22, 2, 11, 23, 1, 8, 7, 14, 16]
num2 ->9
b->abcdefghijklmnopqrstuvwxyz
b.charAt(num2.intValue())->j
qkyj

所以逆推的方式:

​ 第一次 b = “abcdefghijklmnopqrstuvwxyz”; 之后每次都会做一次循环左移操作

​ 第一次b 对应的序列[17, 23, 7, 22, 1, 16, 6, 9, 21, 0, 15, 5, 10, 18, 2, 24, 4, 11, 3, 14, 19, 12, 20, 13, 8, 25] 之后每次进行一次循环左移

  1. 获得wigwrkaugala每一位在字母表中的位置

    比如 w 在字符表中的位置是22,

  2. 然后在a类中的a函数获取每一位位置对应的数num

    然后在[21, 4, 24, 25, 20, 5, 15, 9, 17, 6, 13, 3, 18, 12, 10, 19, 0, 22, 2, 11, 23, 1, 8, 7, 14, 16] 找到22对应的数, 为8

  3. 之后将获得的数num找到a序列中第num位对应的数字

    8 找到对应的数为 21

    [17, 23, 7, 22, 1, 16, 6, 9, 21, 0, 15, 5, 10, 18, 2, 24, 4, 11, 3, 14, 19, 12, 20, 13, 8, 25]

  4. 将拿到后的数字在b字符串中寻找对应的数,

    然后在 abcdefghijklmnopqrstuvwxyz 找到21 对应的数字为 v

脚本

逻辑理清了 接下来写脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

b = "abcdefghijklmnopqrstuvwxyz"
result = "wigwrkaugala"
La = [21, 4, 24, 25, 20, 5, 15, 9, 17, 6, 13, 3, 18, 12, 10, 19, 0, 22, 2, 11, 23, 1, 8, 7, 14, 16]
Lb = [17, 23, 7, 22, 1, 16, 6, 9, 21, 0, 15, 5, 10, 18, 2, 24, 4, 11, 3, 14, 19, 12, 20, 13, 8, 25]

str1 = []
flag = ""
for i in result:
str1.append(La[b.index(i)])

print(str1)

for i in str1:
str2 = Lb[i]
flag += b[str2]
b = b[1:]+ b[:1]
Lb.insert(len(Lb), Lb[0])
Lb.remove(Lb[0])
print(flag)

[8, 17, 15, 8, 22, 13, 21, 23, 15, 21, 3, 21]
venividivkcr

备注: 脚本 参考 西瓜西米露表姐。

相关文章
评论
分享
  • scrapy 框架学习

    入坑scrapy在自己学习了一段时间爬虫之后(其实也就是了解了下爬虫),我就迫不及待的想学习心得东西了。 今天就入手scrapy框架 官方文档 安装安装上基本没啥大问题,缺啥补啥就行 这里我选择使用Python虚拟环境virtuale...

    scrapy 框架学习
  • 某app加密算法分析

    Hey, password is required here. a7fbab8565cf6bbb84f5578e356b215e1a835de7a145bd926381e35cc45256f4...

    某app加密算法分析
  • jni函数hook

    jni函数hook(计算 地址方式)12345678910111213141516171819202122232425262728293031323334353637function hookTest9() { Jav...

    jni函数hook
  • Hook jni 主动调用

    Hook jni 主动调用要对hellofromc 进行主动调用,修改返回值,但是这里不能直接通过replace去修改返回值,而是要通过newstringutf 去修改返回值。 1234567891011121314151617181...

    Hook jni 主动调用
  • Hook 计算非导出函数地址

    hook 读写内存数据对string字符串,可能是加密的,可以通过直接hook 加载的内存数据来读取解密状态的字符串 123456789读取内存字符串数据function hookTest7() { var soAdd...

    Hook 计算非导出函数地址
  • Hook 获取指针参数的返回值

    Hook 获取指针参数的返回值在c语言中,一般都会以指针传递返回的值 ,没有return 或者return为true hook sub_750 打印参数和输出 12345678910111213141516171819functio...

    Hook 获取指针参数的返回值
  • Hook dlopen

    hook dlopen在刚开始hook 我们必须使得app加载so 才能hook, 我们可以hookdlopen 获取到so在那加载,在高版本中有一些so会走android_dlopen_ext 1234567891011121314...

    Hook dlopen
  • Hook 导出函数和修改函数参数返回值

    Hook 导出函数123456789101112131415161718192021222324252627282930// hook 导出函数function hookTest1() { var addAddr =...

    Hook 导出函数和修改函数参数返回值
  • Hook so 导入导出表

    hook so 导入导出表启动frida打开两个cmd 窗口 12345第一个cmd窗口adb shellsucd /data/local/tmp./fx // 这个是frida-server-12.8.14-android-x86...

    Hook so 导入导出表
  • Hook Java层通杀

    Hook 通杀Hook 普通方法和修改函数参数返回值fradaserver 是手机端的, android低版本 frida 尽量低版本 fridaserver版本要与frida库版本一致 不同平台用不同fridaserver 不要和...

    Hook Java层通杀
Please check the comment setting in config.yml of hexo-theme-Annie!