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?
На самом деле, это не должнобыть проблемой, потому что это вопрос случайного размещения ресурсов, выделенных самой ОС.Так что либо вы уже получили указатель от него, и с вашей точки зрения ничего не изменилось, либо система должна правильно настроить правильные регистры, например, при настройке стека перед запуском вашего процесса.