2021 D3CTF |Reverse | No Name


2021 D3CTF |Reverse | No Name

在群里看到有同学问这个题目,本身mobile逆向学的稀烂,通过这道题识图开天辟地!

也提到了JAVA反射

出题者曰:题⽬使⽤ Java 的反射特性,运⾏时把⽤来混淆做题者的验证接口替换为真实验证代码。验证相关代码被 通过 AES 加密存放在 assets ⾥,运⾏时从 native 中获取密钥解密。 native 中存在反调试,但看了 writeup 才反应过来,直接写⼀个 app 调⽤⼀下获取 KEY 的函数就可以解密了, native ⾥⾯的反调试, 防 patch 根本没什么作⽤。解密出来代码⾮常简单,就是抑或⼀下

我们来看什么是JAVA反射特性:

一个例子:

通过这种方式,当我们需要访问其他类的时候,不需要改动源码,利用反射,直接修改配置文件即可。

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
public class FileDemo {

public static void main(String[] args) throws Exception {

Class aClass = Class.forName(getValue("className"));

Method m = aClass.getMethod(getValue("methodName"));

m.invoke(aClass.getConstructor().newInstance());

}


//这个方法用于接收配置文件中与key所对应的value值
public static String getValue(String key) throws Exception {

Properties pro = new Properties(); //获取配置文件的对象

FileReader reader = new FileReader("prop.txt");
pro.load(reader); //将流加载到配置文件对象中
//从输入流中读取属性列表(键和元素对)。通过对指定的文件(比如说上面的 prop.txt 文件)进行装载来获取该文件中的所有键 - 值对。以供 getProperty ( String key) 来搜索。

reader.close();

return pro.getProperty(key);//用指定的键在此属性列表中搜索属性。也就是通过参数 key ,得到 key 所对应的 value。
}

}
//prop.txt文件中的内容
className=fanshe.file.Apple
methodName=taste
//Apple类
public class Apple {

public void taste() {
System.out.println("苹果真好吃啊...");
}

}
//输出:
苹果真好吃啊...

首先定位主函数:
image-20241120221441387

这里有一个明显的函数:
image-20241120221922464

是AESimage-20241120221938414

首先查看extends Application的类会发现有一个非常明显的AES解密data.enc并且保存为/data/user/0/com.d3ctf.noname/data.jar文件,同时将FlagCheckermFlagChecker变量赋值为com.d3ctf.noname.A类的实例。

image-20241120224138608


文章作者: W3nL0u
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 W3nL0u !
  目录