Все части переполнение буфера
Предыдущая часть Переполнение буфера и перезапись значения переменных - разработка эксплойтов, часть 1
Следующая часть Использование среды переменных окружения для переполнения буфера - разработка эксплойтов, часть 3
Доброго времени суток, посетители портала Codeby =) В предыдущей статье мы научились перезаписывать значение переменной используя уязвимость переполнения буфера. Ну чтож скажу я, продолжим изучать эту уязвимость.
Описание ExploitMe
На этом уровне рассматривается концепция изменения переменных к конкретным значениям в программе и то, как переменные располагаются в памяти.
Этот уровень находится в / opt / protostar / bin / stack1
Переходить в каталог не нужно, так как мы сделали это в прошлый раз.
Ссылка скрыта от гостей
, VMСоветы
- Если вы не знакомы с отображаемым шестнадцатеричным числом, «man ascii» — ваш друг.
- little endian
C:
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
volatile int modified;
char buffer[64];
if(argc == 1) {
errx(1, "please specify an argument\n");
}
modified = 0;
strcpy(buffer, argv[1]);
if(modified == 0x61626364) {
printf("you have correctly got the variable to the right value\n");
} else {
printf("Try again, you got 0x%08x\n", modified);
}
}
Решение
В этом примере у нас так же есть буфер на 64 байта, присутствует ключевое слово volatile, но при этом тут нет теперь функции gets(), а в место неё есть функция strcpy().
Посмотрим описании функции.
Функция strcpy (destination, source) копирует данные из строки, на которую указывает аргумент source, в строку, на которую указывает аргумент destination, пока не встретится символ конца строки (нулевой символ). Копирование производится вместе с символом конца строки. Если строки перекрываются, результат копирования будет не определен.
Посмотрим на второе условие в программе, если переменная modified равняется значению «0x61626364», тогда печатается текст «you have correctly got the variable to the right value» иначе «Try again, you got 0x%08x», плюс указывается значение переменной modified в шестнадцатеричной системе счисления. Поскольку в программе, есть еще одно условие где используется аргумент argc. Запустить питон код, как в прошлой программе не получится. Воспользуемся BASH для подстановки значения, чтобы использовать наш вывод, в качестве аргумента.
Последовательность команд будет следующей.
./stack1 $(python -c "print 'a' * 65")
В итоге мы получим следующий текст на экране «Try again, you got 0x00000061», как видим переменная modified приняло текущее значение. Мы писали в буфер последовательность букв из «aaaa…», из них 64 байта пошли в буфер, последним перезаписали значение переменной modified. Стало быть modified равняется ‘a’. Посмотрим чему равно ‘a’ в хексе, воспользуемся
Ссылка скрыта от гостей
. И видим, что ‘a’ равняется значению 0x61. Теперь еще раз взглянем на значение во втором условии «0x61626364», значит остальные числа в значении это «bcd», а всё вместе «abcd».Пробуем эксплуатировать, передадим 64 байта в буфер и еще 4 байта для перезаписи значения переменной modified.
./stack1 $(python -c "print 'a' * 64 + 'abcd' ")
Получаем строку «Try again, you got 0x64636261» , хм, что-то пошло не так и строка записалась в перевёрнутом виде. Почему? Если погуглить, то можно узнать о такой вещи, как
Ссылка скрыта от гостей
, т.е. в памяти, числа перевёрнутые. Значит делаем реверс строки и эксплуатируем уязвимость переполнения буфера в функции strcpy()../stack1 $(python -c "print 'a' * 64 + 'abcd'[::-1]")
Отлично, переменная перезаписана, а на экране отображается текст «you have correctly got the variable to the right value» цель достигнута!
Если в прошлом ExploitMe нашей задачей было просто изменить значение переменной, то в этой задаче мы научились устанавливать нужное нам значение для конкретной переменной используя уязвимость переполнения буфера. Теперь переходим на следующий уровень
Ссылка скрыта от гостей
.Вложения
Последнее редактирование модератором: