1

GDB を使用してセキュリティ クラスのバッファ オーバーフローを引き起こす方法を学んでいます。次のように入力としてフィードすると、バッファオーバーフローを書き込むことにより、プログラムが許可されていない関数に正常にジャンプする入力ファイルがあります。

sh myFile.txt | ./myProgram

ここで、GDB を使用して不正な機能を調べたいと思います。しかし、 tty コマンドまたは < GDBを使用して myFile を GDB への入力としてフィードすると、入力の中間の 20 バイトだけが 20 バイトのバッファーに入力されます。GDB が入力のバッファ サイズを「チェック」しているようです。

  1. それはgdbがしていることですか?
  2. もしそうなら、それをオフにする方法はありますか?

C コードは次のようになります。

  char one[20];
  char two[20];

  printf("..."); fflush(stdout);
  gets(one);   //only takes 20 bytes from the middle of printf "morethan20bytes..." from input file
  printf("..."); fflush(stdout);
  gets(two);   //only takes 20 bytes from the middle of printf "morethan20bytes..." from input file
4

1 に答える 1

2

gdbは何も「取って」いない。「1つ」の内容だけを表示したいだけで、それ以上は表示しないことを前提としています。

デバッガーで変数を出力するための{type}expr@ num表記を知っていますか?たとえば、バッファ内の20番目のインデックスを過ぎた「1」の内容を確認するには、次のようにします。

(gdb) next
...10     gets(one);   //only takes last 20 bytes of printf "morethan20bytes..." from input file
(gdb) next
BLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAH   # <== simulating input
11    printf("..."); fflush(stdout);

(gdb) print one
$2 = "BLAHBLAHBLAHBLAHBLAH"

上記では、「1つ」には20文字しか含まれていないようです。ただし、これは、gdbが20バイトのみを表示することを想定しているためです。

ここで、「one」のメモリアドレスで始まる最初の40文字を出力してみましょう。

(gdb) print {char}one@40
$3 = "BLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAH"

バッファの長さを超えていることがはっきりとわかります

(gdb) print two
$4 = "BLAHBLAHBLAH\000\000\000\000\000\000\000"

そして、オーバーランが「2」にも書き込まれていることがわかります。

(gdb) x one
0x7fffffffe750: 0x48414c42
(gdb) print {char}0x7fffffffe750@40
$6 = "BLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAH"

上記では、メモリアドレスでも同じことができることがわかります。

于 2013-03-05T15:03:14.610 に答える