среда, 15 сентября 2010 г.

aslr

дико угарная технология - с одной стороны мы помещаем ntdll.dll в память по псевдослучайным адресам (на самом деле их 256 штук всего, так что анекдот про миллиард кетайцев, вводящих пароль на сервере пентагона - это грустная реальность), а с другой
  • адрес ntdll.dll одинаков во всех процессах. Ибо ядро при старте зачитывает некоторое количество экспортируемых из ntdll функций и периодически вызывает их просто по указателю
  • если например в результате 256ой попытки эксплойт наконец получил управление - то можно получить TEB, из него PEB и дальше пройтись по списку PEB.Ldr.InLoadOrderModuleList например - там все указатели лежат в открытом виде (даже RtlEncodePointer не используется, в чем может убедиться любой желающий, продизассемблировав например функцию ntdll LdrpUpdateOrderLinks). Код уместится байт в 60 примерно
Если кто не читал например - дичайше рекомендую

1 комментарий:

  1. 256 попыток, обычно, бывает только в относительно редких случаях: например, при атаке сетевого демона, форкнутый дочерний процесс которого можно аварийно завершить без вреда для родительского (был даже в публичных источниках эксплойт для Apache+PHP, который брутфорсом ASLR обходил). Схожих условий для атаки клиентских приложений (браузеры, итд.) мне, к сожалению, не встречалось.

    ОтветитьУдалить