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

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

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

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

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

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

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

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

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

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

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

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

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

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

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