Условные операторы и операторы выбора | OTUS
🚀 OTUS Fest 2021
Бесплатная образовательная онлайн-конференция для IT-специалистов.
Подробнее

Курсы

Программирование
Backend-разработчик на PHP
-9%
Алгоритмы и структуры данных
-9%
Team Lead
-6%
Архитектура и шаблоны проектирования Разработчик IoT
-13%
C# Developer. Professional
-9%
HTML/CSS
-11%
C# ASP.NET Core разработчик
-5%
Kotlin Backend Developer
-8%
iOS Developer. Professional
-8%
Java Developer. Basic C++ Developer. Professional Web-разработчик на Python MS SQL Server Developer Android Developer. Basic Разработчик программных роботов (RPA) на базе UiPath и PIX Microservice Architecture Unity Game Developer. Basic Разработчик голосовых ассистентов и чат-ботов React.js Developer Node.js Developer Интенсив «Оптимизация в Java» Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes JavaScript Developer. Basic Unity Game Developer. Professional Супер-интенсив Azure
Инфраструктура
Экспресс-курс «IaC Ansible»
-10%
Administrator Linux.Basic
-10%
Мониторинг и логирование: Zabbix, Prometheus, ELK
-10%
Экспресс-курс «CI/CD или Непрерывная поставка с Docker и Kubernetes»
-30%
Administrator Linux. Professional
-6%
Дизайн сетей ЦОД
-13%
NoSQL Основы Windows Server MS SQL Server Developer Инфраструктурная платформа на основе Kubernetes Cloud Solution Architecture Highload Architect Разработчик голосовых ассистентов и чат-ботов VOIP инженер Супер-практикум по работе с протоколом BGP Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Супер-интенсив "Tarantool"
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

Условные операторы и операторы выбора

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

Условные операторы

В первую очередь рассмотрим код условного оператора:

1_rGQGknNHvN75z1LIYj1Ypw_1-1801-0d415f.jpeg

Данная функция генерирует рандомное число в диапазоне 0-20, сохраняя получаемое значение в переменной А. Когда А больше 15, программа выводит «greater than 15». Когда меньше 15, но больше 10 — выводится «less than 15, greater than 10». Когда меньше 5 — «less than 5», соответственно.

Теперь давайте глянем на ассемблерный граф для условного оператора:

1_7zAB7BvIgCo2dRw1PlJMuw_1-1801-da55fd.jpeg

Можно заметить, что граф структурирован аналогично фактическому коду, так как сам условный оператор выглядит просто: «Если X, то Y, иначе Z». Когда мы посмотрим на первую верхнюю пару стрелок, то увидим, что оператору предшествует сравнение А с 0F — в десятичной системе счисления это 15. Если же А больше либо равно 15, подпрограмма выводит «greater than 15» и возвращается в основную программу. В ином случае происходит сравнение А с 0A (1010). Так продолжается, пока программа не выведет что-либо на экран и не вернётся.

Оператор выбора

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

1_EdZWUKerZnKYHydHdGzUww_1-1801-5dfeac.jpeg

В данной функции переменная А получает рандомное значение в диапазоне 0-10. Потом А сравнивается с несколькими случаями, применяя switch. Когда значение А будет равняться одному из случаев, на экране появится соответствующее число, после чего произойдёт выход из оператора выбора с последующим возвратом в основную программу.

Тут есть нюанс: в отличие от условного оператора, этот оператор не следует правилу «Если X, то Y, иначе Z». В данном случае программа ведет себя несколько иначе, сравнивая входное значение с существующими случаями и выполняя лишь тот случай, который отвечает входному значению. Чтобы это понять, лучше рассмотреть 2 первых блока подробней:

reverse26_1-1801-28378b.jpeg

Итак, сначала генерируется рандомное число, которое записывается в А. Потом программа инициализирует оператор выбора, приравнивая временную переменную var_D0 к А. Далее программа осуществляет проверку, что она равна хотя бы одному из имеющихся случаев. Когда var_D0 требуется дефолтное значение, программа идет по зеленой стрелке в секцию, где происходит окончательный возврат из подпрограммы. В обратном случае программа совершает переход в нужный case.

reverse27_1-1801-b34736.jpeg

Когда var_D0 (A) равно 5, код переходит в секцию, показанную выше, выводит «5», а потом переходит в секцию возврата.

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

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

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

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

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