Итак, я участвовал в picoCTF 2018 (он уже закончился), и у меня возникли проблемы с пониманием проблемы простой сборки (25-я проблема - Assembly-0).Вопрос в том, что возвращает эта функция, когда мы делаем asm0(0xc9,0xb0)
.Но так как это совершенно ново для меня (хотя я знаю несколько языков программирования), я не уверен, правильно ли я понимаю каждую инструкцию.Поэтому я буду очень рад каждому исправлению моих предположений.
.intel_syntax noprefix
.bits 32
.global asm0
asm0:
push ebp
mov ebp,esp
mov eax,DWORD PTR [ebp+0x8]
mov ebx,DWORD PTR [ebp+0xc]
mov eax,ebx
mov esp,ebp
pop ebp
ret
Поэтому, если мое понимание правильное, инструкция push ebp
просто помещает значение указателя (некоторый адрес) в стек.Мы не знаем, каково это значение, и эта инструкция, скорее всего, просто испортит новичков, таких как я.
Вторая команда перемещает значение esp
в ebp
.Третья и четвертая инструкции читают входные параметры, которые автоматически помещаются в стек, когда мы вызываем функцию.Затем в пятой инструкции мы перемещаем значение ebx
в eax
, так что теперь оба равны 0xb0
.
Теперь идет часть, в которой я не уверен.Я бы сказал, что инструкция mov esp,ebp
не важна, и мы можем ее опустить, поскольку значения esp
и ebp
не изменились по сравнению со второй инструкцией.
Но pop ebp
важен, так как мы хотимчтобы избавиться от случайного адреса, который мы поместили в стек в начале.
И мой вопрос: какую переменную мы сейчас возвращаем?eax
или ebx
?Я думаю, что это должно быть eax
, так как оно выше в стеке.Другой вопрос, который мне приходит в голову, заключается в том, действительно ли значение указателя ebp
равно 0xb0
и означает ли это, что он указывает на какой-то случайный адрес, о котором мы ничего не знаем.Большое спасибо!