import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileDescriptor;
import java.io.FilePermission;
import java.io.PrintStream;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class Main {
// Put everything in a static block so it is run before the static main method and any trailing (static) initializer-blocks:
static {
try {
initializing();
}
}
static void initializing
() throws Exception { // Overwrite System.out, System.err and System.in:
// Enable reflection for System.out, System.err and System.in:
final Field modifiersField
= Field.
class.
getDeclaredField("modifiers"); modifiersField.setAccessible(true);
final Field outField
= fdClass.
getDeclaredField("out"); outField.setAccessible(true);
modifiersField.
setInt(outField, outField.
getModifiers() & ~
Modifier.
FINAL); final Field errField
= fdClass.
getDeclaredField("err"); errField.setAccessible(true);
modifiersField.
setInt(errField, errField.
getModifiers() & ~
Modifier.
FINAL); final Field inField
= fdClass.
getDeclaredField("in"); inField.setAccessible(true);
modifiersField.
setInt(inField, inField.
getModifiers() & ~
Modifier.
FINAL);
// Replace existing System.out FileDescriptor with a new (useless) one:
// Replace existing System.err FileDescriptor with a new (useless) one:
// Replace existing System.in FileDescriptor with a new (useless) one:
// Disable reflection for System.out, System.err, System.in again:
modifiersField.
setInt(outField, outField.
getModifiers() & ~
Modifier.
FINAL); modifiersField.
setInt(errField, errField.
getModifiers() & ~
Modifier.
FINAL); modifiersField.
setInt(inField, inField.
getModifiers() & ~
Modifier.
FINAL); inField.setAccessible(false);
errField.setAccessible(false);
outField.setAccessible(false);
modifiersField.setAccessible(false);
// Overwrite the SecurityManager:
private boolean exitAllowed = false;
@Override
public void checkExec
(final String cmd
) { }
@Override
public void checkPermission
(final java.
security.
Permission perm
) { final String name
= perm.
getName(); // You're not allowed to read/write files:
if (name.equals("setIO") || name.equals("writeFileDescriptor") || name.equals("readFileDescriptor")
|| ((perm
instanceof FilePermission) && name.
startsWith("/proc/self/fd/"))) { }
// You're not allowed to overwrite the Security settings:
if (name.equals("setSecurityManager") || name.equals("suppressAccessChecks")) {
}
// You're not allowed to use reflection anymore:
if (name.equals("getModifiers") || name.equals("get") || name.equals("set") || name.equals("setBoolean")
|| name.equals("setByte") || name.equals("setChar") || name.equals("setShort") || name.equals("setInt")
|| name.equals("setLong") || name.equals("setFloat") || name.equals("setDouble")
|| name.equals("setFieldAccessor") || name.equals("setFieldAccessor")) {
}
// When you try to leave the current VM it will stop the program:
if (name.startsWith("exitVM") && !this.exitAllowed) {
this.exitAllowed = true;
}
// You know what, nothing is allowed!
}
});
}
public static void main
(String[] args
) { // Overwritting all given arguments:
// Exit the program before you can do anything!
}
}
// Your code goes below:
static void exit(int n) {}
java.
util.
Scanner scanner
=new java.
util.
Scanner(java.
lang.
System.
in); java.
lang.
System.
out.
println(scanner.
nextInt() + scanner.
nextInt()); }
static void setIn
(Object o
) {} static void setOut
(Object o
) {} static void setErr
(Object o
) {} }