0

私は次のようなコードのセグメントに出くわしました:

jmp 0x26 #2 bytes
popl %esi #1 bytes
movl %esi,0x8(%esi) # 3 bytes
movb $0x0,0x7(%esi) # 4 bytes

.....

.string \"/bin/sh\" #8 bytes

作者が各命令のバイト数をどのように知っているのだろうか?

4

1 に答える 1

1

私はあなたが得る最初のコメントが本質的に答えである方法が大好きです...しかしそれは答えボックスにありません!それで、私はそれを拡張します。

したがって、収集したとおり、「知る」必要があります。これは、Intelのマニュアルの説明を調べることでわかります。

mov rax, [rsp+8]簡単な例を示します。たとえば、これをnasmで組み立てることができるサイズを計算したい場合は、次のようにします。

 BITS 64
 mov rax, [rsp+8]

次のコマンドを使用します。

 nasm -fbin test.asm -o test.bin

test.binを調べると、16進数で次のように表示されます。

 48 8B 44 24 08

ここ8Bに命令を表しmovます。その48前にあるのは、プロパティが設定されたREXプレフィックスwです(64ビットターゲットを示します)。最後のバイト、08は、前のレジスタからの変位を表します。これは24、を示します(プレフィックスが示すespため、ターゲットが広い場合を除きます)。REX最後に、44を表しeax*2ます。これは64ビット幅のフィールドになります。

ここで使用されている正確なアドレッシングモードはかなり複雑ですが、一般的なアドレッシングモードはすぐに解決できると言っても過言ではありません。たとえば、32ビットに相当する(mov eax, [esp+4])は4バイト8B 44 24 04です。

于 2012-11-14T11:55:35.547 に答える