Advertisement
Guest User

dlcall

a guest
Nov 25th, 2012
11
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 0.90 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <dlfcn.h>
  5.  
  6. char*
  7. parse_arg( char* string )
  8. {
  9.     if(!strncmp( string, "(int)", 5 ))
  10.     {
  11.         if(!strncmp( string+5, "0x", 2 ))
  12.             return (char*)strtol( string+7, NULL, 16 );
  13.         else
  14.             return (char*)atoi( string );
  15.     }
  16.     else
  17.         return string;
  18. }
  19.  
  20. int
  21. main(int argc,char **argv)
  22. {
  23.     FILE* dll;
  24.     void* (*sym)();
  25.  
  26.     int i, j;
  27.     int ret = -1;
  28.  
  29.     if(!argv[1])
  30.         return 1;
  31.  
  32.     dll = dlopen( "libc.so.6", RTLD_GLOBAL | RTLD_NOW);
  33.     sym = dlsym( dll, argv[1] );
  34.  
  35.     for(i = 0;i < argc - 2;i++)
  36.         argv[i + 2] = parse_arg( argv[i + 2] );
  37.  
  38.     for(i = 0,j = 0;i < argc - 2;i++, j += 4)
  39.         //printf("movl %p, (%%esp,%d)\n", (parse_arg(argv[i + 2])), (j) );
  40.         asm("movl %0, (%%esp,%1)" : :"r"(argv[i + 2]), "r"(j) );
  41.  
  42.     asm("call *%0" : :"r"(sym));
  43.     asm("movl %%eax,%0" :"=r"(ret));
  44.  
  45.     printf("ret: %d ( 0x%08x )\n", ret, ret );
  46.  
  47.     return 0;
  48. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement