12.07.2015 Views

img - Xakep Online

img - Xakep Online

img - Xakep Online

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

ВЗЛОМИщем наш шеллкод и изменения в немEgghunter в действиирезультате (то есть, access violation) прыгаем в начало шеллкода дляперехода на следующую страницу. Перед этим, конечно, вынимаемEDX из стека.Далее идет побайтовое сравнение. Здесь 0x77303074 — это тэг (можетбыть «любой», тут — «w00t»), который должен находиться перед основнымшеллкодом. Его мы помещаем в EAX, а в EDI помещаем адресиз EDX. SCASD сравнивает значение из EAX c тем, что находится поадресу в EDI. В случае неудачи мы перемещаемся обратно на вторуюстрочку шеллкода, где значение EDX увеличивается на единицу, аостальное повторяется заново.Повторное использование SCASD требуется, чтобы еще раз найти тэгсразу после первого. При использовании оператора SCASD указательна память в EDI сдвигается, поэтому мы сразу прыгаем в начало нашегоосновного шеллкода, используя jmp edi.Почему же я упомянул какую-то половинку в паре абзацеввыше? Да это к тому, что вместо описанной skape’ом функцииNtDisplayString можно использовать более позднюю придумку —NtAccessCheckAndAuditAlarm. Фактически разница в коде будет лишьв номере вызываемой функции.Вместо для NtDisplayString:00000007 6A43 push byte +0x43Должно быть для NtAccessCheckAndAuditAlarm:00000007 6A02 push byte +0x2Бонус от использования NtAccessCheckAndAuditAlarm в «постоянстве».Смещение(0x43h), которое используется для вызова системнойфункции для NtDisplayString вроде как меняется в последних версияхОС.ISBADREADPTRЭта техника использует стандартную API-функцию для проверки доступак виртуальной памяти.Вид функции следующий:BOOL IsBadReadPtr(const VOID* lp,UINT_PTR ucb);То есть, нам требуется при вызове функции данные передавать черезстек.Логика работы этой техники аналогична предыдущей, поэтому лишькратко пробегусь по коду.06800000000 33DB xor ebx,ebx00000002 6681CBFF0F or bx,0xfff00000007 43 inc ebx00000008 6A08 push byte +0x80000000A 53push ebx0000000B B80D5BE777 mov eax,0x77e75b0d00000010 FFD0 call eax00000012 85C0 test eax,eax00000014 75EC jnz 0x200000016 B890509050 mov eax, 0x773030740000001B 8BFBmov edi,ebx0000001D AFscasd0000001E 75E7jnz 0x700000020 AF scasd00000021 75E4 jnz 0x700000023 FFE7 jmp ediПервые три строчки — выравнивание EBX под размер страницы ипобайтовый проход по доступной памяти. Далее складываем аргументык функции, где 0x8h — ucb-аргумент, а EBX — проверяемыйадрес в памяти. В EAX запихиваем адрес IsBadReadPtr в виртуальнойпамяти процесса. Это самый большой недостаток данной техники,так как положение функции будет меняться в зависимости отверсии, сервис-пака, языка системы, не говоря уж о рандомизациипространства. Если значение в EAX не равно нулю, то происходитпереход к следующей странице памяти. Остальная часть кода аналогичнапредыдущей технике.Последняя техника основывается на использовании SEH, но я тебе оней не расскажу, так как и получаемый иггхантер большой по размеру(60 байт), и, главное, начиная с XP SP2 для ее эксплуатации приходитсяобходить защиту SEH'а, что делает ее в большинстве случаев неюзабельной.ÅÙÅ ÏÀÐÀ ÌÎÌÅÍÒÎÂИспользованием сдвоенного тэга (яйца) обусловлено еще и тем, чтоиггхантинг может найти сам себя (тэг в своем теле) до нахождениятэга, стоящего перед основным шеллкодом, и передать туда управление,что нам не требуется.Так как мы используем SCASD, то необходимо отслеживать, чтобыфлаг направления (D) был сброшен, иначе поиск будет происходитьв обратном направлении, что приведет к неправильнойработе иггхантера и вылету процесса. Но такое бывает оченьредко и исправляется добавлением команды сброса флага направления— CDL.XÀÊÅÐ 08 /139/ 10

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!