文字列を出力するアセンブリプログラムを作成しました。
[org 0x7c00]
mov bx, HELLO_MSG
HELLO_MSG:
db "Hello World!", 0
mov ah, 0x0e
PRINT:
mov al, [bx]
cmp al, 0
je END
int 0x10
add bx, 0x1
jmp PRINT
END:
jmp $
times 510-($-$$) db 0
dw 0xaa55
nasmを使用してコンパイルすると、次のバイナリが生成されました
BB 12 7C B4 0E 8A 07 3C 00 74 07 CD 10 83 C3 01 EB F3 48 65 6C 6C 6C 6F 20 57 6F 72 6C 64 21 00 EB FE 00 00 .... 00 00 55 AA
qemuエミュレーターを使用した出力は次のとおりです。
明らかなように、「ll」は他の記号に置き換えられます。
ただし、HELLO_MSG
ラベルをコードの下部に移動するとjmp $
、出力のすぐ上になります。その理由がわかりません。
編集:元のコードの「HelloWorld」の代わりにさまざまな文字列を試してみると、次の出力が観察されました
ケース:「HelllloWorld」(追加の「l」に注意)
ゴミの文字はそれらの2バイトにのみ表示されます
事例:「私たちは神々です」
不思議なことにエラーが消えました!
事例:「私たちは神々です!」(注意 '!')
何も印刷されず、「!」が追加されます 何かひどいことをしましたか?
ケース:「HelloWorld」(注意! '!')
'!'を削除します 再び何かひどいことをしましたか?
実行可能コードの途中に文字列を置きます。したがって、ASCII値は命令オペコードとして扱われ、何らかの操作を実行します。これにより、おそらく一部のバイトが上書きされます。
文字列は、jmp
実行されないように、命令の後の最後に配置する必要があります。または、jmp
文字列の前に命令を追加して、文字列を飛び越えることもできます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加