步入使用GDB

时间:2016-08-26 10:48:50

标签: gdb buffer

我正在使用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) 

我收到上面显示的错误。有人可以帮我这个吗?

2 个答案:

答案 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是一个很棒的工具,可以节省您的时间和痛苦。如果您是一名开发人员,那么肯定需要时间来掌握它。