Эксплойт по переполнению стека в 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
?