Разработка эксплойтов, Часть 3 - Введение в переполнение буфера

Разработка эксплойтов, Часть 3 - Введение в переполнение буфера

@webware

t.me/webware

Привет Codeby =) В предыдущей статье мы научились перезаписывать значение переменной к конкретному значению используя уязвимость переполнения буфера. Не будем останавливаться на достигнутом, двигаемся дальше...


Описание ExploitMe

Stack2 смотрит на переменные окружения, и как они могут быть использованы.


Этот уровень находится в / opt / protostar / bin / stack2


Stack2VM


Исходный код

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
  volatile int modified;
  char buffer[64];
  char *variable;

  variable = getenv("GREENIE");

  if(variable == NULL) {
      errx(1, "please set the GREENIE environment variable\n");
  }

  modified = 0;

  strcpy(buffer, variable);

  if(modified == 0x0d0a0d0a) {
      printf("you have correctly modified the variable\n");
  } else {
      printf("Try again, you got 0x%08x\n", modified);
  }

}

Решение

Здесь у нас всё тоже самое, единственное, что здесь новое эта функция getenv(). Посмотрим описание функции.


Функция getenv() возвращает указатель на информацию об окружении, ассоциированную со строкой name в таблице информации окружения.


Окружение программы может включать такие вещи, как имена путей и устройств. Точное содержание этих данных определяется операционной системой.


Если функция вызвана с аргументом, который не соответствует никаким переменным окружения, то возвращается нулевой указатель.


И так нам нужно перезаписать значение переменной modified со значением «0x0d0a0d0a». Чтобы это сделать нам надо опять переполнить буфер, но на этот раз переполнение буфера будет происходить через переменную окружения GREENIE. Кстати говоря, если заглянуть в «man ascii» , то мы не найдем там «0x0d0a0d0a», значения этих байтов, если погуглить можно понять из значения "0x0d0a0d0a", что 0x0d — это '\r' символ возврата каретки, а 0x0a — символ новой строки '\n'. И все таки эти байты, что-то да значат, как оказалось это спец.символы. Посмотреть их все, можно тут в ascii-table. Это наиболее полная таблица.


И так установим переменную окружения GREENIE поэтому воспользуемся командой export .

export GREENIE=test


Проверяем

env

Как видно из списка переменных окружения, переменная GREENIE появилась в списке со значение "test". Отлично теперь можно переходить к формированию наших "вредоносных" данных.


Для этого будем использовать всё так же питон. Как я говорил выше, переполнение будет происходить, через переменную окружения, поэтому нам нужно установить GREENIE c нужным нам значением, а именно, нам надо так же 64 байта для заполнения буфера, а следующие байты будут перезаписывать значение переменной. Чтобы это сделать воспользуемся апострофами и заключим между ними наше выражение на питоне.

GREENIE=`python -c "print 'a' *64 + '\x0d\x0a\x0d\x0a'[::-1]"`


Проверим нашу "боевую" нагрузку

env


И посмотрим

Все готово. Как нам видно из среды переменных окружения, байты под буфер и те байты возврата каретки и перехода на новую строку успешно добавлены. Теперь можно запустить саму программу, чтобы запустить процесс эксплуатации уязвимости. Так, как при запуске программы, она воспользуется переменной окружения GREENIE и съест нашу ядовитую строку.

./stack2


Отлично на экране мы видим текст «you have correctly modified the variable», цель достигнута. В этом упражнение мы узнали, что для эксплуатации уязвимости может быть задействована среда переменных окружения, переходим на следующий уровень — stack3. Дальше будет еще веселее!!!

Источник codeby.net

Report Page