Segmentation Fault

Тема в разделе "WASM.UNIX", создана пользователем fault, 12 ноя 2009.

  1. fault

    fault New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2009
    Сообщения:
    4
    Есть такая книга Разработка средств безопасности и эксплойтов.
    В ней есть тема о шел кодинге, по ходу приводятся примеры, вот с таким примером у меня возникла проблема.
    Пример выводит в поток надпись.
    Код (Text):
    1. xor eax, eax
    2.  xor ebx, ebx
    3.  xor ecx, ecx
    4.  xor edx, edx
    5.  jmp short string
    6. code:
    7.  pop ecx
    8.  mov bl, 1
    9.  mov dl, 13
    10.  mov al, 4
    11.  int 0x80
    12.  dec bl
    13.  mov al,1
    14.  int 0x80
    15. string:
    16.  call code
    17.  db "Hello world", 0x0a
    Компиляция его проходит посредством nasm и без ошибок, в книге так же приведена утилита с помощью которой это можно запустить http://www.safemode.org/files/zillion/shellcode/tools/s-proc.c.
    В процессе возникает ошибка.
    Код (Text):
    1. Calling code ...
    2. Segmentation Fault
    С ассемблером в линуксе дело не имел, но отладчик gdb этот файл не принимает.
    Эта ошибка возникает при попытке получить доступ к "чужим" участкам памяти, а вот что тут где эта попытка в упор не вижу.
    Может быть нужно изменить права файла или ошибка кода?
    Заранее спасибо
     
  2. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    fault
    Лень разбираться в твоём коде, но могу сказать точно.
    GDB позволяет такой код загрузить и отладить. эт раз.

    на скорою руку посмотрел твой код
    pop ecx
    mov bl, 1
    mov dl, 13
    mov al, 4
    мог бы хоть коменты написать
    к примеру.
    адрес Hello world вытолкнем в ecx
    в edx количество символов
    в eax код sys_call __NR_write
    в ebx указан дескриптор STDOUT_FILENO ( ЭТО проверь, так как не помню, точно ли дескриптор вывода на экрн еденица )
    после
    int 0x80
    dec bl
    mov al,1
    int 0x80

    если не ошибаюсь, надо обнулить eax ebx ecx edx =) так как в них заносятся аргументы функции для sys_call
    и как я понял, у тебя получается , что когда вызываешь exit в эту функцию передаются такие пораметры
    ebx = 0 ( первый аргумент )
    ecx = адрес строки (второй аргумент)
    edx = 13 (третий аргумент)
    а exit должен содержать только один ргумент функции..

    В последней части сообщения не уверен, давно не писал на asm в linux
     
  3. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    ище, разве db "Hello world", 0x0a
    это не 12 символов?
     
  4. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    какая архитектура x86 или x86_64 ?
    ЗЫ
    Примеры с Разработка средств безопасности и эксплойтов. работают тока ня ядре 2.4 так как в 2.6 появилась рандомизация верхушки стека и определить адрес с которого начинается шелл код практически нереально.

    Я когда читал эту книгу специально ставил слакварь 11. в ней все примеры работают на ура
     
  5. fault

    fault New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2009
    Сообщения:
    4
    А может что нибудь посоветуешь почитать, для более современных версий ядер, на эту тематику.
    Код поковыряю к вечеру, отпишусь.
     
  6. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    Исходные тексты metasploit framework =))

    немного неправильно сказал примеры в которых происходит изменение адреса возврата из функции
    (переполнение буфера , уязвимость форматной строки) не работают а язвимости переполнения кучи(heap overflow) должны нормально работать на ядре 2.6

    Именно на них я бы посоветовал обратить внимание...
     
  7. fault

    fault New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2009
    Сообщения:
    4
    Ну пытался очищать регистры перед передачей параметра безрезультатно, проблема в другом, ну вроде программа не делает ничего просто передает строку, возможно проблема в прерывании ядра?
     
  8. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    Очевдно выдает сегфот так как шел код лежит на странице памяти в которой запрещено выполнение
    Код (Text):
    1. █▓▒░ir4y@ir4y░▒▓██▓▒░ Sun Nov 15 11:59:05pm
    2. ~/ nasm fault.as                                                       23:59 :)
    3. █▓▒░ir4y@ir4y░▒▓██▓▒░ Sun Nov 15 11:59:11pm
    4. ~/ gcc lancher.c -g                                                    23:59 :)
    5. █▓▒░ir4y@ir4y░▒▓██▓▒░ Sun Nov 15 11:59:23pm
    6. ~/ gdb --args ./a.out -e fault                                         23:59 :)
    7. GNU gdb (GDB) 7.0
    8. Copyright (C) 2009 Free Software Foundation, Inc.
    9. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    10. This is free software: you are free to change and redistribute it.
    11. There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
    12. and "show warranty" for details.
    13. This GDB was configured as "x86_64-unknown-linux-gnu".
    14. For bug reporting instructions, please see:
    15. <http://www.gnu.org/software/gdb/bugs/>...
    16. Reading symbols from /home/ir4y/a.out...done.
    17. (gdb) b main
    18. Breakpoint 1 at 0x400930: file lancher.c, line 53.
    19. (gdb) r
    20. Starting program: /home/ir4y/a.out -e fault
    21.  
    22. Breakpoint 1, main (argc=3, argv=0x7fffffffe9d8) at lancher.c:53
    23. 53                                       int     m = 15; /* max # of bytes to print on one line */
    24. (gdb) n
    25. 59                                           if(argc < 3) usage(argv[0]);
    26. (gdb)
    27. 60                                               if(stat(argv[2], &sbuf)) barf("failed to stat file");
    28. (gdb)
    29. 61                                           flen = (long) sbuf.st_size;
    30. (gdb)
    31. 62                                               if(!(code = malloc(flen))) barf("failed to grab required memeory");
    32. (gdb)
    33. 63                                           if(!(fp = fopen(argv[2], "rb"))) barf("failed to open file");
    34. (gdb)
    35. 64                                               if(fread(code, 1, flen, fp) != flen) barf("failed to slurp file");
    36. (gdb)
    37. 65                                           if(fclose(fp)) barf("failed to close file");
    38. (gdb)
    39. 67                                           while ((arg = getopt (argc, argv, "e:p:")) != -1){
    40. (gdb)
    41. 68                                                 switch (arg){
    42. (gdb)
    43. 70                                               croak("Calling code ...");
    44. (gdb)
    45. Calling code ...
    46. 71                                               fptr = (void (*)(void)) code;
    47. (gdb)
    48. 72                                               (*fptr)();
    49. (gdb)
    50.  
    51. Program received signal SIGSEGV, Segmentation fault.
    52. 0x0000000000602010 in ?? ()
    53. (gdb)
    как видно при отладке сегфолт вываливается при вызове функции
     
  9. fault

    fault New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2009
    Сообщения:
    4
    Ладно, всем спасибо, надо ковырять отладчик.
     
  10. herm1t

    herm1t New Member

    Публикаций:
    0
    Регистрация:
    1 янв 2004
    Сообщения:
    22
    mprotect ?
     
  11. herm1t

    herm1t New Member

    Публикаций:
    0
    Регистрация:
    1 янв 2004
    Сообщения:
    22
    Код (Text):
    1. #include <stdint.h>
    2.  
    3. int main(int argc, char **argv)
    4. {
    5.         int h = open("1", 0);
    6.         if (h < 0)
    7.                 return 2;
    8.         int l = lseek(h, 0, 2);
    9.         if (l < 0 || lseek(h, 0, 0) != 0)
    10.                 return 2;
    11.         static uint8_t c[128];
    12.         if (read(h, c, l) != l)
    13.                 return 2;
    14.         mprotect((uint32_t)c & 0xfffff000, 4096, 5);[/b]
    15.         (*(void (*)(void))c) ();
    16. }
    17. $ ./a.out
    18. Hello world
    static тоже не просто так...
     
  12. xssww2

    xssww2 New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2009
    Сообщения:
    84
    код который работает 32/64:

    _StringDisplay:
    ;Display a string
    ;Input:
    ; eax - a string to display

    ;Save registers
    sub esp,4*3
    mov [esp],ebx
    mov [esp+4],ecx
    mov [esp+8],edx
    mov ecx,eax ;ecx points to a string
    xor edx,edx ;Initialize the string size

    ;Calculate the size of a string to display
    mov eax,4
    StrDisplay_0: cmp byte [ecx+edx],0
    lea edx,[edx+1]
    jne StrDisplay_0

    ;Display a string
    mov ebx,1 ;Standart output device
    dec edx
    int 80h

    ;Restore registers
    mov ebx,[esp]
    mov ecx,[esp+4]
    mov edx,[esp+8]
    add esp,4*3
    ret


    _StringDisplay:
    ;Display a string
    ;Input:
    ; rax - a string to display

    ;Save registers
    sub rsp,8*5
    mov [rsp],rcx
    mov [rsp+8],rdx
    mov [rsp+10h],rsi
    mov [rsp+18h],rdi
    mov [rsp+20h],r11
    mov rsi,rax ;rsi points to a string
    xor rdx,rdx ;Initialize the string size

    ;Calculate the size of a string to display
    mov rax,1
    StrDisplay_0: cmp byte [rsi+rdx],0
    lea rdx,[rdx+1]
    jne StrDisplay_0

    ;Display a string
    mov rdi,1 ;Standart output device
    syscall

    ;Restore registers
    mov rcx,[rsp]
    mov rdx,[rsp+8]
    mov rsi,[rsp+10h]
    mov rdi,[rsp+18h]
    mov r11,[rsp+20h]
    add rsp,8*5
    ret

    _ProcessExit:
    ;Exit from the program

    ;Exit process
    mov eax,1
    xor ebx,ebx ;Exit code
    int 80h

    _ProcessExit:
    ;Exit from the program

    ;Exit process
    mov rax,3ch
    xor rdi,rdi ;Exit code
    syscall
     
  13. xssww2

    xssww2 New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2009
    Сообщения:
    84
    минимальный код под fasm
    format ELF executable
    entry _Main
    segment readable writeable
    dd 0
    segment readable writeable
    dd 3 dup (?)
    segment readable executable <---- скорей всего у тя только: executable

    _Main:
    ;The main procedure

    ;Exit from the program
    call _ProcessExit
     
  14. InFlame

    InFlame New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2009
    Сообщения:
    12
    Как я понял эксплуатировать уязвимость переполнения стека или уязвимость форматной строки на ядрах 2.6 невозможно? Тогда, интересно, как обстоят дела с этими уязвимостями в современных версиях ОС FreeBSD, OpenSolaris и Windows?
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    InFlame
    Ничего ты не понял, пшёл изучать матан http://www.intel.com/products/processor/manuals/
     
  16. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    А при чем тут интеловские маны?
    Проблема не в железе, а в реализации страничной адресации в ОС
    в 2.6 ядрах она реализована безопаснее и использовать уязвимость переполнения сложнее, но это не значит что через переполнение буфера в стеке невозможно выполнить произвольный код.
    Самый простой способ запускать эксплойт много раз пока не повезет =)
    Примеры эксплойтов под 2.6 ядро есть в metasploit framework
    Так же на http://milw0rm.com/ можно поискать эксплойты и под солярку и под фрю ...
     
  17. bsnake

    bsnake New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2005
    Сообщения:
    91
  18. InFlame

    InFlame New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2009
    Сообщения:
    12
    Clerk
    Вопрос был про то, как защищены ОС, при чём тут процессоры?
    bsnake, _ir4_Y_
    спасибо!
     
  19. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    InFlame
    При том что я вижу интеловские мнемоники. Меня просто злит когда всяко нубьё лезет в сплоеты ради наживы не понимая вобще нихрена :dntknw:
     
  20. InFlame

    InFlame New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2009
    Сообщения:
    12
    Где? Я спросил всего лишь про защищённость конкретных ОС.
    Напротив, я пытаюсь изучать эти уязвимости и как работают сплоиты.