Функции, вызовы и строки в дизассемблере
Учимся выделять функции и находить строки — опорные точки анализа.
Пролог функции — несколько инструкций в начале, которые настраивают стек для локальных переменных.
Как узнать функцию
Функция обычно начинается с пролога и заканчивается эпилогом:
my_func:
push rbp ; пролог: сохранить старый базовый указатель
mov rbp, rsp ; настроить кадр стека
; ... тело функции ...
pop rbp ; эпилог: восстановить
ret ; вернуться к вызывающему
Инструкция ret в конце — явный признак конца функции. Вызов — call my_func.
Как передаются аргументы (x86-64)
В 64-битном коде первые аргументы передаются через регистры. На Linux (System V) порядок: rdi, rsi, rdx, rcx, r8, r9. Результат возвращается в rax. Зная это, можно понять, что передают в функцию.
mov edi, 5 ; первый аргумент = 5
mov esi, 3 ; второй аргумент = 3
call add ; вызвать add(5, 3)
; результат теперь в eax/rax
Строки — лучший друг реверсера
Текстовые строки («Введите пароль», «Доступ разрешён», имена файлов, URL) хранятся в данных и часто прямо подсказывают логику. В дизассемблере вызов вроде
lea rdi, [str_wrong_pass] ; адрес строки "Wrong password"
call puts
мгновенно говорит: рядом — проверка пароля.
Как работает под капотом: кадр стека
Пролог push rbp; mov rbp, rsp создаёт «кадр стека» — область для локальных переменных текущей функции. Через rbp к ним обращаются по смещениям ([rbp-4]). При ret процессор берёт со стека адрес возврата (его положил call) и продолжает оттуда.
Частые ошибки
- Не замечать
retи «склеивать» две функции в одну. - Игнорировать строки — а они часто решают задачу.
- Путать порядок регистров-аргументов на Windows и Linux (соглашения разные).
Итог
- Функция: пролог (
push rbp; mov rbp, rsp) … тело … эпилог +ret. - Аргументы в x86-64 Linux:
rdi, rsi, rdx, rcx, r8, r9; результат вrax. - Строки рядом с кодом — мощная подсказка о его назначении.