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

Переполнение буфера - C (СИ)

24.04.2013, 22:35. Просмотров 2938. Ответов 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...

выручайте
http://www.cyberforum.ru/c-beginners/thread1895611.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2013, 22:35
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Переполнение буфера (C (СИ)):

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

Переполнение строки
Есть массив, допустим, 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