2017-10-22 18 views
11

バッファオーバーフローの悪用に取り組んでいるうちに、私は本当に奇妙なものを見つけました。正しく飛び越えたいアドレスの前に32文字を入力する必要があり、適切なアドレスが0x08048a37であることがわかりました。私が実行したときPython3 print()Vs Python2 print

python -c "print '-'*32+'\x37\x8a\x04\x08'" | ./MyExecutable 

悪用は成功しました。しかし、私が試したときに:

python3 -c "print('-'*32+'\x37\x8a\x04\x08')" | ./MyExecutable 

それはしませんでした。実行可能ファイルは、単に目的のアドレスにジャンプすることなくセグメンテーションフォルトを発生させました。実際には、コンソール上の2つの異なる出力に

python -c "print '-'*32+'\x37\x8a\x04\x08'" 

python3 -c "print('-'*32+'\x37\x8a\x04\x08')" 

結果を実行します。文字はもちろん読めるわけではありませんが、視覚的に異なっています。

なぜこれが起こっているのだろうか?

答えて

19

ザパイソン2コードバイトを書き込み、Pythonの3コードは、バイトに符号化されるテキストを書き込みます。後者は同じ出力を書きません。それはあなたのパイプ用に設定されたコーデックに依存します。 Pythonの3では

、代わりにsys.stdout.bufferオブジェクトにバイトを書き込みます。

python3 -c "import sys; sys.stdout.buffer.write(b'-'*32+b'\x37\x8a\x04\x08')" 

を手動printを追加することになり\n改行を追加することもできます。

sys.stdoutio.TextIOBase objectです。これは、指定されたコーデック(通常はあなたのロケールに基づいていますが、パイプを使用する場合はASCIIに設定されることが多い)に書き込まれます。 TextIOBase.buffer attributeでは、基礎となるBufferedIOBase objectに直接アクセスできます。