В 32-битном x86 аргументы передаются в стек в соответствии с соглашением о вызовах cdecl IA32 (для получения дополнительной информации см. эту вики-страницу ).
Ваша phase_1
функция вызывает sscanf()
, передавая аргументы здесь:
0x08048bdb <+11>: lea 0x1c(%esp),%eax
0x08048bdf <+15>: mov %eax,0x8(%esp)
0x08048be3 <+19>: movl $0x804a644,0x4(%esp)
0x08048beb <+27>: mov 0x30(%esp),%eax
0x08048bef <+31>: mov %eax,(%esp)
Вкратце:
sscanf(esp + 0x30, 0x804a644, esp + 0x1c);
Что должно быть что-то вроде:
int var_on_stack;
sscanf(user_input, "%d", &var_on_stack);
// user_input starts at esp + 0x30
// &var_on_stack == esp + 0x1c
Первый аргумент (user_input
), вероятно, был передан в качестве аргумента функции phase_1
, и он, вероятно, содержит данные, которые были ранее прочитаны.
Значение 0x804a644
является адресом формата строка, которая передается в scanf()
, я предполагаю, что это что-то вроде "%d"
, потому что значение обрабатывается как целое число впоследствии. Вы можете проверить, что находится по адресу 0x804a644
с помощью x/s 0x804a644
, чтобы точно узнать, что такое строка формата (а также понять тип читаемой переменной).
После этого эти две инструкции:
0x08048c01 <+49>: mov 0x1c(%esp),%eax
0x08048c05 <+53>: lea (%eax,%eax,2),%eax
Получите отсканированное значение из стека в eax
, а затем умножьте его на 3
(что lea
в конечном итоге приведет к eax = eax*2 + eax
).
После этого значение сравнивается с 0x52b
. Поэтому вам нужно ввести 0x52b/3
, то есть 1323/3
, то есть 441
.