Advertisement
Guest User

Untitled

a guest
Jan 20th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.83 KB | None | 0 0
  1.  
  2. static bool
  3. setup_stack (char *file_name,char **save_ptr, void **esp)
  4. {
  5. uint8_t *kpage;
  6. bool success = false;
  7.  
  8.  
  9. kpage = palloc_get_page (PAL_USER | PAL_ZERO);
  10. if (kpage != NULL)
  11. {
  12. success = install_page (((uint8_t *) PHYS_BASE) - PGSIZE, kpage, true);
  13. if (success)
  14. *esp = PHYS_BASE;
  15. else
  16. {
  17.  
  18. palloc_free_page (kpage);
  19. return success;
  20. }
  21. }
  22.  
  23. ////////////////////--------our implemention-------///////////////////////////////
  24.  
  25. char *token;
  26. char ** argv = malloc(sizeof(char *) * 1);
  27. int i;
  28. int argc = 0;
  29. int sizeof_argv = 2;
  30.  
  31. // push args to the stack
  32. for (token = file_name; token != NULL;
  33. token = strtok_r(NULL, " ", save_ptr))
  34. {
  35. *esp -= strlen (token) + 1;
  36. argv[argc] = *esp;
  37. argc ++;
  38. if (argc >= sizeof_argv)
  39. {
  40. sizeof_argv *= 2;
  41. argc = realloc (argv, sizeof_argv * sizeof(char *));
  42. }
  43. memcpy(*esp, token, strlen(token) + 1);
  44. }
  45. //null to the last parameter
  46. argv[argc] = 0;
  47. // algin to 4 bytes
  48. if ((size_t)*esp % 4)
  49. {
  50. *esp -= (size_t)*esp % 4;
  51. memcpy(*esp, &argv[argc], (size_t)*esp % 4);
  52. }
  53. memcpy(*esp, &argv[argc], sizeof(char*));
  54.  
  55. // push address of args to the stack
  56. for (i = argc-1; i > 0 ; i++)
  57. {
  58. *esp -= sizeof (char *);
  59. memcpy (*esp, argv[i], sizeof(char *));
  60. }
  61. // push argv to the stack
  62. token = *esp;
  63. esp -= sizeof(char *);
  64. memcpy(*esp, &token, sizeof(char *));
  65. // push argc to the stack
  66. *esp -= sizeof(int);
  67. memcpy(*esp, &argc, sizeof(int));
  68. // push fake return address
  69. *esp -= sizeof(void *);
  70. memcpy(*esp, &argv[argc], sizeof(void *));
  71. free(argv);
  72. ////////////////////--------our implemention-------///////////////////////////////
  73. //hex_dump (0, *esp , 64 , true);
  74.  
  75. return success;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement