код операции x86 для помещения строкового адреса в стек - PullRequest
0 голосов
/ 25 февраля 2019

Я изменяю исполняемый файл с помощью шестнадцатеричного редактора, и мне нужно вызвать функцию и передать некоторый текст в качестве параметра.Мой код находится в разделе .text, и моя строка закодирована в разделе .data под ним.Скажи, что моя строка "АААА".Адрес строки начинается с "0x008000".Я пытаюсь выдвинуть строку следующим образом:

push [0x008000]    FF 35 00 08 00
call function      FF 15 11 11 11

Вызов функции работает со значениями по умолчанию NULL, поэтому я знаю, что вызываю ее правильно.

Проблема в вызове кода операции для него.Я борюсь с пониманием формата кода операции для push.Можно ли толкнуть адрес строки напрямую, как это?Я открыл свой исполняемый файл в IDA, чтобы получить более полное представление о том, как существующий код перемещает строки, но я не смог найти четкого примера того, как строковый адрес напрямую помещается в стек.Большинство строк в дизассемблированном коде либо хранятся в локальном стеке, либо вызываются меткой, которая переходит к смещению, которое получает что-то из стека.Признаюсь, я не совсем знаю, как работают метки, потому что на самом деле не существует точки, где строка, хранящаяся в памяти и легкодоступная, явно помещается в стек.

Любые объяснения приветствуются.

1 Ответ

0 голосов
/ 25 февраля 2019

У вас есть формат PUSH r / m инструкции push, который выталкивает значение из регистра или загружается из памяти - в данном случае загружается с адреса 0x800 - при условии, что следующий байт равен 00, так как это 6-байтная инструкция.

Если вы хотите нажать значение 0x8000 (которое вы собираетесь рассматривать как адрес в вашей функции), вам нужно использовать инструкцию PUSH immed32, котораябудет 68 00 80 00 00 Обратите внимание, что это на один байт меньше, чем инструкция PUSH r / m, поэтому вам нужно добавить 1-байтовый NOP (90) до или после, если вы пытаетесь выполнитьбинарный патч.

...