Advertisement
What_Ever

Untitled

Jan 16th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.11 KB | None | 0 0
  1. static void
  2. argument_passing (struct process_args *args, void **esp_)
  3. {
  4.   void *esp = *esp_;
  5.   void *org_esp = esp;
  6.   int argc = args->argc;
  7.   char *argv_ptr[argc + 1];
  8.   for (int i = 0 ; i < argc ; i++)
  9.     {
  10.       int len = strlen (args->argv[i]);
  11.       esp -= (len + 1) * sizeof (char);
  12.       strlcpy (esp, args->argv[i], len + 1);      
  13.       argv_ptr[i] = esp;
  14.       printf ("%p\targv[%d] data\t%s\n", esp, i, (char *) esp);
  15.     }
  16.   esp -= ((int)esp % 4 + 4) % 4;
  17.   argv_ptr[argc] = NULL;
  18.   for (int i = argc ; i >= 0 ; i--)
  19.     {
  20.       esp -= sizeof (char *);
  21.       memcpy (esp, &argv_ptr[i], sizeof (char *));
  22.       printf ("%p\targv[%d] pointer\t%p\n", esp, i, *(void **)esp);
  23.     }
  24.  
  25.   memcpy (esp - sizeof(char **), &esp, sizeof (char **));
  26.   esp -= sizeof (char **);
  27.   printf ("%p\targv pointer\t%p\n", esp, *(void **)esp);
  28.   esp -= sizeof (int);
  29.   memcpy (esp, &argc, sizeof (int));
  30.   printf ("%p\targc\t\t%d\n", esp, *(int *)esp);
  31.   esp -= sizeof (int);
  32.   memset (esp, 0, sizeof (int));
  33.   printf ("%p\treturn address\t%p\n", esp, *(void **)esp);
  34.   printf ("Stack Size: %d\n", esp - org_esp);
  35. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement