Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <stdbool.h>
- #include <stdlib.h>
- #define ROUND_DOWN(X, STEP) ((X) / (STEP) * (STEP))
- size_t
- strlcpy (char *dst, const char *src, size_t size)
- {
- size_t src_len;
- src_len = strlen (src);
- if (size > 0)
- {
- size_t dst_len = size - 1;
- if (src_len < dst_len)
- dst_len = src_len;
- memcpy (dst, src, dst_len);
- dst[dst_len] = '\0';
- }
- return src_len;
- }
- // assume that arguments can't exceed 128 bytes//
- bool load_argument_to_stack (const char *file_name, void **esp){
- if (sizeof(file_name) > 128) return false;
- void *pointers[128];
- int arg_count = 0;
- char *parsedString = (char *)malloc(strlen(file_name)+1);
- strlcpy(parsedString, file_name,strlen(file_name));
- char *token;
- char *rest = parsedString;
- while ((token = strtok_r(rest, " ", &rest)))
- {
- int size_token = strlen(token)+1;
- printf("size_token %d\n",size_token);
- *esp -=size_token;
- printf("*esp = %x\n", *esp);
- int i;
- for (i = 0; i < size_token; i++) {
- //pushing tokens
- printf("char %d\n",token[i]);
- void *temp = *esp + i;
- //*((char *)temp) = token[i];
- }
- pointers[arg_count] = *esp;
- arg_count++;
- }
- //pushing word alignment
- void *temp = *esp;
- ROUND_DOWN((unsigned int)*esp,4);
- memset(*esp,0,(temp - *esp));
- printf("*esp after ROUND_DOWN = %x\n", *esp);
- //pushing null character
- *esp -= sizeof(char *);
- memset(*esp, 0 , 4);
- printf("*esp after NULL = %x\n", *esp);
- //pushing arg[i]
- int j;
- for (j = arg_count - 1; j>=0; j--) {
- *esp -= sizeof(char *);
- printf("*esp after each pointer to argument = %x\n", *esp);
- (*(unsigned int *)(*esp)) = pointers[j];
- }
- //pushing char**
- *esp -= 4;
- printf("*esp after pointer to argv = %x\n", *esp);
- (*(unsigned int *)(*esp)) = *esp + 4;
- printf("address of argv[0] = %x\n", (*(unsigned int *)(*esp)));
- //pushing arg_count
- *esp -= sizeof(int);
- printf("*esp after pointer to argc = %x\n", *esp);
- (*(unsigned int *)(*esp)) = arg_count;
- //pushing fake return address
- *esp -= 4;
- printf("*esp after pointer fake return address = %x\n", *esp);
- memset(*esp, 0 , 4);
- return true;
- }
- int main() {
- void *esp= (void*)0xc0000000;
- load_argument_to_stack("/bin/ls -l foo bar",&esp);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement