Я читаю Взлом: Искусство эксплуатации (2-е издание), и я сейчас в разделе о переполнении буфера.Почему переменная int не возникает перед массивом char с точки зрения адресации, независимо от того, как я ее код в C?
В первом примере объявляются переменные/инициализируются в следующем порядке:
int auth_flag = 0;
char password_buffer[16];
пример продолжает объяснять, что вы можете использовать GDB для изучения auth_flag
и password_buffer
«ы адреса, и вы будете обратите внимание, что адрес auth_flag
превышает password_buffer
. Что нужно помнить: я запускаю все это в Ubuntu в Virtualbox на Macbook Pro (процессор Intel, 64-разрядный).
я скомпилированный код в первом примере как это: gcc -g -fno-stack-protector -o auth_overflow auth_overflow.c
Как и следовало ожидать, auth_flag
Адрес выше password_buffer
's.
Чтобы устранить эту проблему, представленную выше, автор объясняет, вы должны переключить порядок объявлений:
char password_buffer[16];
int auth_flag = 0;
Я скомпилировал код таким же образом: gcc -g -fno-stack-protector -o auth_overflow2 auth_overflow2.c
К сожалению, я не видел auth_flag
Адрес меньше password_buffer
. На самом деле он был еще выше. Почему это? Что я делаю не так?
Компилятор будет стремиться упорядочивать переменные в порядке уменьшения требований к выравниванию для минимизации заполнения. Тем не менее, странно, что 'int' всегда выше и не всегда ниже.Во всяком случае, вы не можете зависеть от порядка объявления, делающего какую-либо разницу, поэтому это странный момент для книги. Престижность для проведения эксперимента и поиска BS. – Potatoswatter
Кроме того, добро пожаловать в SO и +1 для красноречивой формулировки. – Potatoswatter
Интересно, почему Potatoswatter не отправил свой комментарий в качестве ответа ... –