私は、このソースコードにバッファオーバーランについて学んでいます:gets()は ' 0'を無視しますか?
#include <stdio.h>
int main()
{
char buf[16];
gets(buf);
printf("buf @ %8p\n", (void*)&buf);
return 0;
}
私はBUF変数にNull
文字(「\ 0」)を記述してみてください。
まず、gdb
に、私はgets()
関数の後、6行目にブレークポイントを設定し、r <<< $(python -c 'print "\0"*11 + "AAAA"')
でそれを実行し、私はスタックを探索するとき、私はそれだけでbuf
に「AAAA」を書き実現。何が起こるのですか?
(gdb) x/16xw &buf
0xffffcf80: 0x41414141 0xffffd000 0xffffd04c 0x080484a1
0xffffcf90: 0xf7fb43dc 0xffffcfb0 0x00000000 0xf7e1a637
0xffffcfa0: 0xf7fb4000 0xf7fb4000 0x00000000 0xf7e1a637
0xffffcfb0: 0x00000001 0xffffd044 0xffffd04c 0x00000000
しかし、私はr <<< $(python -c 'print "\1"*11 + "AAAA"')
でプログラムを実行すると、buf
は次のようになります。
(gdb) x/16xw &buf
0xffffcf80: 0x01010101 0x01010101 0x41010101 0x00414141
0xffffcf90: 0xf7fb43dc 0xffffcfb0 0x00000000 0xf7e1a637
0xffffcfa0: 0xf7fb4000 0xf7fb4000 0x00000000 0xf7e1a637
0xffffcfb0: 0x00000001 0xffffd044 0xffffd04c 0x00000000
ので
gets()
機能がNull
文字を受信しませんかstdin
はそれを無視するのだろうか?
P/S:私はgccの上gcc -m32 -fno-stack-protector -g stack.c -o stack
でそれを建てた(Ubuntuの5.4.0-6ubuntu1〜16.04.4)5.4.0 20160609.
更新:いくつかの提案の後、Iこの方法を試してください。
#include <stdio.h>
int main()
{
char buf[16];
gets(buf);
printf("buf @ %8p\n", (void*)&buf);
for (int i = 0; i < 16; ++i) // this is for loop all the buf
{
printf("%02x ", buf[i]);
}
return 0;
}
それは '\ 0'
$ gcc -g j_stack.c -o j_stack
$ python -c 'print "AAAA" + "\0"*6 + "AAAA"'| ./j_stack
buf @ 0xffffcfbc
41 41 41 41 00 00 00 00 00 00 41 41 41 41 00 ffffffff
で動作します
しかし、どのように私は、
gets
は'\0'
を無視しないgdb
プログラム
マイナーヒント:パイプ、あなたが期待する結果が表示されるはずですあなたはすべての0xFFsまたはその –
'gets'と' fgetsのようなものに初期化 'buf'をたい場合には、この出力を読み取ることが容易になるだろう'' \ 0 ''を特別に扱わない関数です。彼らはちょうど良いヌル文字を読み取ることができます。あなたのプログラムを使って '' ab \ 0c \ n "'という文字列を読みました。 –
これは入力を提供するための "here strings"の使用によるものだと思います( '<<<')。これは、入力をプログラムに渡す非常に複雑な方法です。そう思わないのですか?方程式からgdbを取り出し、シェルからの標準的なパイプを使用してください。あなたはそれが働いているのを見てください。これが真実で、それで答えが価値があるかどうか私たちに知らせてください。 –