3

戻る必要があるシェルコードを作成しようとしています (負のジャンプ)。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私が考えていたようなものです)。誰かが私が間違ったことを見ることができますか?

4

3 に答える 3

4

e9つまり、 dwordjmp rel32オペランドが必要なため、2 バイトでは不十分です。

jmp $-4200    ; e9 93 ef ff ff

これらのことを試すときは、アセンブラを使用する方が簡単なことがよくあります。

$ cat shellcode.asm
bits 32
jmp $-4200
$ nasm -o shellcode shellcode.asm
$ hexdump -C shellcode
...
于 2013-02-17T19:43:54.797 に答える
3

32 ビット オフセットでジャンプをコーディングしているように見えます。生成されたコード バイト (サンプルの最後の行) を見てください。

02a8ffad e998efcccc      jmp     cf75ef4a

プロセッサは、この値0xccccef98をジャンプ オフセットとして使用します。16 ビットのオフセットが必要な場合は、明示的に指定する必要があります。または (久しぶりです)、32 ビットのオペランドを指定する必要があります。

于 2013-02-17T19:42:24.000 に答える
2

新しい ASM コンパイラと 66 プレフィックスを作成する作業は、私にはうまくいかないようです。

[66 E9 XX XX] は常に GPF を引き起こします。

JXX(JMP、JNE、JBEなど)に66を使用できないようです。

プッシュをチェックしてください:

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)

16 ビットの Immediate を 32 ビットの =D としてプッシュする OPCode も存在しないことがわかります。

私の推測では、Martin は最初は正しかったと思います。CPU を REAL MODE と混同してしまうので使用できません。

于 2013-05-13T20:10:33.690 に答える