Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.94/17: Рейтинг темы: голосов - 17, средняя оценка - 4.94
Nikblow
1 / 1 / 1
Регистрация: 24.09.2012
Сообщений: 117
1

Переполнение буфера

24.04.2013, 22:35. Просмотров 3080. Ответов 13
Метки нет (Все метки)

Помогите разобраться
Лабораторная с переполнением буфера

Вот сам код программы и скриншот результата

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <string.h>
void printff()
{
    printf("QWERTY");
}
int overflow(char *ptr)
{
    char buffer[2];
    strcpy(buffer, ptr);
    return 0;
}
int main()
{
    int a;
    char argv[1];
    int argc=2;
    if(argc>1)
    {
        overflow(&argv[1]);
    }
    printf("%d\n", printff);
    scanf("%d", a);
    return 0;
}
Переполнение буфера


После ввода строки аааааааааааааааааааааааааааааааааааааааа теоретически: должна выскочить ошибка и опереполнении буфера и тому подобное

запускаю exe файл на виртуалке xp sp3
компилирую на 2010 VS

я хочу сделать так, чтобы в уязвимой программе моей переполнялся стэк, и я потер адресса в EIP и туда вписал свой адресс на функцию Printff, которая в итоге должна выводить строчку QWERT...

выручайте
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2013, 22:35
Ответы с готовыми решениями:

Возможно ли переполнение буфера, если написать scanf("%20s", &buf)?
20 спасает? Нужно ли дополнительно проверять ввод?

Переполнение стека
Ребят помогите избавиться от ошибки,вылетает в самом конце программы,программа...

Переполнение строки
Есть массив, допустим, N элементов. Пользователь вводит с клавиатуру строку,...

Переполнение char
char k = (char)129; диапазон char −128 до 127, но 129 он запишет, заполнив...

Переполнение типа
Здравствуйте, подскажите пожалуйста какой результат будет 500 или 245? Uint8...

13
pashe4ka13
174 / 22 / 1
Регистрация: 21.03.2011
Сообщений: 51
25.04.2013, 05:07 2
Цитата Сообщение от Nikblow Посмотреть сообщение
Помогите разобраться
Лабораторная с переполнением буфера

я хочу сделать так, чтобы в уязвимой программе моей переполнялся стэк, и я потер адресса в EIP и туда вписал свой адресс на функцию Printff, которая в итоге должна выводить строчку QWERT...

выручайте
Для начала в студии в свойствах проекта отключи проверку переполнения буфера (/GS-), внесения случайности в базовый адрес (/DYNAMICBASE:NO) и DEP (/NXCOMPAT:NO). Ну можешь и не отключать, если тебе знакомы такие слова как ROP и Cookie(не те что в браузере, а те что студия ложит на стек) Ну а потом уже пиши сплоент для эксплуатации уязвимости.
0
Nikblow
1 / 1 / 1
Регистрация: 24.09.2012
Сообщений: 117
25.04.2013, 08:07  [ТС] 3
Да я отключил, проблема в том, что когда я допустим ввожу ааааааааааааааааааааааааааааааааааааааа буфер не переполняется, пробовал вводить больше а, все равно. По идеи же должна выскакивать ошибка, но она не выскакивает. Вот в чём проблема? :/
0
pashe4ka13
174 / 22 / 1
Регистрация: 21.03.2011
Сообщений: 51
25.04.2013, 15:38 4
Цитата Сообщение от pashe4ka13 Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <string.h>
void printff()
{
    printf("QWERTY");
}
void overflow(char *ptr)
{
    char buffer[2];
    strcpy(buffer, ptr);
}
int main(int argc, char* argv[])
{
    int a;
    if(argс>1)
    {
        overflow(argv[1]);
    }
    printf("%d\n", printff);
    scanf("%d", &a);
    return 0;
}
Вот так подправил, а то ночь не спал. Туплю.
1
Nikblow
1 / 1 / 1
Регистрация: 24.09.2012
Сообщений: 117
25.04.2013, 16:11  [ТС] 5
pashe4ka13, а что такое argv
Что в нём передаётся.
В overflow мы передаём строку, которую нужно записать, чтобы переполнить
А вот элемент массива argv[1] что содержит?
0
pashe4ka13
174 / 22 / 1
Регистрация: 21.03.2011
Сообщений: 51
25.04.2013, 17:13 6
int argc=количество аргументов. char* argv[]=указатель на массив указателей.
argv[0]=указатель на массив с строкой пути и именем исполняемого файла. argv[1] указатель на строку с первым аргументом.
0
pashe4ka13
174 / 22 / 1
Регистрация: 21.03.2011
Сообщений: 51
25.04.2013, 17:31 7
Вот как это выглядит в отладчике
1
Миниатюры
Переполнение буфера   Переполнение буфера  
Nikblow
1 / 1 / 1
Регистрация: 24.09.2012
Сообщений: 117
25.04.2013, 17:38  [ТС] 8
pashe4ka13, очень наглядно, спасибо большое!

А вот какое количество символов аааааааааа мне нужно засунуть
Как через отладчик определить количество символов, которые должны потереть информацию до eip, а после и сам eip, чтобы поставить туда адрес функции нужно мне?
0
pashe4ka13
174 / 22 / 1
Регистрация: 21.03.2011
Сообщений: 51
25.04.2013, 17:58 9
Цитата Сообщение от Nikblow Посмотреть сообщение
pashe4ka13, очень наглядно, спасибо большое!

А вот какое количество символов аааааааааа мне нужно засунуть
Как через отладчик определить количество символов, которые должны потереть информацию до eip, а после и сам eip, чтобы поставить туда адрес функции нужно мне?
Возьми отладчик OllyDebuger. В нем открой свою программу, при этом задай аргумент командной строки
Затем смотри за стеком и кодом. Когда eip будет указывать не команду ret, ты увидишь на вершине стека esp адрес возврата. Тебе его надо заменить на адрес твоей функции. Ну и когда заполняется буфер смотри как введенные символы заполняют стек, как дойдут до этого адреса сосчитай их. Как то так.
1
Миниатюры
Переполнение буфера  
Nikblow
1 / 1 / 1
Регистрация: 24.09.2012
Сообщений: 117
25.04.2013, 21:58  [ТС] 10
pashe4ka13, да всё работает

а вот если я хочу запустить вместо вывода строки кверти, какой-нибудь шелл-код
я должен просто взять массив допустим, в этот массив засунуть шелл кода и по адресу функции вызвать этот шелл код?
0
pashe4ka13
174 / 22 / 1
Регистрация: 21.03.2011
Сообщений: 51
25.04.2013, 23:38 11
Цитата Сообщение от Nikblow Посмотреть сообщение
pashe4ka13, да всё работает

а вот если я хочу запустить вместо вывода строки кверти, какой-нибудь шелл-код
я должен просто взять массив допустим, в этот массив засунуть шелл кода и по адресу функции вызвать этот шелл код?
Откуда по адресу функции возьмется твой шелл-код? Ты должен его разместить в переполняющимся буфере, который у тебя на стеке. Если включен DEP то стек будет неисполнимым. Есть обходы этого метода защиты. А так например ты можешь вставить шелл-код в аргумент командной строки. Вот тут почитай. Ну и надо учитывать, что попадая в чужую программу твой код понятия не имеет об окружении и по какому адресу он загружен.

ЗЫ: Странные у вас какие-то лаболаторные
1
Nikblow
1 / 1 / 1
Регистрация: 24.09.2012
Сообщений: 117
26.04.2013, 00:16  [ТС] 12
т.е. я могу его просто вставить вместе моего в первом случае адресса функции. Допустим я хочу с помощью шелл-кода запустить какую-нибудь программу (пусть это будет пейнт), что мне нужно написать на языке шелл-кода? это я так, в качестве примера, можно что-нибудь и полегче. С адрессами на функции я разобрался

да уж, лабы не как лабы, первый курс, информационная безопасность компьютерных систем

Добавлено через 2 минуты
pashe4ka13,
0
pashe4ka13
174 / 22 / 1
Регистрация: 21.03.2011
Сообщений: 51
26.04.2013, 07:19 13
Цитата Сообщение от Nikblow Посмотреть сообщение
т.е. я могу его просто вставить вместе моего в первом случае адресса функции. Допустим я хочу с помощью шелл-кода запустить какую-нибудь программу (пусть это будет пейнт), что мне нужно написать на языке шелл-кода? это я так, в качестве примера, можно что-нибудь и полегче.
pashe4ka13,
Тут есть готовый пример уязвимого веб-сервера ни си, шелл-код и эксплоит на фасм. Все с подробными комментариями.
1
PlayaRC
5 / 5 / 1
Регистрация: 10.03.2012
Сообщений: 121
08.06.2014, 19:29 14
прошу помощи! все делал как описано тут и вот к чему пришел. В качестве аргумента передаю строку "qwertyuiopasdfghjklz", определил, что eip затирается символами dfgh из строки. Адрес функции, на который хочу заменить адрес в eip 004110EB, как модифицировать строку qwertyuiopasdfghjklz, чтобы вместо dfgh в eip был адрес 004110EB, пожалуйста объясните, желательно с примером!

Заранее спасибо!

Добавлено через 1 час 35 минут
помогите пожалуйста, для лабораторной нужно, срочно
0
08.06.2014, 19:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2014, 19:29

Переполнение буффера. Адрес возрата.
Простите мб за тупость, новичок. Нужно написать программу, которая по...

Почему в программе не возникает переполнение
main( ) { int i; i = 32767; printf(&quot;%d\n %d\n %d\n&quot;,i, i+1, i+2);...

Как обойти переполнение int?
как обойти переполнение integer'а ? Например...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru