나는 뒤로 건너 뛰어야 할 쉘 코드를 만들려고한다. 2400 바이트 뒤로 건너 뛰고 싶습니다. 그리고 이것은 연산 코드가 내가 사용하는 것입니다 :음수 점프를위한 Opcode
\x90\xE9\x98\xef
이 먼저 nop
다음 -4200에 가까운 점프입니다. 0xef98 = -4200 (적어도 내가 생각하는 것). 그러나 디버거에는 다음과 같습니다
0:142> t
eax=00000000 ebx=7c9032a8 ecx=02a8eb70 edx=7c9032bc esi=00000000 edi=00000000
eip=02a8ffac esp=02a8ea94 ebp=02a8eaa8 iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
02a8ffac 90 nop
0:142> t
eax=00000000 ebx=7c9032a8 ecx=02a8eb70 edx=7c9032bc esi=00000000 edi=00000000
eip=02a8ffad esp=02a8ea94 ebp=02a8eaa8 iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
02a8ffad e998efcccc jmp cf75ef4a
JMP 만에 뛰어 주소가 나는 (jmp 02A8EF45
같은 내가 생각했던 어떤 것) 무엇을 기대하지 않습니다 먼저는 NOP 및 예상대로. 내가 뭘 잘못했는지 알 수 있습니까?
아, 고마워. 32 비트 피연산자로 변경되어 작동합니다. 16 비트 피연산자를 원한다는 것을 어떻게 지정할 수 있습니까? Intel Manual vol 2에서 발견했습니다 : "상대 오프셋을 사용할 때, opcode (근접 점프 대 near 점프)와 피연산자 크기 속성 (근접 상대 점프)은 대상 피연산자의 크기를 결정합니다 (8, 16 또는 32 비트). " 쇼트 점프는 다른 연산 코드가 있지만 16 비트와 32 비트 피연산자를 구분하는 방법을 알지 못합니다. – rdrmntn
@ jortan : 명령 앞에 0x66 접두사 바이트를 넣습니다. 따라서 '0x66 0xe9 0x98 0xfc'입니다. 어셈블러에 의존하는 코드 작성 방법. 'jmp short' 또는'jmp near'와 같은 것입니다. 당신이 그것을 볼 필요가 있습니다. –