Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переполнение стека, какие есть способы 
:(
    Опции темы
Royan
Дата 22.6.2005, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



Я тут реально с преподом на экзамене побузил по этому поводу, и почувствовал себя реальным лохом, потому что не сумел логически выстроить стройную цепочку. В общем, билет был именно насчет переполнения стека. Короче вот, что я смог найти из классических вариантов buffer overflow:

Код

int foo(char *s){
    char buf[16]; //Вот если б я знал, что эта переменная выделяется в стеке..., а не знал
    ...
    strcpy(buf, s);//ясно что в s содержится всякая ахинея, которая и вызывает вредоносный код
}


Собственно вопрос такой, кто знает, какие есть еще способы переполнить буфер?



--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Royan
Дата 22.6.2005, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



Конечно же в subj имелось ввиду переполнение буфера, меня проглючило


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Fixin
Дата 22.6.2005, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 2
Всего: 18



Код
func(byte a) {...}
func2()
{
       func(123456789*12345678);
}



Компил покажет переполнение. Точно не знаю, но когда-то вроде у меня такое случилосью
Добавлено @ 19:24
Ну тогда:
Код
strcpy(buf+16, s); 

PM MAIL ICQ   Вверх
En_t_end
Дата 22.6.2005, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



Почитай книгу у меня в подписи smile
Её авторы - это настоящие мастера buffer overflow, под эти дела у них целая глава smile

Это сообщение отредактировал(а) En_t_end - 22.6.2005, 19:29
PM MAIL ICQ Skype GTalk Jabber   Вверх
Fixin
Дата 22.6.2005, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 2
Всего: 18



smile En_t_end Поздравляю с модераторством! smile
PM MAIL ICQ   Вверх
En_t_end
Дата 22.6.2005, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



smile Fixin с Комодераторством smile smile

PM MAIL ICQ Skype GTalk Jabber   Вверх
Fixin
Дата 22.6.2005, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 2
Всего: 18



Ну... там уж недалеко осталось.
PM MAIL ICQ   Вверх
Royan
Дата 22.6.2005, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



2En_t_end Что-то я в толк не возьму где там эта книга, ты бы лучше прямую ссылку дал.


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
En_t_end
Дата 23.6.2005, 05:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



Royan
Пожалуйста... http://forum.vingrad.ru/index.php?showtopic=53777
Все обсуждения по ней в ту ветку.
PM MAIL ICQ Skype GTalk Jabber   Вверх
vadims
Дата 23.6.2005, 06:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 8.6.2005

Репутация: 2
Всего: 17



Цитата(Royan @ 22.6.2005, 18:52)
Собственно вопрос такой, кто знает, какие есть еще способы переполнить буфер?

Вот уж вопрос так, вопрос - как написать заведомо отстреливающийся код smile

Вообще-то непонятно почему ты решил, что при
int foo(char *s)
Цитата
в s содержится всякая ахинея, которая и вызывает вредоносный код


если strlen(s) < sizeof(buf) то все нормально, если больше - то уж извини, вне зависимости от того локальный это массив или глобальный, конструкция аналогична
while( char *ptr = NULL ) smile
*ptr++=0;

для того чтобы исключить подобные вещи используй
strncpy(buf,s,sizeof(buf)-1)

--------------

Цитата(En_t_end @ 23.6.2005, 05:22)
Пожалуйста... http://forum.vingrad.ru/index.php?showtopic=53777
Все обсуждения по ней в ту ветку.

Извиняюсь, невнимательно прочитал

Это сообщение отредактировал(а) vadims - 23.6.2005, 07:21


--------------------
Cpu not found ! Press any key for software emulation.
PM MAIL   Вверх
oleg1973
Дата 23.6.2005, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 1
Всего: 34



обясняю на пальцах )
функция strcpy на асме выглядит примерно так

Код

proc strcpy,param1,param2
push ebp
mov ebp,esp
......
return

в данном случае при вызове нашей функции стек выглядит так
param1
param2
адрес возврата

буффер у нас расчитан на 16 байт
значит передав в качестве параметра некий стринг более 16 байт мы перезапишем адрес возврата
и по завершению функция не вернетсу туда лткуда ее вызвали а прыгнет на тот адрес который мы подсунули типа:
всякиеданные16байт+4байта
вот последние 4 байта у нас и перезапишут адрес возврата


ну эт так сказать теория, на практике иногда не совсем так получается



--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
vadims
Дата 23.6.2005, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 8.6.2005

Репутация: 2
Всего: 17



Цитата(oleg1973 @ 23.6.2005, 13:11)
на практике иногда не совсем так получается

Ой, на практике такое может получиться, что хоть всех святых выноси

Но суть то одна - ОТСТРЕЛИТСЯ программа то !!!






--------------------
Cpu not found ! Press any key for software emulation.
PM MAIL   Вверх
Гость_VIKT0R
Дата 4.7.2005, 22:03 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ссылки:
ru:
Modern_kinds_of_system_attacks: http://lbyte.ru/txt/misc/cabzz.txt

Kids Buffer Overflow Paper: http://www.securitylab.ru/48885.html

Написание эксплойтов переполнения буфера - туториал для новичков: http://wasm.ru/article.php?article=buf_over4noob

Как устроены эксплоиты: http://rootteam.void.ru/article.php?txt=expleng

Ховард М. "Защищенный код": http://84.252.140.76/MSDVD/Zachita.zip
end ru

en:
Writing buffer overflow exploits - a tutorial for beginners: http://www.shellcode.com.ar/docz/bof/mixter-smash.txt

An Introduction to executing arbituary code via stack overflows: http://www.shellcode.com.ar/docz/bof/overflow_tutorial.txt

HEAP OVERFLOW TUTORIAL: http://www.shellcode.com.ar/docz/bof/heap-tute.txt
end en

Пример:
Код

#include <stdio.h> 
#include <string.h> 

void foo(const char* input) 
{ 
     char buf[10]; 
     //Стек программы 
     printf("My Stack #1: \n%p\n%p\n%p\n%p\n%p\n%p\n\n"); 
     strcpy(buf, input);//Скопировали строку 
     printf("%s\n", buf);//Напечатали 
     //Теперь стек такой 
     printf("My Stack #2: \n%p\n%p\n%p\n%p\n%p\n%p\n\n"); 
} 
//Функция, которую надо вызвать, "взломав" программу 
void bar(void) 
{ 
     printf("HACK!\n"); 
} 

int main(int argc, char* argv[]) 
{ 
     //Адреса функций 
     printf("Adress foo = %p\n", foo); 
     printf("Adress bar = %p\n", bar); 
     if (argc != 2) 
     { 
                   //Если запуск произведен без пер.строки, скажем 
                   printf("No String-Argument!\n"); 
                   return -1; 
     } 
     foo(argv[1]); 
     return 0; 
} 

Компилируем. VC6.0 или lcc или gcc-2.95.2.
Запускаем...
stackOverrun.exe AB23
Если передать большую строку, в стек попадут некоторые символы из передаваемой строки. Посмотрим, какие буквы обозначают коды этих символов. Стек (для VC6) - 00401060. Значит, подставив вместо них адрес функции bar, программа выведет надпись HACK. Передавать надо наоборот, то есть 6010 40

Для VC6 достаточно в HEX-редакторе набрать:
7374 6163 6B4F 7665 7272 756E 2E65 7865 2041 4232 3343 3030 4447 4849 4A60 1040
Сохранить файл с расширением .cmd в директорию с откомпилированным файлом и запустить.


  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0559 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.