адресация памяти - PullRequest
       6

адресация памяти

0 голосов
/ 10 декабря 2010

Например, мы на платформе Windows XP, у нас есть программа A на ollydbg, и мы смотрим на инструкцию x.он имеет адрес 0x11111111 (например). Если я беру программу A и запускаю в ollydbg на другом компьютере с той же платформой, инструкция x будет иметь тот же адрес 0x11111111?Итак, мой вопрос: меняются ли адреса памяти каждый раз, когда запускается программа A?или они изменены на другом компьютере или платформе?

Ответы [ 4 ]

1 голос
/ 10 декабря 2010

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

0 голосов
/ 19 марта 2011

Двоичные файлы Windows PE не зависят от позиции, это означает, что для их выполнения необходимо принять фиксированный адрес.Microsoft делает это для повышения производительности выполнения (за счет штрафов за время загрузки).

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

Перемещение прозрачно для вас, что происходит, если двоичный загрузчик Windows изменяет ваш код и исправляет все адреса, чтобы они работали в новом месте.

0 голосов
/ 10 декабря 2010

В той же версии ОС с тем же исполняемым файлом вы, вероятно, но не обязательно увидите те же адреса кода. Разные версии ОС, менее вероятно.

0 голосов
/ 10 декабря 2010

Зависит от архитектуры, но вы никогда не должны полагаться на одинаковые адреса. Для практических целей ответ - нет.

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

  call test_eip
test_eip:
  pop eax

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

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

Википедия - как всегда - дает отличное объяснение и множество ссылок, на которые следует обратить внимание: http://en.wikipedia.org/wiki/Stack_buffer_overflow

...