私は割り当て用のプログラムを与えられ、その上でバッファ オーバーフローを行うように言われました。私の教授は、私たちが取り組んでいる VM をスタック上でシェルコードを実行するように構成しているので、必要なのはシェルコードの開始をリターン アドレスに配置することだけです。オーバーフローしようとしているバッファはs1[64]
. s1
プログラムで後で使用されるため、有効なファイル名である必要があり、無効なexit(1)
場合はプログラムが実行されます。s1
この形式で入力を入力する
必要があると想定しています: validFileName+fileNameTerminator+Filler+Shellcode
.
S1
を使用してコマンドラインから読み込まれscanf(%s,s1)
ます。私が抱えている問題は、有効なファイル名とフィラーとシェルコードの開始の間に何を配置することを選択しても、プログラムは入力全体がファイル名であると見なし、それを開くことができないということです。短いファイル名と 63 および 64 の長さのファイル名を試してみましたが、すべて同じ結果が得られました。例:バッファ全体を埋めるのに十分な長さであり、その後にnullターミネータが続くため
、値が期待されるように入力s1
を与えるとします。問題は、印刷すると、入力全体が null ターミネータを見ていないかのように印刷され、明らかに指定された範囲の外を見ていることです。その巨大なものは明らかに有効なファイル名ではないため、これによりプログラムが失敗します。/./././././././././././././././././././././././testFile1GCL.txt\0AAAAAAAA\xeb\x18\x5e\x31\xc0\x88\x46\x07\x89\x76\x08\x89\x46\x0c\xb0\x0b\x8d\x1e\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe3\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68
s1
/./././././././././././././././././././././././testFile1GCL.txt
s1
ファイル名と残りのペイロードの間に配置するために考えられるほとんどすべてを試しました\\0
\0
0x0
0x90
. 何があっても、プログラムは常にs1
長い入力全体であると考えて失敗します。ターミネーターを認識していなくても、なぜ に割り当てられた 64 文字の外を見ているのs1
でしょうか?
編集:ファイル名と残りのペイロードの間にスペースを入れてみましたが、これによりファイルが終了しなくなりましたが、これは scanf がスペースで停止し、残りのペイロードを読み取っていないためです。