Все части переполнение буфера
Следующая часть Переполнение буфера и перезапись переменных к конкретному значению - разработка эксплойтов, часть 2
Доброго времени суток, посетители портала Codeby =) Решил написать цикл статей посвященный эксплуатации бинарных уязвимостей, в народе это называется чёрной магией. В сети есть куча статей и материалов на эту тему, а четкого пути так и не видно... Потому, что надо обладать огромным багажом знаний... Так как же научиться писать эксплойты? Находить 0дей уязвимости, обходить такие защиты, как DEP\ASLR ? Ответ прост нужна практика, практика и еще раз практика, чем мы с вами сейчас и займемся. Я буду вашим проводником.
В сети был такой учебный ресурс, как
Exploit Exercises предлагает множество виртуальных машин, документацию и задачи, которые пригодятся в изучении повышения привилегий, анализа уязвимостей, разработки эксплойтов, отладки, реверс-инжиниринга и т.д.
Сейчас этот ресурс не доступен, так, как он переехал и доступен теперь по новому
Начнем мы свой путь в профессию Exploit-Developer с решения различных ExploitMe на образе
И так перейдем к делу, качаем образ виртуальной машины и запускаем его на VirtualBox'e.
Логин и пароль "user"
Самое первое задание это
Описание ExploitMe
Этот уровень вводит в концепцию, что доступ к памяти может осуществляться за пределами выделенной области, как размещаются переменные стека, и что изменение за пределами выделенной памяти может изменить выполнение программы.
Переходим в каталог с заданием
Исходный код
Решение
Тут всё стандартно, за исключением того, что в коде присутствует ключевое слово volatile. Сказал бы я, но... Рассмотрим более подробно, что представляет из себя переполнение буфера, что это за тип уязвимости такой... Поэтому начнем с разбора исходного кода программы.
Ключевое слово volatile информирует компилятор, что значение переменной может меняться извне. Это может произойти под управлением операционной системы, аппаратных средств или другого потока. Поскольку значение может измениться, компилятор каждый раз загружает его из памяти.
Посмотрим еще раз на исходный код программы, видим, что есть буфер в 64 байта, в этот буфер будет записана строка посредством функции gets().
Посмотрим описание функции.
Функция gets считывает строку из стандартного потока ввода (stdin) и помещает ее в массив указанный аргументом. Чтение строки производится пока не будет встречен символ «переход на новую строку», или не будет достигнут конец файла.
Если чтение строки завершилось по считыванию символа «переход на новую строку», то символ «переход на новую строку» не записывается в массив, а заменяется символом «конец строки»
Применение этой функции не рекомендуется, так как размер считываемой строки не ограничивается размером массива, в который должна быть записана считываемая строка. В результате может возникнуть переполнение массива и несанкционированная запись в память, что приведет к ошибкам в работе программы или ее зависанию.
Вернемся к исходному коду и посмотрим на условие в программе. Если переменная modified не равняется нулю тогда печатается текст «you have changed the ‘modified’ variable», иначе «Try again?».
Переменная modified установлена со значением ноль, поэтому всегда будет печататься текст «Try again?».
Если мы запустим программу и передадим, ей строку типа "ААААBBBCCCC" то ничего не произойдет, а если передадим строку большего размера, чем указано в буфере "...AAAABBBBCCCCDDDD" то мы перезапишем переменную. Посмотрите на диаграмму ниже. В памяти в стеке это будет выглядеть примерно так.
Исходя из того, что modified равен нулю, нам надо её изменить, что мы и сделаем. Используем буфер, функцию gets и volatile. Просто передадим в буфер строку не 64 байта, как положено, а 65, чтобы перезаписать значение переменной modified. Чтобы не вводить вручную данные, воспользуемся python’ом и перенаправим вывод в нашу программу.
Отлично, переменная перезаписана, а на экране отображается текст «you have changed the ‘modified’ variable», цель достигнута! Когда будете работать над очередным переполнением буфера, важно понимать, где и как находятся данные в стеке, поэтому вспоминайте эту диаграмму. В этом ExploitMe мы научились перезаписывать значение переменной, используя уязвимость переполнения буфера, теперь можно смело переходить на следующий уровень -
Следующая часть Переполнение буфера и перезапись переменных к конкретному значению - разработка эксплойтов, часть 2
Доброго времени суток, посетители портала Codeby =) Решил написать цикл статей посвященный эксплуатации бинарных уязвимостей, в народе это называется чёрной магией. В сети есть куча статей и материалов на эту тему, а четкого пути так и не видно... Потому, что надо обладать огромным багажом знаний... Так как же научиться писать эксплойты? Находить 0дей уязвимости, обходить такие защиты, как DEP\ASLR ? Ответ прост нужна практика, практика и еще раз практика, чем мы с вами сейчас и займемся. Я буду вашим проводником.
В сети был такой учебный ресурс, как
Ссылка скрыта от гостей
.Exploit Exercises предлагает множество виртуальных машин, документацию и задачи, которые пригодятся в изучении повышения привилегий, анализа уязвимостей, разработки эксплойтов, отладки, реверс-инжиниринга и т.д.
Сейчас этот ресурс не доступен, так, как он переехал и доступен теперь по новому
Ссылка скрыта от гостей
.Начнем мы свой путь в профессию Exploit-Developer с решения различных ExploitMe на образе
Ссылка скрыта от гостей
. Этот образ хорош тем, что в нем вы изучите основы, азы, переполнения буфера, уязвимости форматирования строки, переполнение кучи... А так же в нем отключены защиты подобные DEP и ASLR, чтобы мы могли сконцентрироваться именно на изучении самих уязвимостей и их эксплуатации. Обходить защиты мы будем, но чуть позже, когда наберемся опыта, а пока, что будем качать наш с вами скилл.И так перейдем к делу, качаем образ виртуальной машины и запускаем его на VirtualBox'e.
Логин и пароль "user"
Самое первое задание это
Ссылка скрыта от гостей
.Описание ExploitMe
Этот уровень вводит в концепцию, что доступ к памяти может осуществляться за пределами выделенной области, как размещаются переменные стека, и что изменение за пределами выделенной памяти может изменить выполнение программы.
Переходим в каталог с заданием
cd /opt/protostar/bin/
Исходный код
C:
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char **argv)
{
volatile int modified;
char buffer[64];
modified = 0;
gets(buffer);
if(modified != 0) {
printf("you have changed the 'modified' variable\n");
} else {
printf("Try again?\n");
}
}
Тут всё стандартно, за исключением того, что в коде присутствует ключевое слово volatile. Сказал бы я, но... Рассмотрим более подробно, что представляет из себя переполнение буфера, что это за тип уязвимости такой... Поэтому начнем с разбора исходного кода программы.
Ключевое слово volatile информирует компилятор, что значение переменной может меняться извне. Это может произойти под управлением операционной системы, аппаратных средств или другого потока. Поскольку значение может измениться, компилятор каждый раз загружает его из памяти.
Посмотрим еще раз на исходный код программы, видим, что есть буфер в 64 байта, в этот буфер будет записана строка посредством функции gets().
Посмотрим описание функции.
Функция gets считывает строку из стандартного потока ввода (stdin) и помещает ее в массив указанный аргументом. Чтение строки производится пока не будет встречен символ «переход на новую строку», или не будет достигнут конец файла.
Если чтение строки завершилось по считыванию символа «переход на новую строку», то символ «переход на новую строку» не записывается в массив, а заменяется символом «конец строки»
Применение этой функции не рекомендуется, так как размер считываемой строки не ограничивается размером массива, в который должна быть записана считываемая строка. В результате может возникнуть переполнение массива и несанкционированная запись в память, что приведет к ошибкам в работе программы или ее зависанию.
Вернемся к исходному коду и посмотрим на условие в программе. Если переменная modified не равняется нулю тогда печатается текст «you have changed the ‘modified’ variable», иначе «Try again?».
Переменная modified установлена со значением ноль, поэтому всегда будет печататься текст «Try again?».
Если мы запустим программу и передадим, ей строку типа "ААААBBBCCCC" то ничего не произойдет, а если передадим строку большего размера, чем указано в буфере "...AAAABBBBCCCCDDDD" то мы перезапишем переменную. Посмотрите на диаграмму ниже. В памяти в стеке это будет выглядеть примерно так.
Исходя из того, что modified равен нулю, нам надо её изменить, что мы и сделаем. Используем буфер, функцию gets и volatile. Просто передадим в буфер строку не 64 байта, как положено, а 65, чтобы перезаписать значение переменной modified. Чтобы не вводить вручную данные, воспользуемся python’ом и перенаправим вывод в нашу программу.
python -c "print 'A' * 65" | ./stack0
Отлично, переменная перезаписана, а на экране отображается текст «you have changed the ‘modified’ variable», цель достигнута! Когда будете работать над очередным переполнением буфера, важно понимать, где и как находятся данные в стеке, поэтому вспоминайте эту диаграмму. В этом ExploitMe мы научились перезаписывать значение переменной, используя уязвимость переполнения буфера, теперь можно смело переходить на следующий уровень -
Ссылка скрыта от гостей
.