Переполнение буфера и нулевые байты

Discussion in 'Песочница' started by shellcoder, 12 Sep 2016.

  1. shellcoder

    shellcoder New Member

    Joined:
    12 Sep 2016
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Здравствуйте, прохожу серию exploitme из Gera secure programming.

    И на 4 задании застрял.

    вот код.

    Code:
    /* stack4-stdin.c                               *
    * specially crafted to feed your brain by gera */
    
    #include <stdio.h>
    
    int main() {
        int cookie;
        char buf[80];
    
        printf("buf: %08x cookie: %08x\n", &buf, &cookie);
        gets(buf);
    
        if (cookie == 0x000d0a00)
            printf("you win!\n");
    }
    первые 3 задания решил более менее быстро. используя как вспомогательный инструмент Python.

    а на 4 задании уже не помогает вот этот код для эксплуатации.

    Code:
    python -c 'print "A"*80 + "\x00\x0d\x0a\x00"[::-1]' | ./vulnerable
    в следующем задании в 5 код не чуть не меняется...!


    Code:
    /* stack5-stdin.c                               *
    * specially crafted to feed your brain by gera */
    
    #include <stdio.h>
    
    int main() {
        int cookie;
        char buf[80];
    
        printf("buf: %08x cookie: %08x\n", &buf, &cookie);
        gets(buf);
    
        if (cookie == 0x000d0a00)
            printf("you loose!\n");
    }

    Меняется только строчка печати... Вообще решил погуглить про нулевые байты. попал на securitylab на одну статью. От туда выяснил, что это плохие байты и вообще плохое значение 0x000d0a00 по мимо нулевых байтов есть еще символ \n и \t.


    Собственно теперь вопрос. Я так понимаю автором этих заданий было так задумано, чтоб человек который будет решать эти exploitme понял, что такое значение не удастся передать перменной?

    Я правильно понимаю, что этот код нельзя заэкслуатировать? не тупо буфер переполнить и шеллкод вставить. А именно чтоб переменная cookie стала равна нужному значению.
     
  2. Diadlo

    Diadlo New Member

    Joined:
    24 Sep 2015
    Messages:
    19
    Likes Received:
    3
    Reputations:
    0
    Первая выдача в гугле
    https://oneaboperweek.wordpress.com/2010/04/19/solution-to-stack4-c/

    А вообще, нуль-байт (\0), \n, \t это вполне обычные значения: при работе с массивом как с Си-строкой \0 является признаком конца строки. \n перенос строки, \t табуляция
     
    #2 Diadlo, 12 Sep 2016
    Last edited: 12 Sep 2016
    shellcoder likes this.