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()); } public static String getValue(String key) throws Exception { Properties pro = new Properties(); FileReader reader = new FileReader("prop.txt"); pro.load(reader); reader.close(); return pro.getProperty(key); }
}
className=fanshe.file.Apple methodName=taste
public class Apple { public void taste() { System.out.println("苹果真好吃啊..."); }
}
苹果真好吃啊...
|
首先定位主函数:
这里有一个明显的函数:
是AES
首先查看extends Application
的类会发现有一个非常明显的AES
解密data.enc
并且保存为/data/user/0/com.d3ctf.noname/data.jar
文件,同时将FlagChecker
的mFlagChecker
变量赋值为com.d3ctf.noname.A
类的实例。