Читаем Защита от хакеров корпоративных сетей полностью

Рис. 8.21. Указатель команды должен указывать на реальную команду

Скрытый переход. Если хранимое на вершине стека значение не является адресом атакуемого буфера, то для передачи управления программному коду полезной нагрузки можно воспользоваться способом скрытого перехода (pop return). Способ скрытого перехода позволяет загрузить в регистр EIP нужный адрес при помощи последовательности команд pop, завершающейся командой ret, как это показано на рис. 8.22. Последовательность команд pop выталкивает из стека несколько значений до тех пор, пока не придет очередь нужного адреса, который и загружается командой ret в регистр EIP. Способ целесообразно использовать, если искомый адрес находится недалеко от вершины стека. Насколько известно, способ скрытого перехода использован в общедоступной программе переполнения буфера информационного сервера Интернет IIS.

Рис. 8.22. Использование команд pop и ret для получения адреса перехода

– pop EAX 58

– pop EBX 5B

– pop ECX 59

– pop EDX 5A

– pop EBP 5D

– pop ESI 5E

– pop EDI 5F

– ret C3

Переход по содержимому регистра. Способ перехода по содержимому регистра (call register) применяется, если в регистре содержится адрес необходимого программного кода полезной нагрузки. В этом случае в регистр EIP загружается указатель на команду при выполнении команды call EDX, call EDI или ee эквивалента (в зависимости от регистра, в который загружен указатель на программу).

– call EAX FF D0

– call EBX FF D3

– call ECX FF D1

– call EDX FF D2

– call ESI FF D6

– call EDI FF D7

– call ESP FF D4

При просмотре памяти процесса из библиотеки KERNEL32. DLL были найдены следующие подходящие пары шестнадцатеричных байтов:

77F1A2F7 FF D0 call EAX

77F76231 FF D0 call EAX

7FFD29A7 FF D0 call EAX ; a whole block of this pattern exists

7FFD2DE3 FF E6 jmp ESI ; a whole block of this pattern exists

7FFD2E27 FF E0 jmp EAX ; a whole block of this pattern exists

77F3D793 FF D1 call ECX

77F7CEA7 FF D1 call ECX

77F94510 FF D1 call ECX

77F1B424 FF D3 call EBX

77F1B443 FF D3 call EBX

77F1B497 FF D3 call EBX

77F3D8F3 FF D3 call EBX

77F63D01 FF D3 call EBX

77F9B14F FF D4 call ESP

77F020B0 FF D6 call ESI

77F020D5 FF D6 call ESI

77F02102 FF D6 call ESI

77F27CAD FF D6 call ESI

77F27CC2 FF D6 call ESI

77F27CDB FF D6 call ESI

77F01089 FF D7 call EDI

77F01129 FF D7 call EDI

77F01135 FF D7 call EDI

Эти пары шестнадцатеричных байтов могут быть использованы практически в любой программе. Но поскольку найденные пары шестнадцатеричных байтов – часть интерфейса ядра динамически подключаемой библиотеки DLL, то обычно они находятся по фиксированным адресам памяти, которые можно жестко запрограммировать. Имейте в виду, что в различных версиях Windows и, возможно, версиях служебных пакетов Service Pack они могут отличаться. Переход по только что записанному в стек адресу. Способ перехода по только что записанному в стек адресу (push return) слегка отличается от предыдущего, хотя и в нем используется значение, сохраненное в регистре. Различие состоит в использовании вместо команды ret команды call. Если известно, что адрес перехода загружен в регистр EAX, EBX, ECX, EDX, EBP, ESI или EDI, но команду call найти не удается, то попробуйте найти в двоичном коде пару команд push <регистр> и ret.

– push EAX 50

– push EBX 53

– push ECX 51

– push EDX 52

– push EBP 55

– push ESI 56

– push EDI 57

– ret C3

В динамически подключаемой библиотеке Kernel32.DLL содержатся следующие подходящие пары шестнадцатеричных байтов:

77F3FD18 push EDI

77F3FD19 ret

(?)

77F8E3A8 push ESP

77F8E3A9 ret

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже