我正在尝试创建一些我需要跳回的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
这样的东西就是我想到的)。
谁能看到我做错了什么?
答案 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混淆。