Gdb跳转汇编代码的某些部分

时间:2017-02-05 22:38:10

标签: c assembly gdb

我很难在汇编级别调试程序,因为GDB正在跳转代码的某些部分。代码是:

#include <stdio.h>
#define BUF_SIZE 8

void getInput(){
    char buf[BUF_SIZE];
    gets(buf);
    puts(buf);
}

int main(int argc, char* argv){
    printf("Digite alguma coisa, tamanho do buffer eh: %d\n", BUF_SIZE);

    getInput();
    return 0;
}

该程序编译为gcc -ggdb -fno-stack-protector -mpreferred-stack-boundary=4 -o exploit1 exploit1.c 在gdb中,我添加了break getInput,当我运行disas getInput时,它会返回我:

Dump of assembler code for function getInput:
0x00000000004005cc <+0>:    push   %rbp
0x00000000004005cd <+1>:    mov    %rsp,%rbp
0x00000000004005d0 <+4>:    sub    $0x10,%rsp
0x00000000004005d4 <+8>:    lea    -0x10(%rbp),%rax
0x00000000004005d8 <+12>:   mov    %rax,%rdi
0x00000000004005db <+15>:   mov    $0x0,%eax
0x00000000004005e0 <+20>:   callq  0x4004a0 <gets@plt>
0x00000000004005e5 <+25>:   lea    -0x10(%rbp),%rax
0x00000000004005e9 <+29>:   mov    %rax,%rdi
0x00000000004005ec <+32>:   callq  0x400470 <puts@plt>
0x00000000004005f1 <+37>:   nop
0x00000000004005f2 <+38>:   leaveq 
0x00000000004005f3 <+39>:   retq  

如果我输入run,我注意到程序停在0x00000000004005d4行,而不是我预期的函数0x00000000004005cc的第一行。为什么会这样?

顺便说一句,这让我很烦恼,因为我注意到一些额外的数据正在添加到堆栈中,我希望逐步看到堆栈的增长。

1 个答案:

答案 0 :(得分:3)

  

如果我输入run,我注意到程序停在0x00000000004005d4行,而不是我预期的函数0x00000000004005cc的第一行。

您的期望不正确。

  

为什么会这样?

因为当您通过break getInput设置断点时,GDB会在函数prolog之后设置断点。来自documentation

-function function
  The value specifies the name of a function. Operations on function locations
  unmodified by other options (such as -label or -line) refer to the line that
  begins the body of the function. In C, for example, this is the line with the
  open brace. 

如果要在第一条指令上设置断点,请改用break *getInput

文档herehere