我很难在汇编级别调试程序,因为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
的第一行。为什么会这样?
顺便说一句,这让我很烦恼,因为我注意到一些额外的数据正在添加到堆栈中,我希望逐步看到堆栈的增长。
答案 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
。