2010-08-14 1 views
8

Я читаю Взлом: Искусство эксплуатации (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. На самом деле он был еще выше. Почему это? Что я делаю не так?

+6

Компилятор будет стремиться упорядочивать переменные в порядке уменьшения требований к выравниванию для минимизации заполнения. Тем не менее, странно, что 'int' всегда выше и не всегда ниже.Во всяком случае, вы не можете зависеть от порядка объявления, делающего какую-либо разницу, поэтому это странный момент для книги. Престижность для проведения эксперимента и поиска BS. – Potatoswatter

+0

Кроме того, добро пожаловать в SO и +1 для красноречивой формулировки. – Potatoswatter

+3

Интересно, почему Potatoswatter не отправил свой комментарий в качестве ответа ... –

ответ

1

Компиляторы могут изменять переменные по своему усмотрению. Я считаю, что единственное ограничение в порядке элементов структуры. Они должны быть в памяти в том же порядке, что и в структуре.

5

Компилятор может выбрать любой желаемый порядок, чтобы обеспечить более оптимальный код или даже просто случайный, поскольку его проще реализовать. Одна вещь, которую вы можете попробовать, это флаг -O0, который отключает все оптимизации.

0

Apple, имеет функцию безопасности, чтобы предотвратить только тип взлома вам говорят о - Существует определенная степень рандомизации, где все хранится в памяти, поэтому вы не можете, например, найти память, выделенную для определенной программы, и перейти на 1502-й te, где сидит функция открытия блокировок хранилища высокой безопасности, потому что она не всегда находится в одном и том же месте в памяти.

См. http://en.wikipedia.org/wiki/Address_space_layout_randomization для получения подробной информации о том, как это работает.

Смешное совпадение, что вы столкнулись с этим, и что Мэтт Столяр наткнулся на ответ, пытаясь сжечь яблоко.

+0

С другой стороны ... вы сказали, что Ubuntu является активной ОС? Я мог быть совершенно неправ, если это так. –

+3

Во-первых, ОП сказал, что он запускает эксперимент в VM Ubuntu. Во-вторых, Ubuntu также поддерживает ASLR. И в-третьих, ASLR рандомизирует базу стека, но не рандомизирует относительные позиции двух переменных стека. – caf