负跳的操作码

时间:2013-02-17 19:25:50

标签: assembly x86 opcode shellcode

我正在尝试创建一些我需要跳回的shellcode(负跳转)。 我想要跳回2400字节。这是我使用的操作码:

\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

正如预期的那样首先是一个nop然后是一个jmp,但是跳转到的地址不是我预期的(像jmp 02A8EF45这样的东西就是我想到的)。 谁能看到我做错了什么?

3 个答案:

答案 0 :(得分:4)

e9表示jmp rel32,因此您需要 dword 操作数,两个字节不够:

jmp $-4200    ; e9 93 ef ff ff

当您尝试使用汇编程序时,通常更容易使用汇编程序:

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

答案 1 :(得分:2)

在我看来,好像你正在使用32位偏移编码跳转。查看生成的代码字节(样本的最后一行):

02a8ffad e998efcccc      jmp     cf75ef4a

处理器将使用值0xccccef98作为跳转偏移量。如果需要16位偏移量,则必须明确指定它。或者(已经有一段时间了),你必须提供一个32位的操作数。

答案 2 :(得分:2)

制作新的ASM编译器和66前缀似乎对我不起作用。

[66 E9 XX XX]总是会导致GPF。

似乎你不能使用66代表JXX(JMP,JNE,JBE等)。

查看PUSH:

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)

你注意到也没有OPCode将16位立即推送为32位= D

我现在的猜测是马丁一开始是对的,你不能使用它,因为它会使CPU与REAL MODE混淆。