#arrays #c #assembly #memory #append
#массивы #c #сборка #память #добавить
Вопрос:
Допустим, у меня есть пример массива байтов:
unsigned char byte_array[] = "xffx00xafxc1x00x00x00x00x00x00x00x00";
И скажем, у меня также есть указатель, который указывает на коды операций сборки:
unsigned char *opcodes = "x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1xb0x0bxcdx80";
Как мне указать последние 8 байтов byte_array
на адрес памяти (а не на данные opcodes
, на которые указывают) байты указателя opcodes
byte_array
? Например, скажем, что адрес памяти opcodes
указывает на:
0x0000ffffffffffff8
Я бы хотел byte_array
быть:
xffx00xafxc1xf8xffxffxffxffxffx00x00
По сути, мне нужно каким-то образом извлечь адрес памяти, хранящийся в переменной opcodes
, и назначить этот адрес памяти последним 8 байтам byte_array
.
Комментарии:
1. Во-первых, вам нужно увеличить этот массив байтов. В настоящее время его длина составляет всего 5 байт.
2. Я отметил, что в последнюю секунду я изменил его.
3. Скопируйте байты из
opcodes
в нужные байтыbyte_array
.4. Обратите внимание, что вы
opcodes
не используете 64-разрядный абсолютный адрес. Скомпилировав этот C и запустивobjdump -D -rwC -Mintel
, я получаюff 00 inc DWORD PTR [rax]
/af scasd
/c1 00 00 rol DWORD PTR [rax],0x0
. (А остальные нули декодируются как00 00 add BYTE PTR [rax],al
.) Удаление 64-разрядного абсолютного адреса послеc1
байта приведет к декодированию младшего байта адреса как байта ModRM, который может занять несколько последующих байтов в качестве большего количества байтов режима адресации. И один следующий байт будет непосредственным счетчиком поворота.5. x86-64 имеет только 64-разрядную абсолютную адресацию для специальной формы
mov
. (в / из AL /AX/ EAX/ RAX).
Ответ №1:
Как и все объекты в C, значение указателя представлено байтами в памяти. Чтобы некоторые другие байты указывали на те же байты, на которые указывает указатель, можно просто скопировать байты, представляющие указатель, в другие байты:
memcpy(byte_array offset, amp;opcodes, sizeof opcodes);
Здесь offset
, по-видимому, будет пять, чтобы начать после пяти начальных байтов, которые у вас, кажется, есть byte_array
.
Обратите внимание, что это, очевидно, грубый эксперимент по использованию уязвимостей программы. Каким бы привлекательным ни было это понятие, для выполнения успешных эксплойтов требуется значительно больше знаний, чем предполагает этот вопрос, и это не лучший способ изучения программной инженерии в целом.