2016-09-29 6 views
7

"Hacking - The Exploitation of The Art"の本を読んでください。私は、スタックのオーバーフローと関数の戻りアドレスの変更によって実行フローを変更するので、作家に従っています。 0x080484bfは、リターンアドレスですPerlスクリプトで0x00で始まるアドレスに書き込む

$ ./auth_overflow2 $(perl -e 'print "\xbf\x84\x04\x08"x10') 

:(具体的には、ページ135-136)彼は10倍、コマンドライン引数としてリターンアドレスを入力し、Perlスクリプトでこれを行うために管理しています。

私は同じことをしようとしていますが、私のリターンアドレスは0x00で始まります。 \ x08を\ x00に置き換えると、ヌル文字は省略されます。したがって、入力したいアドレスはメモリマップの1バイト分シフトします。これを回避するにはどうしたらいいですか?

+1

これは意味をなさないと思います。 bashはnullで文字列を扱うことはできませんが、たとえそれがあったとしても、 'exec'はヌル終端文字列を期待し、nullの後のすべての文字を無視するため、その文字列を引数としてプロセスに渡すことはできません。 – redneb

+0

@redneb私は参照してください...あなたはdwordsとして整列したアドレスでメモリを満たすための代替方法について考えることができますか? (0x00で始まるアドレスを含む) –

+1

たとえば、「auth_overflow2」を受け入れるように変更する必要があります。アドレスの16進表現 – redneb

答えて

7

コマンドライン引数はNULで終了する文字列です。したがって、NULを含む文字列を渡すことはできません。それは文字列の終わりとみなされます。

これを知ると、シェルは引数を作成するときにNULを取り除きます。

$ perl -e'printf "%v02X\n", $_ for @ARGV' "$(perl -e'print "\xbf\x84\x04\x08" x 5')" 
BF.84.04.08.BF.84.04.08.BF.84.04.08.BF.84.04.08.BF.84.04.08 

$ perl -e'printf "%v02X\n", $_ for @ARGV' "$(perl -e'print "\xbf\x84\x04\x00" x 5')" 
BF.84.04.BF.84.04.BF.84.04.BF.84.04.BF.84.04 

auth_overflow2は、例えば、アドレスのエスケープ形を取るように改変されなければなりませんアドレスは16進数です。

関連する問題