Ubuntu 18.04を使用しています。バッファオーバーフロー攻撃を試しています。
私が書いて攻撃しようとしたCプログラムは次のとおりです。
// test.c
#include <stdio.h>
void f();
int main(int argc, char *argv[])
{
printf("argc : %d\n", argc);
for(int i = 0; i < argc; i++)
{
printf("argv[%d] : %s\n", i, argv[i]);
}
printf("End of program\n");
return 0;
}
void f()
{
printf("You got to the hidden function!\n");
}
...次にコンパイルされます。
gcc test.c -o test
私のPython3注入スクリプトは次のとおりです。
# inject.py
push = "A" * 1000
print(push)
inject.py
私は出力を次にパイプする3つの方法を試しましたtest
。
# attempt 1
$ ./test <(python3 inject.py)
argc : 2
argv[0] : ./test
argv[1] : /dev/fd/63
End of program
$ Exception ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>
BrokenPipeError: [Errno 32] Broken pipe
^C
^ここでは実際に私の入力なしで2番目に進み、停止してから$
終了する必要がありました。ctrl+C
# attempt 2
$ python3 inject.py | ./test
argc : 1
argv[0] : ./test
End of program
Exception ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>
BrokenPipeError: [Errno 32] Broken pipe
# attempt 3
$ ./test <(python3 -c "print(\"A\"*1000)")
argc : 2
argv[0] : ./test
argv[1] : /dev/fd/63
End of program
$ Exception ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>
BrokenPipeError: [Errno 32] Broken pipe
^C
^これは試み1に似ています。
私は私がやっていることがYouTubeで見た多くのバッファオーバーフローに似ていると思います。エラーが発生すると予想しましたが、SegFault
結果的にBroken pipe
エラーでした。
私は何が間違っていましたか?なぜsのBroken pipe
代わりに受け取るのですかSegFault
?
説明:私が求めているのは、「バッファオーバーフロー攻撃を実行する方法」ではなく、「なぜエラーが発生し、どのようにBroken pipe
解決するのですか」です。これは *nix コマンドライン問題なので、このコミュニティの範囲内にあると思います。
答え1
Pythonプログラムからデータ出力を読み取らないため、Pythonプログラムで「壊れたパイプ」エラーが発生します。 Cプログラムは標準入力ストリームを完全に無視し、終了時にストリームが閉じるため、test
Pythonプログラムは聞こえないパイプに書き込もうとします。
bash
()でプロセス置換を使用するとパイプも使用されるため、<(...)
同じ問題が発生します。この例では、データは標準入力を介してではなく、コマンドの最初のコマンドライン引数に示されているファイルから到着します。このファイルは絶対に開かないでください。
この問題を解決するには、C プログラムが標準入力のすべての入力またはコマンドの最初の引数で示されるパス名を使用していることを確認します。
現在のコードは、バッファオーバーフロー、分割エラー、またはCコードの他のエラーを発生させません。
私はあなたが何らかの方法でCコードでバッファオーバーフローを引き起こしたいと思います。たとえば、Pythonコードのデータを小さすぎるバッファに読み込むことでこれを行うことができます。
yes
しかし、PythonコードはPythonである必要はありません。ユーティリティ(おそらく、パイプのようhead -n 1000
なパイプなど)など、多くのデータを生成する単純なシェルコマンドですyes A | head -n 1000
。