我正在学习使用GDB为安全类引起缓冲区溢出。我有一个输入文件成功地导致程序通过写入缓冲区溢出来跳转到未授权的函数,当我将它作为输入提供时:
sh myFile.txt | ./myProgram
现在我想使用GDB检查未授权的功能。但是当我使用tty command or using < GDB将myFile作为输入提供给GDB时,只需要输入中间20个字节来填充20字节缓冲区。看起来GDB正在“检查”输入的缓冲区大小。
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
答案 0 :(得分:2)
gdb并没有“接受”任何东西。它只是假设你只想看到“一个”的内容而已。
您是否知道调试器中打印变量的{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"
上面看来,“one”中只有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"
上面你可以看到我们可以用内存地址做同样的事情。