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

Необычное поведение NtSetCоntextThread под WOW64

arsarsov

(L2) cache
Пользователь
Регистрация
07.08.2022
Сообщения
460
Реакции
272
В общем есть такой код, который получает контекст в коде под WoW64 в двух вариациях
1662732766004.png
первая функция - обычный вызов юзермодной Api, получает контекст в формате 32 бит
вторая функция переходит через Heavens Gate в режим W64onWoW64 и получает контекст того же самого потока через прямой сискол уже в формате 64 бит
После вызовов получаем такие результаты для замороженного (приостановленного процесса)
1662733194117.png


Так для справки - эксперименты проходят в контексте RunPE через сисколы под WOW64
С получением контекста все ок
Но при попытке установить контекст (NtSetCоntextThread) из режима W64onWoW64 и последующим стартом замороженного процесса на старте в контекст укладывается только RDX -> EBX, а вот RCX -> EAX не устанавливается
То есть сразу после записи контекста еще до разморозки процесса, то что записывается в RDX автоматом переносится в EBX (там содержится адрес PEB и загрузчик начинает плясать оттуда и настраивает процесс, с этой частью все ок), а вот то, что записывается в RCX в EAX не переносится, там остается старое значение EntryPoint и после разморозки процесса он стартует не там где надо, соответственно процесс настроен так, что бы работать по новой базе и EP, но точка входа вызывается не та, если на этом этапе вручную в отладчике указать нормальную точку входа в EAX, то процесс стартует и работает без нареканий
Если контекст устанавливать просто через SetThreadContext, без перехода 86->64 через ХевинГейт, то в таком случае установка контекста работает нормально(Еще бы, конечно работает, дергаем юзермод апишки)
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
То есть сразу после записи контекста еще до разморозки процесса, то что записывается в RDX автоматом переносится в EBX (там содержится адрес PEB и загрузчик начинает плясать оттуда и настраивает процесс, с этой частью все ок), а вот то, что записывается в RCX в EAX не переносится, там остается старое значение EntryPoint и после разморозки процесса он стартует не там где надо, соответственно процесс настроен так, что бы работать по новой базе и EP, но точка входа вызывается не та, если на этом этапе вручную в отладчике указать нормальную точку входа в EAX, то процесс стартует и работает без нареканий
На самом деле, мне скорее странно, что RDX переносится в EBX, чем то, что RCX не переносится в EAX. Я бы просто дернул Wow64SetThreadContext из 64-битного режима, или вообще бы не переходил в 64-битный режим, если RunPE инжектит код из 32-битного процесса в новый 32-битный процесс. Надо еще не забыть, что PEB'ов в Wow64-процессе два, и корректировать после инжекта их нужно оба, а то процесс будет падать.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
На самом деле, мне скорее странно, что RDX переносится в EBX, чем то, что RCX не переносится в EAX
там действительно есть такое, при смене wow64 контекста, недавно кое что другое реверсил, код
C:
 memset(&ContextX64, 0, 0x4D0ui64);
v20 = ContextX86->Eip;
ContextX64.Rcx = ContextX86->Eax;
ContextX64.Rdx = ContextX86->Ebx;
ContextX64.R8 = ContextX86->Esp;
ContextX64.Rip = v20;
ContextX64.ContextFlags = 1048579;
v19 = NtCreateThread(v11, v10, v9, v8, a5, &ContextX64, v12, 1);
почему регистры другие - хз, но факт
 
На самом деле, мне скорее странно, что RDX переносится в EBX, чем то, что RCX не переносится в EAX. Я бы просто дернул Wow64SetThreadContext из 64-битного режима, или вообще бы не переходил в 64-битный режим, если RunPE инжектит код из 32-битного процесса в новый 32-битный процесс. Надо еще не забыть, что PEB'ов в Wow64-процессе два, и корректировать после инжекта их нужно оба, а то процесс будет падать.
Все это (PEB) естественно предусмотрено, падает исключитеьно только из-за неверной настройки EAX, если вручную его поправить после смены контекста и дать дальше отработать коду то все нормально, все упирается исключительно в EAX
 
Последнее редактирование:
UP: Вопрос актуален, пока что так и не разобрался в нем
 


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