13

私はソフトウェアセキュリティクラスに所属しており、現在、バッファオーバーフローとその悪用方法について学習しています。私は悪用する方法を知っているプログラムを持っていますが、それが私に書くことを許さない16進数を書かなければならないので、私はそうすることができないようです。

以下から生成されたデータを書き込む必要があります。

perl -e 'print "A"x48; print "\x1b\x88\x04\x08";'

ただし、プログラムは対話形式で実行されるため、その出力をコマンドライン引数にリダイレクトすることはできません。これまで、xclipを使用してクリップボードにコピーし、実行中のアプリケーションに貼り付けてきましたが、何らかの理由で、この16進数のシーケンスでは、xclipを使用してコピーすることはできません(何もコピーされていないことを示しています)。

例えば:

perl -e 'print "A"x48; print "\x1b\x88\x04\x08";' | xclip -sel clip

その後ctrl+Vを押すと、何も貼り付けられません。ターミナルウィンドウからの出力をコピーして貼り付けるだけでは、間違った16進数が貼り付けられます(これは、16進数がASCIIで表示されないためだと思います)。

私の質問は次のとおりです。GDBには、このように生成されたテキストをインタラクティブな実行中のプログラムに挿入する方法がありますか?

悪用可能なプログラムがコマンドライン引数を使用した場合、次のことができることを認識しています。

run $(perl -e 'print "A"x48; print "\x1b\x88\x04\x08";')

ただし、CLI引数を介して実行されないため、これは使用できません。

どんな助けでも素晴らしいでしょう!

4

1 に答える 1

26

私の質問は次のとおりです。GDBには、このように生成されたテキストをインタラクティブな実行中のプログラムに挿入する方法がありますか?

あなたの質問は誤解に基づいています。GDBが実行している「貼り付け」を何らかの形で傍受しており、ターゲットプログラムに文字を読み取らせていないという印象を受けているようです。

ただし、ブレークポイントで停止するまで(または信号が原因で)停止しない限り、GDBは入力をインターセプトしません。したがって、プログラムの実行中(および入力の読み取り中)、GDB自体は(システムコールで)ブロックされ、何かが発生するのを待ちます。waitpid

では、プログラムが制御文字を受け取れない理由は何でしょうか。ターミナルエミュレータはそうです。

では、非ASCII入力をどのように調整できますか?3つの方法の1つ(2つは非常に似ています):

  1. ファイルからの入力を使用する
  2. 名前付きパイプからの入力を使用する
  3. gdbserverを使用する

メソッド#1の場合:

perl -e 'print "A"x48; print "\x1b\x88\x04\x08";' > /tmp/input
gdb ./a.out
(gdb) run < /tmp/input   # voila: GDB reads terminal,
                         # your program reads /tmp/input

方法#2:

mkfifo /tmp/pipe
perl -e 'print "A"x48; print "\x1b\x88\x04\x08";' > /tmp/pipe &
# perl will block, waiting for someone to read the pipe
gdb ./a.out
(gdb) run < /tmp/pipe

上記の両方のメソッドは、「通常の」プログラム(を読み取るプログラム)では機能しますが、ターミナルを直接読み取るプログラム( 、、など)ではSTDIN失敗します。sudopasswdgpg

方法#3:

perl -e 'print "A"x48; print "\x1b\x88\x04\x08";' |
gdbserver :0 ./a.out  # gdbserver will print a TCP port, e.g. 4321
                      # and stop the program at start

# in another window,
gdb ./a.out
(gdb) target remote :4321
# gdb will now attach to gdbserver, you can set breakpoints and continue.
于 2013-03-26T04:17:28.423 に答える