質問: オーバーフローの実践をしています。 変数の書き換えと、EIPをAで上書きしてSegmentationFaultを起こすことはできました。 次に、EIPをmain関数の始めのアドレス(0x12345678)に書き換えたいと思っていて、 ``` echo -e "AAAAAAAAAA\x78\x56\x34\x12" | ./bof ``` ``` ruby -e 'print "A"*10+"\x78\x56\x34\x12"' | ./bof ``` こんな感じでパイプで入力を送ってみました。 が、SegmentationFaultになってしまいます。 EIPが意図のとおり書き換えられていないのか、mainの始めのアドレスが間違っているのかわからないので、GDBでレジスタの内容を確認したいと思いました。 が、GDBの中で"AAAAAAAAAA\x78\x56\x34\x12"をエスケープ文字?を有効にして入力する方法がわかりません。 GDB実行中にパイプを使っての標準入力は可能でしょうか? 不可能であれば何か代替策はあるでしょうか?
回答: 質問者さんの主目的はプログラムの動きをどのように破壊しえるかの実験ですよね? そうなのであればbofへ与えるデータを標準入力にすることにこだわらずプログラムを書き替えて特定のファイルを読み込むようにすればよいと思います。 なおlinux上であればプログラムをちょこっといじって標準入力を別のファイルから取り込むようにするために以下のようなトリックも使えるかも知れません。なんのことはないfd 0(=stdin)を一旦閉じて望みのファイルをfd 0としてopenしなおすだけのものです。 ``` #include #include #include int main(int argc, const char* argv[]) { // reopen standard input close(0); open("input.txt", O_RDONLY); c = getchar(); // 標準入力用のマクロ・関数を実行すると"input.txt"から入力できる(だけ) ... } ``` またgdbを使いこなすためということであれば以下のようなページを参照して調べるのもよいと思います。 GDBマニュアル