私は次のようなコードのセグメントに出くわしました:
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
作者が各命令のバイト数をどのように知っているのだろうか?
私は次のようなコードのセグメントに出くわしました:
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
作者が各命令のバイト数をどのように知っているのだろうか?
私はあなたが得る最初のコメントが本質的に答えである方法が大好きです...しかしそれは答えボックスにありません!それで、私はそれを拡張します。
したがって、収集したとおり、「知る」必要があります。これは、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
です。