我在汇编级别上调试程序时遇到了一些困难,因为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
的第一行。为什么会这样呢?顺便说一下,这让我困扰,因为我注意到一些额外的数据被添加到堆栈中,我想逐步查看堆栈增长的步骤。
b *getInput
在第一条指令处设置断点。 - Jesterrsp
必须是 16 字节对齐的。 - Jester