Объявление массива в разобранном коде
Я пытаюсь разобрать 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
инструкция.