Разница между ASLR и пирогом

Я не уверен, что пойму разницу между ASLR и PIE.

По моему мнению, ASLR - это опция ОС, а PIE - опция компиляции.

Итак, что произойдет, если я запустил программу без пирога в ОС с включенным ASLR? Что произойдет, если я запускаю программу PIE на ОС с отключенной ASLR?

Работает ли PIE и ASLR одинаково (адреса функций, библиотеки?)

Спасибо

2 ответа

ASLR на самом деле является стратегией, специально предназначенной для ОС, в основном для обхода определенных атак, таких как переполнение буфера, а иногда и для лучшего глобального использования всей памяти. Основная цель - сделать непредсказуемым расположение разных ресурсов.

PIE или PIC, однако, скорее привязаны к набору команд ЦП, и эта проблема особенно важна, когда вы пишете код сборки. Короче говоря, все, что ЦП в основном делает, это чтение данных по некоторым адресам, выполнение простых арифметических и логических операций, запись данных по некоторым другим адресам и переходы в коде.

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

Например, если вам нужно прочитать длинный диапазон данных из памяти, вы загрузите базовый регистр, который указывает начало этого диапазона, а затем проиндексирует его. Но адрес этого диапазона будет определен во время компиляции, следовательно, будет фиксированным. В следующем примере значение "1005" будет загружено в EAX

                                        USE32
                                        ORG     1000h   

 00001000 B8 05 10 00 00                MOV     EAX,data
 00001005 48 65 6C 6C 6F        data:   DB      "Hello"

Это прекрасно работает, но не позволяет переместить код в положение, отличное от того, для которого он был скомпилирован. Если вам нужно сделать это, вам придется написать вместо этого некоторый код, который сначала загружает текущее значение EIP в EAX, а затем добавляет разницу между текущей позицией и целевыми данными.

Это немного усложняет процесс разработки, когда вы делаете это вручную, но также добавляет значительные накладные расходы, делая программу больше и медленнее, что может быстро стать проблемой для небольших микропроцессоров.

На архитектурах x86 и других современных компьютерах, однако, это на самом деле не видно, потому что набор инструкций уже оптимизирован, чтобы быть настолько независимым от позиции, насколько это возможно, и потому что мы имеем преимущество MMU, что позволяет компьютеру запускать все процессы в одном и том же виртуальном адрес.

И даже до этого, даже в реальном режиме, у нас были регистры сегментов. Это позволило программистам перемещать объекты практически везде, где они хотели, с 16-байтовой гранулярностью.

Однако это становится критичным при компиляции разделяемых библиотек, поскольку все они должны быть видны в одном и том же адресном пространстве процесса (и фактически должны быть ЧАСТЬЮ программы).

Итак, что произойдет, если я запустил программу без пирога в ОС с включенным ASLR?

На самом деле, это не должно быть проблемой, потому что это вопрос случайного размещения ресурсов, выделяемых самой ОС. Таким образом, либо вы уже получили указатель от него, и с вашей точки зрения ничего не меняется, либо система должна правильно настроить правильные регистры, например, при настройке стека перед запуском вашего процесса.

ASLR и PIE (или PIC) — две стороны одной медали: PIE — это требование для ASLR.

PIE позволяет размещать код в любом месте памяти, ASLR — это фактическое его случайное позиционирование.

Если программа скомпилирована без PIE, ее разделы текста и данных не могут быть перемещены в памяти, однако ASLR можно применить к стеку, куче и динамическим библиотекам, которые она использует, например libc.

Одним из важных предостережений в отношении этого простого объяснения является то, что Windows может применять ASLR к исполняемым файлам, отличным от PIE, путем внедрения информации о перемещении в исполняемый файл, и эти перемещения разрешаются компоновщиком на лету, когда код загружается в память.

Другие вопросы по тегам