Вывод и ввод с точки зрения ассемблера | OTUS
⚡ Подписка на курсы OTUS!
Интенсивная прокачка навыков для IT-специалистов!
Подробнее

Курсы

Программирование
Python Developer. Professional
-3%
Разработчик на Spring Framework
-5%
iOS Developer. Professional
-8%
Golang Developer. Professional
-6%
Базы данных
-12%
Agile Project Manager
-5%
Android Developer. Professional
-11%
Microservice Architecture
-5%
C++ Developer. Professional
-5%
Highload Architect
-6%
JavaScript Developer. Basic
-8%
Backend-разработчик на PHP
-9%
Архитектура и шаблоны проектирования C# Developer. Professional
-9%
Team Lead
-6%
Kotlin Backend Developer
-9%
Разработчик программных роботов (RPA) на базе UiPath и PIX Unity Game Developer. Basic Разработчик голосовых ассистентов и чат-ботов Node.js Developer Интенсив «Оптимизация в Java» Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes iOS Developer. Basic Супер-интенсив «СУБД в высоконагруженных системах» Супер-интенсив "Tarantool"
Инфраструктура
DevOps практики и инструменты
-12%
Базы данных
-12%
Network engineer. Basic
-10%
Network engineer
-4%
Инфраструктурная платформа на основе Kubernetes
-6%
Экспресс-курс по управлению миграциями (DBVC)
-10%
Мониторинг и логирование: Zabbix, Prometheus, ELK
-10%
Administrator Linux. Professional
-6%
Разработчик IoT
-13%
Основы Windows Server Cloud Solution Architecture Разработчик голосовых ассистентов и чат-ботов VOIP инженер Супер-практикум по работе с протоколом BGP NoSQL Супер-практикум по использованию и настройке GIT Супер-интенсив «СУБД в высоконагруженных системах» Экспресс-курс «IaC Ansible»
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

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

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

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

Для вывода данных задействуем функцию 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 комментариев
Для комментирования необходимо авторизоваться