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), поэтому проверьте это также вручную.

Другие вопросы по тегам