Указание раздела / конца массива символов без знака на адрес памяти

#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 .

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