Advertisement
Guest User

Untitled

a guest
Oct 15th, 2017
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.95 KB | None | 0 0
  1. #define _GNU_SOURCE
  2.  
  3. #include <sys/syscall.h>
  4. #include <unistd.h>
  5. #include <errno.h>
  6. #include <sched.h>
  7. #include <signal.h>
  8. #include <stdarg.h>
  9. #include <stdbool.h>
  10. #include <stdio.h>
  11. #include <sys/prctl.h>
  12. #include <sys/resource.h>
  13. #include <sys/time.h>
  14. #include <sys/wait.h>
  15.  
  16. __attribute__((noreturn)) static void doexit(int status)
  17. {
  18. volatile unsigned i;
  19. syscall(__NR_exit_group, status);
  20. for (i = 0;; i++) {
  21. }
  22. }
  23. #define NORETURN __attribute__((noreturn))
  24.  
  25. #include <stdint.h>
  26. #include <string.h>
  27.  
  28. static void loop();
  29.  
  30. static void sandbox_common()
  31. {
  32. prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0);
  33. setpgrp();
  34. setsid();
  35.  
  36. struct rlimit rlim;
  37. rlim.rlim_cur = rlim.rlim_max = 128 << 20;
  38. setrlimit(RLIMIT_AS, &rlim);
  39. rlim.rlim_cur = rlim.rlim_max = 8 << 20;
  40. setrlimit(RLIMIT_MEMLOCK, &rlim);
  41. rlim.rlim_cur = rlim.rlim_max = 1 << 20;
  42. setrlimit(RLIMIT_FSIZE, &rlim);
  43. rlim.rlim_cur = rlim.rlim_max = 1 << 20;
  44. setrlimit(RLIMIT_STACK, &rlim);
  45. rlim.rlim_cur = rlim.rlim_max = 0;
  46. setrlimit(RLIMIT_CORE, &rlim);
  47.  
  48. unshare(CLONE_NEWNS);
  49. unshare(CLONE_NEWIPC);
  50. unshare(CLONE_IO);
  51. }
  52.  
  53. static int do_sandbox_none(int executor_pid, bool enable_tun)
  54. {
  55. int pid = fork();
  56. if (pid)
  57. return pid;
  58.  
  59. sandbox_common();
  60.  
  61. loop();
  62. doexit(1);
  63. }
  64.  
  65. #ifndef __NR_bpf
  66. #define __NR_bpf 321
  67. #endif
  68.  
  69. long r[9];
  70. void loop()
  71. {
  72. memset(r, -1, sizeof(r));
  73. r[0] = syscall(__NR_mmap, 0x20000000ul, 0xa34000ul, 0x3ul, 0x32ul, 0xfffffffffffffffful, 0x0ul);
  74. *(uint32_t*)0x20038000 = (uint32_t)0xe;
  75. *(uint32_t*)0x20038004 = (uint32_t)0x4;
  76. *(uint32_t*)0x20038008 = (uint32_t)0x4;
  77. *(uint32_t*)0x2003800c = (uint32_t)0x80009;
  78. *(uint32_t*)0x20038010 = (uint32_t)0x0;
  79. *(uint32_t*)0x20038014 = (uint32_t)0x0;
  80. *(uint32_t*)0x20038018 = (uint32_t)0x0;
  81. r[8] = syscall(__NR_bpf, 0x0ul, 0x20038000ul, 0x1cul);
  82. }
  83.  
  84. int main()
  85. {
  86. int pid = do_sandbox_none(0, false);
  87. int status = 0;
  88. while (waitpid(pid, &status, __WALL) != pid) {}
  89. return 0;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement