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 没有“拿走”任何东西。它只是假设您只想查看“one”的内容,仅此而已。

你知道在调试器中打印变量的 {type}expr@num 符号吗?例如,要查看缓冲区中第 20 个索引后“one”的内容:

(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"

上面,“一个”似乎只有 20 个字符。但那是因为 gdb 假设您只想查看 20 个字节。

现在让我们打印出从“one”的内存地址开始的前 40 个字符

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

您可以清楚地看到它超出了缓冲区长度

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

你可以看到溢出也写入了“二”。

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

上面你可以看到我们可以用内存地址做同样的事情。

于 2013-03-05T15:03:14.610 回答