Вопрос на самом деле о переполнении стека в 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, такие как ps и т. Д., Запуская только программу.
Я рассчитывал написать указатель EBI с шестнадцатеричным представлением ps и установить для него список аргументов shell_call
, но это не сработало. Я также попытался ввести argsv
аргументы и установить список аргументов shell_call
равным arg_list
основного, но тоже не сработало.
Я думаю, что вторая версия должна работать, но я полагаю, что я неправильно устанавливаю список аргументов нового фрейма стека (я сделал это, написав a[8]
в 0
, так как это первая часть функции указатель и запись a[9]=736c
и a[10]=0000
, но, вероятно, это неправильно, так как это параметры victim_func
. Так как мне получить доступ к параметрам shell_call
?