2013-02-17 9 views
3

나는 뒤로 건너 뛰어야 할 쉘 코드를 만들려고한다. 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 및 예상대로. 내가 뭘 잘못했는지 알 수 있습니까?

답변

2

마치 32 비트 오프셋을 사용하여 점프를 코딩하는 것처럼 보입니다. 생성 된 코드 바이트 (샘플의 마지막 라인) 봐 : 프로세서 오프셋 점프로 값 0xccccef98을 사용하려고

02a8ffad e998efcccc  jmp  cf75ef4a 

. 16 비트 오프셋을 원하면 명시 적으로 지정해야합니다. 또는 (오래 동안) 32 비트 피연산자를 제공해야합니다.

+1

아, 고마워. 32 비트 피연산자로 변경되어 작동합니다. 16 비트 피연산자를 원한다는 것을 어떻게 지정할 수 있습니까? Intel Manual vol 2에서 발견했습니다 : "상대 오프셋을 사용할 때, opcode (근접 점프 대 near 점프)와 피연산자 크기 속성 (근접 상대 점프)은 대상 피연산자의 크기를 결정합니다 (8, 16 또는 32 비트). " 쇼트 점프는 다른 연산 코드가 있지만 16 비트와 32 비트 피연산자를 구분하는 방법을 알지 못합니다. – rdrmntn

+1

@ jortan : 명령 앞에 0x66 접두사 바이트를 넣습니다. 따라서 '0x66 0xe9 0x98 0xfc'입니다. 어셈블러에 의존하는 코드 작성 방법. 'jmp short' 또는'jmp near'와 같은 것입니다. 당신이 그것을 볼 필요가 있습니다. –

4

e9jmp rel32 그래서 당신이 DWORD 피연산자를 필요 의미, 두 바이트는 충분하지 않다 :

$ cat shellcode.asm 
bits 32 
jmp $-4200 
$ nasm -o shellcode shellcode.asm 
$ hexdump -C shellcode 
... 
:

jmp $-4200 ; e9 93 ef ff ff 

그것은 당신이 이런 일을하려고하는 어셈블러를 사용하는 것이 더 쉽다

+0

예, -2400은 오타였습니다. nasm 팁을 주셔서 감사합니다! – rdrmntn

+0

e9도 "jmp rel16"이 아닌가요? 나는 인텔 설명서 Vol 2A를보고 있으며 실제로 16 비트 피연산자와 32 비트 피연산자로 E9를 사용하는 데 차이점을 볼 수 없습니다. 필자의 경우 16 비트 피연산자는 분명히 작동하지 않았다. 32 비트 피연산자가 작동했다. 어떻게 16 비트 피연산자를 사용할 수 있습니까? – rdrmntn

+1

'e9'는 16 비트 모드 ("실제"모드)에서는'jmp rel16'이고, 32 비트 모드에서는'jmp rel32' ("보호 된"모드)입니다.불행하게도 32 비트 모드에서'jmp rel16'을위한 특별한 연산 코드가 없으므로 그것을 전혀 사용할 수 없습니다. 'eb'는 짧은 점프 ('jmp rel8')이지만, 충분하지 않을 수도 있습니다. – Martin

2

새로운 ASM 컴파일러와 66 접두어를 만드는 작업이 저에게 효과적이지 않은 것 같습니다.

[66 E9 XX XX] 항상 GPF가 발생합니다. 16 밀어 할 연산 코드도 없다 당신은 알

6A 12   = PUSH 12 (IM8 as a 32bits) 
68 34 12 00 00 = PUSH 1234 (32 bits) 

66 6A 00  = PUSH 0  (IM8 as a 16 Bits) 
66 68 34 12 = PUSH 1234 (16 bits) 

:

체크 아웃 PUSH (.. JMP, JNE, JBE 등)이 JXX 66을 사용할 수 없습니다 보인다 비트 즉각적인 32 비트 = D

내 생각에 마틴이 처음이었는데, 당신은 그것을 진짜 모드로 CPU를 혼동시킬 수 없다.