Объявление массива в разобранном коде

Я пытаюсь разобрать ropasaurusrex. это вопрос CTF. Вы можете скачать исполняемый файл по следующей ссылке. Я использую Хоппер для разборки. Вот

Картинка выше является основной рутиной этой программы.

Пожалуйста, посмотрите на красную линию на картинке выше.

Кажется, что объявление массива здесь.

lea eax, dword [ss:ebp+var_88] =====> char buffer[128];

Зачем? Я не могу понять 128 байтов?

1 ответ

Решение

Вообще, нет никакого прямого соответствия между отдельными инструкциями по сборке и конструкциями C. Одна инструкция может быть просто одним "кирпичиком" из более крупной конструкции. Если оптимизация включена, отслеживание вещей таким образом становится еще сложнее.

Рассматривая первую процедуру, вот пошаговое руководство инструкция за инструкцией:

  • push ebp сохраняет старый "указатель базы стека" в стеке, чтобы его можно было восстановить после выхода из функции, и вызывающая сторона может быть уверена, что он не изменился;

  • mov ebp, esp загружает значение "базового указателя" с текущим значением "указателя стека". Любые дальнейшие ссылки на переменные в пределах стекового фрейма этой функции могут быть сделаны относительно этого вновь назначенного базового указателя;

  • sub esp, 0x98 вычитает значение 152 из указателя стека. Это эффективно "выделяет" пространство в стеке. Любые переменные с автоматическим хранением теперь могут быть размещены между адресами, на которые указывает ebp а также esp, Это, вероятно, включает в себя ваш buffer массив.

  • mov dword[ss:esp + 8], 0x100 ставит значение 256 по адресу, указанному esp + 8, Это может соответствовать присвоению автоматической переменной / массиву.

  • lea eax, dword[ss:ebp + var_88] вычисляет адрес, который является результатом базового указателя плюс некоторое постоянное смещение, и сохраняет его в eax, Это, вероятно, соответствует указателю на начало автоматического массива.

  • eax затем перемещается в стек в качестве аргумента для следующего вызова j_read, 0 также передается в качестве первого аргумента. Затем вызывается функция, инструкция выхода восстанавливает старый базовый указатель, а элемент управления возвращается вызывающей стороне через ret инструкция.

Другие вопросы по тегам