fork(2) download
  1. import java.io.ByteArrayInputStream;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.FileDescriptor;
  4. import java.io.FilePermission;
  5. import java.io.PrintStream;
  6. import java.lang.reflect.Field;
  7. import java.lang.reflect.Modifier;
  8.  
  9. public class Main {
  10.  
  11. // Put everything in a static block so it is run before the static main method and any trailing (static) initializer-blocks:
  12. static {
  13. try {
  14. initializing();
  15. } catch (final Exception e) {
  16. }
  17. }
  18.  
  19. static void initializing() throws Exception {
  20. // Overwrite System.out, System.err and System.in:
  21. System.setIn(new ByteArrayInputStream(new byte[0]));
  22.  
  23. // Enable reflection for System.out, System.err and System.in:
  24. final Field modifiersField = Field.class.getDeclaredField("modifiers");
  25. modifiersField.setAccessible(true);
  26. final Class<?> fdClass = java.io.FileDescriptor.class;
  27. final Field outField = fdClass.getDeclaredField("out");
  28. outField.setAccessible(true);
  29. modifiersField.setInt(outField, outField.getModifiers() & ~Modifier.FINAL);
  30. final Field errField = fdClass.getDeclaredField("err");
  31. errField.setAccessible(true);
  32. modifiersField.setInt(errField, errField.getModifiers() & ~Modifier.FINAL);
  33. final Field inField = fdClass.getDeclaredField("in");
  34. inField.setAccessible(true);
  35. modifiersField.setInt(inField, inField.getModifiers() & ~Modifier.FINAL);
  36.  
  37. // Replace existing System.out FileDescriptor with a new (useless) one:
  38. outField.set(null, new FileDescriptor());
  39. // Replace existing System.err FileDescriptor with a new (useless) one:
  40. errField.set(null, new FileDescriptor());
  41. // Replace existing System.in FileDescriptor with a new (useless) one:
  42. inField.set(null, new FileDescriptor());
  43.  
  44. // Disable reflection for System.out, System.err, System.in again:
  45. modifiersField.setInt(outField, outField.getModifiers() & ~Modifier.FINAL);
  46. modifiersField.setInt(errField, errField.getModifiers() & ~Modifier.FINAL);
  47. modifiersField.setInt(inField, inField.getModifiers() & ~Modifier.FINAL);
  48. inField.setAccessible(false);
  49. errField.setAccessible(false);
  50. outField.setAccessible(false);
  51. modifiersField.setAccessible(false);
  52.  
  53. // Overwrite the SecurityManager:
  54. System.setSecurityManager(new SecurityManager() {
  55.  
  56. private boolean exitAllowed = false;
  57.  
  58. @Override
  59. public void checkExec(final String cmd) {
  60. throw new SecurityException();
  61. }
  62.  
  63. @Override
  64. public void checkPermission(final java.security.Permission perm) {
  65. final String name = perm.getName();
  66. // You're not allowed to read/write files:
  67. if (name.equals("setIO") || name.equals("writeFileDescriptor") || name.equals("readFileDescriptor")
  68. || ((perm instanceof FilePermission) && name.startsWith("/proc/self/fd/"))) {
  69. throw new SecurityException();
  70. }
  71. // You're not allowed to overwrite the Security settings:
  72. if (name.equals("setSecurityManager") || name.equals("suppressAccessChecks")) {
  73. throw new SecurityException();
  74. }
  75. // You're not allowed to use reflection anymore:
  76. if (name.equals("getModifiers") || name.equals("get") || name.equals("set") || name.equals("setBoolean")
  77. || name.equals("setByte") || name.equals("setChar") || name.equals("setShort") || name.equals("setInt")
  78. || name.equals("setLong") || name.equals("setFloat") || name.equals("setDouble")
  79. || name.equals("setFieldAccessor") || name.equals("setFieldAccessor")) {
  80. throw new SecurityException();
  81. }
  82. // When you try to leave the current VM it will stop the program:
  83. if (name.startsWith("exitVM") && !this.exitAllowed) {
  84. this.exitAllowed = true;
  85. System.exit(0);
  86. }
  87.  
  88. // You know what, nothing is allowed!
  89. throw new SecurityException("Mhuahahahaha!");
  90. }
  91. });
  92. }
  93.  
  94. public static void main(String[] args) {
  95. // Overwritting all given arguments:
  96. args = new String[0];
  97.  
  98. // Exit the program before you can do anything!
  99. System.exit(0);
  100. }
  101. }
  102.  
  103. // Your code goes below:
Runtime error #stdin #stdout 0.06s 711680KB
stdin
1
2
stdout
Standard output is empty