GDB无法创建断点
GDB can't create a breakpoint
我正在努力实现一个简单的堆栈溢出,我正在使用 gdb 对其进行检查。我不断提出的一个问题是 gdb 不接受我的断点。我的 C 代码很简单:
void function(int a, int b, int c) {
...//stuff
}
void main() {
int x;
x = 0;
function(1,2,3);
x = 1;
printf("%d\n",x);
}
我正在使用 gcc -m32 -fno-stack-protector -o example3test example3test.c 来编译它。
我试过在 <+42> 行设置一个简单的断点来测试它是否有效。
(gdb) disass main
Dump of assembler code for function main:
0x000005d1 <+0>: lea 0x4(%esp),%ecx
0x000005d5 <+4>: and [=11=]xfffffff0,%esp
0x000005d8 <+7>: pushl -0x4(%ecx)
0x000005db <+10>: push %ebp
0x000005dc <+11>: mov %esp,%ebp
0x000005de <+13>: push %ebx
0x000005df <+14>: push %ecx
0x000005e0 <+15>: sub [=11=]x10,%esp
0x000005e3 <+18>: call 0x470 <__x86.get_pc_thunk.bx>
0x000005e8 <+23>: add [=11=]x1a18,%ebx
0x000005ee <+29>: movl [=11=]x0,-0xc(%ebp)
0x000005f5 <+36>: push [=11=]x3
0x000005f7 <+38>: push [=11=]x2
0x000005f9 <+40>: push [=11=]x1
0x000005fb <+42>: call 0x5a0 <function>
0x00000600 <+47>: add [=11=]xc,%esp
0x00000603 <+50>: movl [=11=]x1,-0xc(%ebp)
0x0000060a <+57>: sub [=11=]x8,%esp
0x0000060d <+60>: pushl -0xc(%ebp)
0x00000610 <+63>: lea -0x1950(%ebx),%eax
0x00000616 <+69>: push %eax
0x00000617 <+70>: call 0x400 <printf@plt>
0x0000061c <+75>: add [=11=]x10,%esp
0x0000061f <+78>: nop
0x00000620 <+79>: lea -0x8(%ebp),%esp
0x00000623 <+82>: pop %ecx
0x00000624 <+83>: pop %ebx
0x00000625 <+84>: pop %ebp
0x00000626 <+85>: lea -0x4(%ecx),%esp
0x00000629 <+88>: ret
End of assembler dump.
(gdb) break *0x000005fb
Breakpoint 1 at 0x5fb
(gdb) run
Starting program: /home/jasmine/tutorials/smashingTheStackForFun/example3test
Warning:
Cannot insert breakpoint 1.
Cannot access memory at address 0x5fb
我不明白为什么它不接受这个断点。此处已有的大部分答案都涉及不使用 * 或使用错误的符号,从我看来我的看起来是正确的,但我可能是错的。
I'm lost as to why it won't accept this breakpoint.
您有一个与位置无关的可执行文件,它在运行时被重新定位到不同的地址。
这会起作用:
(gdb) start
# GDB stops at main
(gdb) break *&main+42
(gdb) continue
另见 this answer。
我正在努力实现一个简单的堆栈溢出,我正在使用 gdb 对其进行检查。我不断提出的一个问题是 gdb 不接受我的断点。我的 C 代码很简单:
void function(int a, int b, int c) {
...//stuff
}
void main() {
int x;
x = 0;
function(1,2,3);
x = 1;
printf("%d\n",x);
}
我正在使用 gcc -m32 -fno-stack-protector -o example3test example3test.c 来编译它。
我试过在 <+42> 行设置一个简单的断点来测试它是否有效。
(gdb) disass main
Dump of assembler code for function main:
0x000005d1 <+0>: lea 0x4(%esp),%ecx
0x000005d5 <+4>: and [=11=]xfffffff0,%esp
0x000005d8 <+7>: pushl -0x4(%ecx)
0x000005db <+10>: push %ebp
0x000005dc <+11>: mov %esp,%ebp
0x000005de <+13>: push %ebx
0x000005df <+14>: push %ecx
0x000005e0 <+15>: sub [=11=]x10,%esp
0x000005e3 <+18>: call 0x470 <__x86.get_pc_thunk.bx>
0x000005e8 <+23>: add [=11=]x1a18,%ebx
0x000005ee <+29>: movl [=11=]x0,-0xc(%ebp)
0x000005f5 <+36>: push [=11=]x3
0x000005f7 <+38>: push [=11=]x2
0x000005f9 <+40>: push [=11=]x1
0x000005fb <+42>: call 0x5a0 <function>
0x00000600 <+47>: add [=11=]xc,%esp
0x00000603 <+50>: movl [=11=]x1,-0xc(%ebp)
0x0000060a <+57>: sub [=11=]x8,%esp
0x0000060d <+60>: pushl -0xc(%ebp)
0x00000610 <+63>: lea -0x1950(%ebx),%eax
0x00000616 <+69>: push %eax
0x00000617 <+70>: call 0x400 <printf@plt>
0x0000061c <+75>: add [=11=]x10,%esp
0x0000061f <+78>: nop
0x00000620 <+79>: lea -0x8(%ebp),%esp
0x00000623 <+82>: pop %ecx
0x00000624 <+83>: pop %ebx
0x00000625 <+84>: pop %ebp
0x00000626 <+85>: lea -0x4(%ecx),%esp
0x00000629 <+88>: ret
End of assembler dump.
(gdb) break *0x000005fb
Breakpoint 1 at 0x5fb
(gdb) run
Starting program: /home/jasmine/tutorials/smashingTheStackForFun/example3test
Warning:
Cannot insert breakpoint 1.
Cannot access memory at address 0x5fb
我不明白为什么它不接受这个断点。此处已有的大部分答案都涉及不使用 * 或使用错误的符号,从我看来我的看起来是正确的,但我可能是错的。
I'm lost as to why it won't accept this breakpoint.
您有一个与位置无关的可执行文件,它在运行时被重新定位到不同的地址。
这会起作用:
(gdb) start
# GDB stops at main
(gdb) break *&main+42
(gdb) continue
另见 this answer。