Эксплойт по переполнению стека в C

Вопрос на самом деле о переполнении стека в C. У меня есть предположение, что я не могу сделать это ради своей жизни, я посмотрел на все в GDB и просто не могу понять это.

Вопрос в следующем:

int i,n;

void confused()
{
    printf("who called me");
    exit(0);
}

void shell_call(char *c)
{
    printf(" ***Now calling \"%s\" shell command *** \n",c);
    system(c);
    exit(0);
}

void victim_func()
{
    int a[4];
    printf("[8]:%x\n", &a[8]);
    printf("Enter n: "); scanf("%d",&n);
    printf("Enter %d HEX Values \n",n);
    for(i=0;i<n;i++) scanf("%x",&a[i]);
    printf("Done reading junk numbers\n");
}

int main()
{
    printf("ls=736c --- ps = 7370 --- cal = 6c6163\n");
    printf("location of confused %x \n", confused);
    printf("location of shell_call %x \n", shell_call);
    victim_func();
    printf("Done, thank you\n");

}

Итак, мне удалось правильно получить первый вопрос, который заключается в произвольном вызове одной из двух функций, которые не были явно вызваны в основном пути. Кстати, это должно быть сделано во время работы программы без каких-либо изменений. Я сделал это, запустив программу, установивN в7, который доставляет меня к указателю функцииvictim_func кадр я пишуa[7] с адресом памяти спутать илиshell_callи это работает. (У меня есть 64-битная машина, поэтому я должен получить ее до 7, поскольку указатель EBI имеет ширину 2 дюйма, а не 1)

Мой вопрос заключается в следующем, как я могу контролировать, какой аргумент передаетсяshell_code несильно? то есть. как мне написатьstring вchar* c, Весь смысл в выполнении команд Unix, таких какп.с. и т. д., запустив только программу.

Я решил написать указатель EBI с шестнадцатеричным представлениемп.с. и установка списка аргументовshell_call к этому, но это не сработало. Я также попытался ввестиargsv аргументы и установка списка аргументовshell_call кarg_list основного, но тоже не сработало.

Я думаю, что вторая версия должна работать, но я полагаю, что я неправильно устанавливаю список аргументов нового фрейма стека (я сделал это, написавa[8] в0, поскольку его первая часть указатель функции, и написаниеa[9]=736c а такжеa[10]=0000, но это, вероятно, не правильно, так как это параметрыvictim_func, Так как мне получить доступ к параметрамshell_call?

Ответы на вопрос(3)

Ваш ответ на вопрос