• XSS.stack #1 – первый литературный журнал от юзеров форума

Отложенная передача управления.

спс за подробное и интересное инфо , насколько реально воплотить в жизнь любой из них ? какие проблемы могут возникнуть, совместимость XP, Vista, 7 ? Так понимается что для каждой api для перехвата нужно подходить индивидуально ?
Можно ли увидеть сэмпл одной из реализованных техник - например, дллка которая будет перехватывать CreateFileW, send, wsasend и чтобы выводило лог в файл или отладочную консоль
 
каким из предложенных Indy 3-x способов можно подцепится к send/WSASend я не увидел, вернее не стал смотреть взглянув на дизасм этих фунок
send:
Код:
CPU Disasm
Address   Hex dump                   Command                                                        Comments
71A94C27    8BFF                     MOV EDI,EDI
71A94C29    55                       PUSH EBP
71A94C2A    8BEC                     MOV EBP,ESP
71A94C2C    83EC 10                  SUB ESP,10
71A94C2F    56                       PUSH ESI
71A94C30    57                       PUSH EDI
71A94C31    33FF                     XOR EDI,EDI
71A94C33    813D 5040AA71 292CA971   CMP DWORD PTR DS:[71AA4050],71A92C29
71A94C3D    0F84 256A0000            JE 71A9B668
71A94C43    8D45 F8                  LEA EAX,[EBP-8]
71A94C46    50                       PUSH EAX
71A94C47    E8 67F0FFFF              CALL 71A93CB3	<--- here
WSASend:
Код:
CPU Disasm
Address   Hex dump                   Command                                                        Comments
71A968FA    8BFF                     MOV EDI,EDI
71A968FC    55                       PUSH EBP
71A968FD    8BEC                     MOV EBP,ESP
71A968FF    51                       PUSH ECX
71A96900    51                       PUSH ECX
71A96901    813D 5040AA71 292CA971   CMP DWORD PTR DS:[71AA4050],71A92C29
71A9690B    56                       PUSH ESI
71A9690C    0F84 CD4D0000            JE 71A9B6DF
71A96912    8D45 F8                  LEA EAX,[EBP-8]
71A96915    50                       PUSH EAX
71A96916    E8 98D3FFFF              CALL 71A93CB3	<--- here

offset 0x71A93CB3:
Код:
CPU Disasm
Address   Hex dump                   Command                                                        Comments
71A93CB3    8BFF                     MOV EDI,EDI
71A93CB5    55                       PUSH EBP
71A93CB6    8BEC                     MOV EBP,ESP
71A93CB8    FF75 08                  PUSH DWORD PTR SS:[EBP+8]
71A93CBB    8D45 08                  LEA EAX,[EBP+8]
71A93CBE    50                       PUSH EAX
71A93CBF    FF15 5040AA71            CALL DWORD PTR DS:[71AA4050]	<--- here
71A93CC5    5D                       POP EBP
71A93CC6    C2 0400                  RETN 4
т.е. безпалева получить управление можно потрейсив до "send/WSASend -> CALL 71A93CB3 -> CALL DWORD PTR DS:[71AA4050]", подменить содержимое DS:[71AA4050] указателем на свою функу, оно ведь в секции данных лежит. в обработчике выполнить бектрейс по стеку до send/WSASend, обработать параметры и передать управление на заранее сохраненный указатель. но это только теория.

еще можно приглядеться к
Код:
CMP DWORD PTR DS:[71AA4050],71A92C29
..
JE ...
по дмампу у нас там вызов TlsGetValue и возможно получится посодействовать появлению сепшена, ну, а дальше как Indy прописал.
ИМХО: плюсов и применений в описаной технике много. из минусов видно только одно: нужен индивидуальный подход к каждой функе + искать совместимость под разными платформами, универсально хукать таким методом не получится.
 
Barack
Мне нужно время чтобы собрать сэмплы. На днях выложу.

accwranadm
ИМХО: плюсов и применений в описаной технике много. из минусов видно только одно: нужен индивидуальный подход к каждой функе + искать совместимость под разными платформами, универсально хукать таким методом не получится.
Вы не понимаете сути, как и Barack

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

Касательно send/WSASend - есть несколько старых семплов, сейчас я не буду описывать, думаю описать это в виде пакета далее, но вы можите посмотреть если хотите:
:zns5: Скачать|Download
 
greenzy
IDP универсальный способ подходящий под п.2. Иначе необходима эмуляция кода, что требует полноценного дизасма. А это весьма громоздкий код.
 
Мне нужно время чтобы собрать сэмплы. На днях выложу.
будем ждать с нетерпением, очень интересно глянуть.
Касательно send/WSASend - есть несколько старых семплов, сейчас я не буду описывать, думаю описать это в виде пакета далее, но вы можите посмотреть если хотите:
в вашем сэмпле ничего непонятно что перехватывается , что логируется или подменяется
-> UrlDownloadToFile google.ru e:\1.html - хотя бы подменили бы на yandex.ru или как-то логировались параметры.
пишите подробней что делает сэмпл

Код:
CreateProcessInternalA:
CreateProcessInternalW()
Ret

CreateProcessInternalW:
...
ZwCreateProcessEx()
ZwCreateThread()
CsrClientCallServer(BasepCreateProcess)
ZwResumeThread()
Ret


В CsrClientCallServer() проверяется, является ли текущий процесс серверным(Csrss), если это так, то вызывается колбек ntdll!CsrServerApiRoutine. Сигнализируем переменную CsrServerProcess и регистрируем колбек в CsrServerApiRoutine. Из этого колбека выполняем следующие действия:


- Проверяем причину вызова. Нас интересует сервис BasepCreateProcess.
- Если это так, то выполняем стековую маршрутизацию. Находим адрес возврата из CreateProcess(), выполнив бактрейс и заменяем в найденном фрейме ссылку на свой код.
- Сигнализируем в локальном фрейме процедуры CreateProcessInternalW флаг CREATE_SUSPENDED.

После этого процесс будет создан остановленным и при возврате из CreateProcess() управление получит наш код. Также можно перенести в буфер CreateProcessInternalW() и туда передать управление, тогда не будет проблем с поиском флагов, так как можно затереть ZwResumeThread().
я уже сейчас вижу как все кодеры закинули сплайсы и начали такой мозгоеблей заниматься :D
Вся идея абсолютно понятна на вашем примере CreateProcess, все красиво , но требует нехилого знания недокументированных внутренностей и нестандартного кодеса, многие к тому же принципиально против лезть дальше msdn, сорцы nt ни разу не держали в руках.

Это может быть место в коде, расположенное в стопяцот вызовов апи от целевого.
но пока дойдет до нашего обработчика уже произойдут нежелательные вызовы (из примера CreateProcess) -> ZwCreateProcessEx() ZwCreateThread() , ну хотя это мелочь если там вернуть какое-то fail значение то хэндлы почистяться или допустим задача следующая, перехватить(CreateProcess) и дать создаться процессу (контроль после ZwResumeThread()), но вернуть какое-то fail значение - опять же нет той универсальности и технологичности , и полного контроля выполнения апишки на всех этапах - поставил сплайс и ты уверен как слон, что все сработает как надо.
Следующий вопрос как таким образом перехватывать Zw* функции, например из кодеса вызывается напрямую юзермодная ZwMapViewOfSection ?
 
Barack
в вашем сэмпле ничего непонятно что перехватывается , что логируется или подменяется
Вы знаете что ws2_32 это обёртка для mswcok, где WSA* сводятся к WSP*, это заглушки, которые выполняют коммуникацию посредством NtDeviceIoControlFile с \Afd.
Вот после всех манипуляций управление получает наш хэндлер WSP(в семпле WSPSend()). Там два типа отложенной передачи управления - стековая маршрутизация и процедурная, это трассировка до нужного места. Ставится заглушка, снифающая пакет и выводящая его через DbgPrint(). Вместо маршрутизации можно смапить копию образа с релокацией(загрузить по другой базе), изменить там код и передать на него управление.

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

но пока дойдет до нашего обработчика уже произойдут нежелательные вызовы (из примера CreateProcess) -> ZwCreateProcessEx() ZwCreateThread()
Я просто пример с Csr привёл чтобы показать принцип, это далеко не лучшее решение. Я бы менеджер хипа использовал для этой цели, так как до его вызова никакие обьекты не создаются. Про нежелательные вызовы - я имел ввиду стопяцот апи не внутри опред функи, а до её вызова. Тоесть есть у вас гдето в коде LoadLibrary() и далеко от неё CreateProcess(), первая станет обьектом, который будет изменён и даст управление при переходе ко второй функе. Это отложенный вызов опятьже.

Следующий вопрос как таким образом перехватывать Zw* функции, например из кодеса вызывается напрямую юзермодная ZwMapViewOfSection ?
Способ есть - например сегмент усекается до USD, тогда при вызове шлюза возникнет фолт Тут и /SysIcp.zip, но это совершенно не имеет отношения к данной теме. Стабы это заглушки к ядру, там нет мест, на которых можно получить управление. При такой необходимости оно получается ранее, чем вызывается необходимый сервис. Тоесть используется ZwMapViewOfSection, ранее есчо чтото юзается и на этом чтото мы получаем управление.
Есть такой функционал, как трассировщик описателей(Handle Tracing). Так вот если выполняется референс на инвалидном описателе и трассировка включена, то возникает фолт /LdrExts.zip - хороший тому пример, вот скрин:

HmTr.png
 
Нард инди не патчит код, он меняет только ту часть памяти у которой есть аттрибуты для чтения и записи, а эта часть не мониторица, так как в любой момент она может быть изменена самой программой. Вот в чем суть то.
 
Barack
Вот семпл, как вы и хотели - CreateFileW() и выводит лог:
:zns5: Скачать|Download
HpIdp.png


Вот код кстати для загрузки копии образа, таким образом, что переменные не изменяются(можно прыгать между проекциями):
:zns5: Скачать|Download
 
to Indy - спасибо за сэмпл, только щас удалось ближе подойти к теме из-за нехватки времени, к сожаленью так и не получилось ловить DbgPrint юзермодный.

Я просто пример с Csr привёл чтобы показать принцип, это далеко не лучшее решение. Я бы менеджер хипа использовал для этой цели, так как до его вызова никакие обьекты не создаются.
очень интересно было бы увидеть вашу логику в этом методе, отпишите когда у вас возможность появиться.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх