私はシェルコードを作る基本を勉強しています。それについて質問があります。
私の教科書では、作者は自分のシェルコードを環境変数に格納し、プログラムでstrcpy()
を使用してそのアドレスを挿入します。
彼はシェルコードを作成するときに、nullバイトを削除します。これは、strcpy()
がnullバイトで停止するためであると彼は言います。
ただし、strcpy()
は環境変数のアドレス(シェルコードを格納する)を取得するだけなので、シェルコードにnullバイトが含まれていても、問題にはなりません。彼の目標は、戻りアドレスを環境変数のパスに変更することだと思います。
教科書では、ヌルバイトを持つシェルコードはこの状況では機能しませんが、ヌルフリーのシェルコードは機能します。
この状況でnullバイトを削除する必要がある理由を理解できません。
あなたはこの状況で正しいです。 strcpy
は、nullバイトに達すると実際に読み取りを停止しますbutこれは、直接に渡されるシェルコードに対してのみ実行する必要がありますnullで終わる文字列を期待する文字列関数。もちろん、nullバイトは有効なマシンコードです。
実際のペイロード自体ではなく、ペイロードにアドレスを注入するだけなので、strcpy
はペイロードを読み取っていません。
おそらく、著者は単純な取り違えをしました。ペイロード全体をstrcpy
のようなもので渡すことが望ましいシナリオが確かにあるかもしれません。その場合、実際にはnullバイトを処理する必要があります。
歴史については この答え を参照してください。
Nullターミネーターは、nullバイトが読み取られると文字列が終了したと見なされるため、「安全な」コーディングの方法です。これはおそらく、バッファオーバーフローなどの問題の防止に役立ちます。文字列コピーの場合、関数は指定したメモリアドレスに移動し、データのバイトを読み取り、それを新しい場所に書き込みます。メモリアドレスをインクリメントし、nullを読み取り、関数が終了するまで値をコピーします。
Shellコードにnull値がある場合、strcpy()
を通過すると、関数はShellコードのnullが文字列の終わりであると想定して終了し、Shellコードのコピーを不完全なままにします。