Эксплойт по переполнению стека в C - PullRequest
8 голосов
/ 13 ноября 2008

Вопрос на самом деле о переполнении стека в 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?

Ответы [ 3 ]

8 голосов
/ 13 ноября 2008

Я, наверное, не должен делать твою домашнюю работу за тебя. Но в основном:

Вам нужно получить символьный буфер где-то в памяти для хранения строки, которую вы хотите выполнить. Очевидно, что вы можете сделать это так же, как и другие вызываемые функции (т.е. вы также помещаете текст в стек). После того, как вы это написали, вам нужно записать указатель на него в стек в том месте, где функция shell_code ожидает найти свои аргументы.

Лучший способ понять это без того, чтобы я выполнил всю работу за вас, - это записать содержимое стека / памяти на листе бумаги / доске. Запишите, как бы это выглядело, если бы вы обычно вызывали shell_code изнутри программы. Затем запишите, как выглядит стек внутри victum_func, и выясните, какие вещи нужно изменить, чтобы он выглядел «естественно» (конечно, имея в виду, что некоторые вещи «не заботятся» как адрес возврата).

Это все, что ты собираешься получить от меня сегодня! : -Р

2 голосов
/ 15 ноября 2008

SoapBox уже проделал большую работу, направив вас в правильном направлении.

Для получения дополнительной информации; http://www.skullsecurity.org/wiki/index.php/Example_4

1 голос
/ 15 ноября 2008

Вам нужно манипулировать стековым фреймом вызывающей стороны (main()) и расположить его таким образом, чтобы при возврате к shell_call() из эпилога переполненного victim_func() последний мог найти сложенный стек это было вызвано главным.

При этом вам, вероятно, придется манипулировать указателем кадра в стеке кадра жертвы, который будет восстановлен в% ebp с помощью leave.

...