Advertisement
Madmouse

binary trolling with functional shellcode lol

Jan 30th, 2015
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.76 KB | None | 0 0
  1. // play like this lol:
  2. // $ gcc -fno-stack-protector -z execstack lol.c -o lol
  3. /////////////////////////////////////////////////////////
  4. //;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  5. //; I SPEAK TEH TRUFF
  6. //;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7. //_start:
  8. //      xor eax, eax
  9. //      mov al, 0x1
  10. //      xor rdi, rdi
  11. //      ret
  12. //
  13. //;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  14. //; decoder foo
  15. //;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  16. //_start:
  17. //      mov rcx, rsi    ; move size argument into rcx for the loop
  18. //      mov rsi, rdi    ; move the the text pointer to rsi
  19. //      xor rax, rax    ; clear out registers
  20. //      xor rdi, rdi
  21. //decode:                               ; decode text
  22. //      xor byte [rsi], 0xFF
  23. //      inc rsi
  24. //loop decode
  25. //      xor rax, rax
  26. //      ret
  27. //
  28. //;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  29. //; breakpoints huh?
  30. //;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  31. //_start:
  32. //  mov rcx, rsi    ; move size argument into rcx for the loop
  33. //  mov rsi, rdi    ; move the the text pointer to rsi for printing
  34. //  xor rax, rax    ; clear out registers
  35. //  xor rdi, rdi
  36. //scan:
  37. //  cmp byte [rsi], 0xCC ; check for break point
  38. //  je fuck_you
  39. //  inc rsi
  40. //loop scan
  41. //  xor rdi, rdi
  42. //  ret
  43. //fuck_you:
  44. //  xor rdi, rdi
  45. //  mov al, 1
  46. //  ret
  47. //
  48. //;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  49. //; decoder foo
  50. //;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  51. //;_start:
  52. //; mov rcx, rsi    ; move size argument into rcx for the loop
  53. //; mov rsi, rdi    ; move the the text pointer to rsi for printing
  54. //; xor rax, rax    ; clear out registers
  55. //; xor rdx, rdx
  56. //; xor rdi, rdi
  57. //; push rsi        ; push the text for decoder
  58. //; push rcx        ; push the size for decoder
  59. //; push rsi        ; push the text for ecoder
  60. //; push rcx        ; push the size for encoder
  61. //;decode:              ; decode text
  62. //; xor byte [rsi], 0xFF
  63. //; inc rsi
  64. //;loop decode
  65. //; pop rcx         ; pop size
  66. //; pop rsi         ; pop text
  67. //; mov al, 0x1     ; write stuff to stdout
  68. //; mov dil, al
  69. //; mov dl, cl
  70. //; syscall
  71. //; xor rax, rax
  72. //; pop rcx         ; pop size
  73. //; pop rsi         ; pop text
  74. //;encode:              ; encode text
  75. //; xor byte [rsi], 0xFF
  76. //; inc rsi
  77. //;loop encode
  78. //; ret
  79.  
  80.  
  81. typedef unsigned char by;
  82.  
  83.  
  84. main(m,k)
  85. {
  86.     // functional shellcode that takes
  87.     // encrypted shellcode and encodes / decodes it
  88.     m = \
  89.     "\x48\x89\xf1\x48\x89\xfe\x48\x31\xc0"\
  90.     "\x48\x31\xd2\x48\x31\xff\x80\x36\xff"\
  91.     "\x48\xff\xc6\xe2\xf8\xc3";
  92.  
  93.     // encrypted opaque predicate
  94.     by e[] = "\xce\x3f\x4f\xfe\xb7\xce\x00\x3c";
  95.    
  96.     // encrypted breakpoint detector    
  97.     by b[] = \
  98.     "\xb7\x76\x0e\xb7\x76\x01\xb7\xce\x3f"\
  99.     "\xb7\xce\x00\x7f\xc1\x33\x8b\xf6\xb7"\
  100.     "\x00\x39\x1d\x09\xb7\xce\x00\x3c\xb7"\
  101.     "\xce\x000\x4f\xfe\x3c";
  102.    
  103.     // encrypted string printer
  104.     k = \
  105.     "\x48\x89\xf1\x48\x89\xfe\x48\x31\xc0"\
  106.     "\x48\x31\xd2\x48\x31\xff\x56\x51\x56"\
  107.     "\x51\x80\x36\xff\x48\xff\xc6\xe2\xf8"\
  108.     "\x59\x5e\xb0\x01\x40\x88\xc7\x88\xca"\
  109.     "\x0f\x05\x48\x31\xc0\x59\x5e\x80\x36"\
  110.     "\xff\x048\xff\x0c6\xe2\xf8\x0c3";
  111.  
  112.         // decode e, check for always true, and re encode the shellcode
  113.         if(((int(*)(void*,int))m)(e,8)+((int(*)())e)()+((int(*)(void*,int))m)(e,8))
  114.         {
  115.             // encrypted message
  116.             by message[] = \
  117.             "\xb6\xdf\x8c\x8f\x9e\x9a\x94\xdf\x8b"\
  118.             "\x9a\x97\xdf\x8b\x8d\x8a\x99\x99\xf5";
  119.         // decrypt breakpoint detector
  120.         ((int(*)(void*,int))m)(b,32);
  121.         if(!((int(*)(void*,int))b)(k,18)) // check for breakpoints
  122.             // if none are found print encrypted message
  123.             ((void(*)(void*,int))k)(message,18);
  124.         }
  125.         else
  126.             puts("This NEVER happens, ever lol");
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement