Неожиданное значение появляется в стеке при попытке переполнения буфера - PullRequest
1 голос
/ 03 ноября 2019

Я пытаюсь узнать больше о кибербезопасности, в данном случае о переполнении буфера. У меня есть простой код, который я хочу изменить в потоке:

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

void win()
{
  printf("code flow successfully changed\n");
}

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

  fp = 0;

  gets(buffer);

  if(fp) {
      printf("calling function pointer, jumping to 0x%08x\n", fp);
      fp();
  }
}

Используя некоторые инструменты, я определил, что указатель функции (fp) обновляет свое значение после 72 символов, введенных в буфер. Функция win() расположена в значении 0xe5894855, поэтому после 72 символов мне нужно предоставить это значение в буфер для перехода к нужной функции.

Однако я сталкиваюсь с этой проблемой: enter image description here

Путем помещения print("A"*18*4 + "UH" + "\x89" + "\xe5") Python3 на вход данного кода C, я должен получить желаемое значение 0xe5894855 в секции, отмеченной красным. Но вместо этого я получаю выделенный искаженный гекс откуда-то. (89 получает дополнительный C2, и неправильное значение e5 переполняется до следующей части стека) (значение в этих частях стека изначально равно нулю, но изменяется при попытке переполнения).

Почему это происходит? Неправильно ли я помещаю шестнадцатеричные значения в программу на C?

Редактировать: До сих пор не выяснил, почему не работает передача шестнадцатеричных значений через python, но я нашел другой метод с использованием Perl: perl -e 'print "A"x4x18 . "\x55\x48\x89\xe5"', который работали адрес, к которому мне нужно было перейти, также был неверным (который я также исправил)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...