Вывод и ввод с точки зрения ассемблера | OTUS

Вывод и ввод с точки зрения ассемблера

При использовании функции вывода переменные помещаются в стек, а потом применяются в качестве параметров. Понимание, как это выглядит на низком уровне, расширит ваши знания о работе программного обеспечения и, соответственно, позволит более эффективно заниматься его исследованием.

Стандартная функция вывода

Для вывода данных задействуем функцию printf(). Стандартный вывод в нашем случае будет следующим:

1_gPyOhqYs0zpku8gAyxXNgQ_1-1801-b4f1aa.jpeg

Теперь смотрим на машинный код. Вот, как выглядит вывод строкового литерала:

1_Xzi7OPpeIfbbY7eHVq2edA_1-1801-45fed7.jpeg

Как вы можете видеть, строковый литерал, в первую очередь, помещается в стек для вызова в качестве параметра printf(). Теперь давайте глянем на вывод одной из переменных:

1_FgUDPM7PmhZvRYba3XrCnw_1-1801-afcda8.jpeg

Тут можно отметить, что сначала переменная intvar пермещается в регистр EAX, который записывается в стек совместно со строковым литералом %i, применяемым для обозначения целочисленного вывода. Далее эти переменные берутся из стека и задействуются в качестве параметров при вызове printf().

Пользовательский ввод

Теперь рассмотрим ввод пользователя посредством потока сin из C++. Но сначала глянем на наш код:

1_8AN7ZPmh6VRbtX_24d6aQg_1-1801-e57fda.jpeg

В данной функции мы лишь записываем строку в переменную sentence посредством функции C++ cin, а потом выводим предложение, используя оператор printf().

Как это выглядит в машинном коде? Смотрим функцию cin:

1_WWi1L7WYuekqAfYoPAs2Zg_1-1801-ca388c.jpeg

Обратите внимание, что сначала инициализируется строковая переменная sentence, потом осуществляется вызов cin с последующей записью введенных данных в sentence.

1_ftjpKAXT8ORZPzfz7JY_fg_1-1801-4e9d7e.jpeg

Итак, программа устанавливает содержимое переменной sentence в EAX, потом помещает EAX в стек, откуда значение нашей переменной станет применяться в качестве параметра для потока cin. Далее происходит вызов оператора потока >>. Его вывод помещается в ECX, который потом перемещается в стек для оператора printf():

1_w1oN2Ebt7QobaGbnXLTpDA_1-1801-aca148.jpeg

Итак, мы вкратце рассмотрели стандартный вывод функции и пользовательский ввод на низком уровне. Соответствующие знания являются базовыми и могут пригодиться тем, кто только начинает осваивать профессию реверс-инженера.

По материалам «BOLO: Reverse Engineering — Part 1 (Basic Programming Concepts)».

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться
Популярное
Сегодня тут пусто