JMP rel16 (вместо JMP rel32)
Мне нужно сделать опкод перехода для демонстрации эксплойта.
Мне нужно перейти около 200 байт после инструкции перехода. Это слишком много для jmp short
,
Если я сгенерирую код операции с регулярным переходом, jmp $200
Я получаю это:
e9 fb 01 00 00
Проблема здесь в том, что код операции содержит 00, который интерпретируется как конец строки при передаче строки в программу (поэтому я не могу передать полный шелл-код с этим в нем).
Я думал, что мой подход был испорчен, но затем я проверил руководство, и во второй строке, по-видимому, "ближний переход", который занимает 2 байта (есть также другой, который занимает 4 байта, тот, который я показал выше). Оба этих перехода начинаются с одного и того же байта, e9
,
Как я могу пройти e9 fb 01
как ближний переход, который принимает только два байта аргументов? Как запретить ОС искать четыре байта после e9
т.е. e9 fb 01 90 90
?
2 ответа
Ты не можешь.
Код операции 0xE9 использует 32-разрядное смещение, когда процессор работает в 32-разрядном режиме, и 16-разрядное смещение, только когда процессор находится в 16-разрядном режиме.
Если у вас есть доступ к текущему адресу EIP внутри шелл-кода и область памяти доступна для записи, вы можете сделать что-то вроде этого:
; say in ECX you have shellcode start address
; (calculated with delta offset etc.)
_start:
...
; ECX = offset _start
; decrypt zero bytes in jmp instruction relative address
; 80 69 xx AB
sub byte ptr[ecx+(_fix1-_start)], 0ABh
; 80 69 xx+1 BA
sub byte ptr[ecx+(_fix2-_start) + 1], 0BAh
; jmp instruction with those 00s encrypted
_jmp db 0E9h, 0FBh, 01h ; first 3 bytes of jmp near instruction
_fix1 db 0 + 0ABh ; encrypted displacement (last 2 bytes)
_fix2 db 0 + 0BAh
Так что относительный адрес закодирован в jmp near
инструкция не содержит 00, но во время выполнения эти байты восстанавливаются.
Имейте в виду, что инструкция дешифрования может содержать также 00, если разница с расчетом (_fix1-_start)
содержит нули, более вероятно, если сгенерированная инструкция является длинной формой sub [r32 + imm32], imm8), поэтому проверьте это также вручную.