我正在使用gdb执行一些代码分析。假设程序就像
#include<stdio.h>
getinput()
{
char buffer[8];
gets(buffer);
puts(buffer);
}
int main()
{
getinput();
return 0;
}
我已经使用gcc和其他一些开关来完成它,如下所述:
gcc -ggdb -mpreferred-stack-boundary -fno-stack-protection -o demo demo.c
在使用gdb进行分析时,我在getinput()和gets(缓冲区)函数上插入断点。 然后使用&#34; s&#34;逐步通过函数..在获取(缓冲)函数..
它不会询问用户输入,而是要求 userinput 。 GDB直接进入函数获取...但我不希望它进入获取函数..
(gdb) break 6
Breakpoint 2 at 0x8048441: file demo.c, line 6.
(gdb) s
The program is not being run.
(gdb) run
Starting program: /root/BufferOverflow/demo
Breakpoint 1, main () at demo.c:11
11 getinput();
(gdb) s
Breakpoint 2, getinput () at demo.c:6
6 gets(buffer);
(gdb) s
_IO_gets (buf=0xbfffeda8 "y\204\004\b") at iogets.c:32
32 iogets.c: No such file or directory.
(gdb)
我收到上面显示的错误。有人可以帮我这个吗?
答案 0 :(得分:0)
然后使用&#34; s&#34;逐步通过函数..在获取(缓冲)函数..
在第6行使用step
命令将进入gets()
功能。如果您不想这样做,请使用next
命令。它将转移到getinput()
函数中的下一行代码(到puts()
调用)。
答案 1 :(得分:0)
gdb有多种方法来推进计划。可以找到一个很好的概述here。
最常见的序列如下:
break [line or function/method]
run args
next
print [interesting variables]
next
将跳过该行的任何函数调用并移动到当前函数中的下一个源代码行。 step
将进入一个函数。
如果您不小心进入了一个无趣的函数,finish
命令将一直运行到当前函数结束。
一个常见的情况是踩到正在评估参数的函数。
my_method(gets(buffer));
此行上的一个步骤将引导您进入gets()函数的汇编程序。通常这不是你想要的。对于这种情况,我通常只在my_method上设置一个断点,然后cont
。
gdb尝试使用step-mode
设置来避免这种情况。但是,正如您在示例中看到的那样,它并不总是有效。
gdb是一个很棒的工具,可以节省您的时间和痛苦。如果您是一名开发人员,那么肯定需要时间来掌握它。