gets() にバイナリデータを送信する

gets() にバイナリデータを送信する

(バッファオーバーフローの脆弱性がある)被害者プログラムがあります。このプログラムはgets()を使用して固定サイズのバッファに書き込みます。

シェルコードをSCファイルに入れたとしましょう。

$ ./victim < SC
Input your data: 
$

シェルコードが機能しないように見える理由は次のとおりです。 SCが被害者にリダイレクトされ、シェルコードが挿入されてシェルが生成されますが、生成されたシェルはstdinが閉じていることを発見し、すぐに終了します。

expect注入しようとしましたが、expect散乱後の殻が爆発します。

唯一の実用的な方法は、シェルコードをマウスの貼り付けバッファに入れて、キーボードを入力デバイスとして保持しながらシェルコードを挿入することです。しかし、貼り付けバッファにバイナリデータを入れる方法がわかりません。

この問題を解決する方法についてのアイデアはありますか?

答え1

この問題(誰かが同じ状況で発生した)の解決策は次のとおりです。 https://stackoverflow.com/questions/8509045/execve-bin-sh-0-0-in-a-pipe

答え2

特殊文字が印刷される単純なスクリプトを使用してこれを達成できます。

たとえば、Perlでは16進コードを指定してすべての文字を印刷できます。たとえば、 perl -e 'print "\x54\x0A"'「T」を印刷してから新しい行を印刷します。

これにより、印刷されたテキストが見えなくてもコピーできます。もちろん、ターミナルは生モードでなければなりません。

関連情報