Разница между ASLR и пирогом - PullRequest
0 голосов
/ 18 февраля 2019

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

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

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

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

Спасибо

1 Ответ

0 голосов
/ 18 февраля 2019

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 байт.

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

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

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

...