Есть такая книга Разработка средств безопасности и эксплойтов. В ней есть тема о шел кодинге, по ходу приводятся примеры, вот с таким примером у меня возникла проблема. Пример выводит в поток надпись. Код (Text): xor eax, eax xor ebx, ebx xor ecx, ecx xor edx, edx jmp short string code: pop ecx mov bl, 1 mov dl, 13 mov al, 4 int 0x80 dec bl mov al,1 int 0x80 string: call code db "Hello world", 0x0a Компиляция его проходит посредством nasm и без ошибок, в книге так же приведена утилита с помощью которой это можно запустить http://www.safemode.org/files/zillion/shellcode/tools/s-proc.c. В процессе возникает ошибка. Код (Text): Calling code ... Segmentation Fault С ассемблером в линуксе дело не имел, но отладчик gdb этот файл не принимает. Эта ошибка возникает при попытке получить доступ к "чужим" участкам памяти, а вот что тут где эта попытка в упор не вижу. Может быть нужно изменить права файла или ошибка кода? Заранее спасибо
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
какая архитектура x86 или x86_64 ? ЗЫ Примеры с Разработка средств безопасности и эксплойтов. работают тока ня ядре 2.4 так как в 2.6 появилась рандомизация верхушки стека и определить адрес с которого начинается шелл код практически нереально. Я когда читал эту книгу специально ставил слакварь 11. в ней все примеры работают на ура
А может что нибудь посоветуешь почитать, для более современных версий ядер, на эту тематику. Код поковыряю к вечеру, отпишусь.
Исходные тексты metasploit framework =)) немного неправильно сказал примеры в которых происходит изменение адреса возврата из функции (переполнение буфера , уязвимость форматной строки) не работают а язвимости переполнения кучи(heap overflow) должны нормально работать на ядре 2.6 Именно на них я бы посоветовал обратить внимание...
Ну пытался очищать регистры перед передачей параметра безрезультатно, проблема в другом, ну вроде программа не делает ничего просто передает строку, возможно проблема в прерывании ядра?
Очевдно выдает сегфот так как шел код лежит на странице памяти в которой запрещено выполнение Код (Text): █▓▒░ir4y@ir4y░▒▓██▓▒░ Sun Nov 15 11:59:05pm ~/ nasm fault.as 23:59 :) █▓▒░ir4y@ir4y░▒▓██▓▒░ Sun Nov 15 11:59:11pm ~/ gcc lancher.c -g 23:59 :) █▓▒░ir4y@ir4y░▒▓██▓▒░ Sun Nov 15 11:59:23pm ~/ gdb --args ./a.out -e fault 23:59 :) GNU gdb (GDB) 7.0 Copyright (C) 2009 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-unknown-linux-gnu". For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>... Reading symbols from /home/ir4y/a.out...done. (gdb) b main Breakpoint 1 at 0x400930: file lancher.c, line 53. (gdb) r Starting program: /home/ir4y/a.out -e fault Breakpoint 1, main (argc=3, argv=0x7fffffffe9d8) at lancher.c:53 53 int m = 15; /* max # of bytes to print on one line */ (gdb) n 59 if(argc < 3) usage(argv[0]); (gdb) 60 if(stat(argv[2], &sbuf)) barf("failed to stat file"); (gdb) 61 flen = (long) sbuf.st_size; (gdb) 62 if(!(code = malloc(flen))) barf("failed to grab required memeory"); (gdb) 63 if(!(fp = fopen(argv[2], "rb"))) barf("failed to open file"); (gdb) 64 if(fread(code, 1, flen, fp) != flen) barf("failed to slurp file"); (gdb) 65 if(fclose(fp)) barf("failed to close file"); (gdb) 67 while ((arg = getopt (argc, argv, "e:p:")) != -1){ (gdb) 68 switch (arg){ (gdb) 70 croak("Calling code ..."); (gdb) Calling code ... 71 fptr = (void (*)(void)) code; (gdb) 72 (*fptr)(); (gdb) Program received signal SIGSEGV, Segmentation fault. 0x0000000000602010 in ?? () (gdb) как видно при отладке сегфолт вываливается при вызове функции
Код (Text): #include <stdint.h> int main(int argc, char **argv) { int h = open("1", 0); if (h < 0) return 2; int l = lseek(h, 0, 2); if (l < 0 || lseek(h, 0, 0) != 0) return 2; static uint8_t c[128]; if (read(h, c, l) != l) return 2; mprotect((uint32_t)c & 0xfffff000, 4096, 5);[/b] (*(void (*)(void))c) (); } $ ./a.out Hello world static тоже не просто так...
код который работает 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
минимальный код под 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
Как я понял эксплуатировать уязвимость переполнения стека или уязвимость форматной строки на ядрах 2.6 невозможно? Тогда, интересно, как обстоят дела с этими уязвимостями в современных версиях ОС FreeBSD, OpenSolaris и Windows?
А при чем тут интеловские маны? Проблема не в железе, а в реализации страничной адресации в ОС в 2.6 ядрах она реализована безопаснее и использовать уязвимость переполнения сложнее, но это не значит что через переполнение буфера в стеке невозможно выполнить произвольный код. Самый простой способ запускать эксплойт много раз пока не повезет =) Примеры эксплойтов под 2.6 ядро есть в metasploit framework Так же на http://milw0rm.com/ можно поискать эксплойты и под солярку и под фрю ...
InFlame При том что я вижу интеловские мнемоники. Меня просто злит когда всяко нубьё лезет в сплоеты ради наживы не понимая вобще нихрена
Где? Я спросил всего лишь про защищённость конкретных ОС. Напротив, я пытаюсь изучать эти уязвимости и как работают сплоиты.