+ Reply to Thread
Results 1 to 1 of 1

Thread: Exploit Development Course [Additional Materials]: More space on the stack (Перевод: klaus)

  1. #1
    klaus's Avatar

    Default Exploit Development Course [Additional Materials]: More space on the stack (Перевод: klaus)

    Источник: expdev-kiuhnm.rhcloud.com

    More space on the stack


    Если вы не можете получить рабочий эксплойт из-за странной ошибки, по причине которой падает ваша программа внутри fread, или же другой ошибки доступа, это может быть вызвано недостатком места в стеке для полезной нагрузки (payload). Наиболее легким способом решить данную проблему будет изменения кода с:

    Code:
    #include <cstdio>
     
    int main() {
        <содержание функции main>
    }
    на:

    Code:
    #include <cstdio>
     
    _declspec(noinline) int old_main() {
        <contents of main>
    }
     
    int main() {
        char moreStack[10000];
        for (int i = 0; i < sizeof(moreStack); ++i)
            moreStack[i] = i;
     
        return old_main();
    }
    К примеру, данный код:

    Code:
    #include <cstdio>
     
    int main() {
        char name[32];
        printf("Reading name from file...\n");
     
        FILE *f = fopen("c:\\name.dat", "rb");
        if (!f)
            return -1;
        fseek(f, 0L, SEEK_END);
        long bytes = ftell(f);
        fseek(f, 0L, SEEK_SET);
        fread(name, 1, bytes, f);
        name[bytes] = '\0';
        fclose(f);
     
        printf("Hi, %s!\n", name);
        return 0;
    }
    примет следующий вид:

    Code:
    #include <cstdio>
     
    _declspec(noinline) int old_main() {
        char name[32];
        printf("Reading name from file...\n");
     
        FILE *f = fopen("c:\\name.dat", "rb");
        if (!f)
            return -1;
        fseek(f, 0L, SEEK_END);
        long bytes = ftell(f);
        fseek(f, 0L, SEEK_SET);
        fread(name, 1, bytes, f);
        name[bytes] = '\0';
        fclose(f);
     
        printf("Hi, %s!\n", name);
        return 0;
    }
     
    int main() {
        char moreStack[10000];
        for (int i = 0; i < sizeof(moreStack); ++i)
            moreStack[i] = i;
     
        return old_main();
    }
    Переменная стека moreStack даст нам больше места в стеке. Помните, что стек растет от высших адресов к низшим, где функция fread записывает данные по направлению к высшим адресам. Без этого дополнительного места в стеке, функция fread может достигнуть конца и прекратить выполнение программы с ошибкой.

    Как всегда, используйте свою голову. Иногда, вам нужно что бы функция fread() дошла к концу стека и возбудила исключение ради эксплойта типа SEH based exploit. Важный момент – всегда существует достаточно памяти в стеке для вашего payload. Если вам надо больше памяти, чувствуйте себя свободно и измените размер переменной moreStack.

    В функции main цикл «for» нужен, иначе moreStack будет оптимизирован и мы не достигнем нашей цели. Также, если f встраиваемая функция, буфер name будет выделен после moreStack (т.е. по направлению конца стека) что теряет весь смысл. Во избежание этого нам надо использовать _declspec(noinline).

    Изображение должно всё прояснить:



    © Translated by klaus (r0 Crew)
    Last edited by klaus; 26-06-2015 at 09:39.
    Do not follow the ancient masters, seek what they sought. (c) Matsuo Bashō

  2. 7 пользователя(ей) сказали cпасибо:
    Darwin (26-06-2015) Patrick (26-06-2015) benedict (27-06-2015) dukeBarman (25-06-2015) gavz (05-03-2016) root (25-06-2015) ximera (25-06-2015)
+ Reply to Thread

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
All times are GMT. The time now is 01:26
vBulletin® Copyright ©2000 - 2018
www.reverse4you.org