我正在学习一些机制的断点,并且我了解到'在x86中,存在调试器中断CPU的指令int3
。然后CPU将通过signal
'中断正在运行的程序。在gdb中设置一个随机地址断点
例如:
8048e20: 55 push %ebp
8048e21: 89 e5 mov %esp,%ebp
当用户输入
b *表0x8048e21
该指令将由int3
被替换(操作码0xcc
)和成为这样:
8048e20: 55 push %ebp
8048e21: cc e5 mov %esp,%ebp
它会停在正确的地方。
贵不贵:如果我设置断点不是在指令的开始
会发生什么?也就是说,如果我输入:
B * 0x8048e22
将Debugger仍取代e5
与cc
?所以我写了一个简单的例子,并用gdb运行它。
正如你在上面看到的,我设置了两个断点,第二个断点处于中间位置。 I输入r
并在第一个断点处停止并输入c
并运行到最后。
所以看起来gdb忽略了第二个断点。 (因为如果它真的用int3
来代替它,程序将是完全错误的)。
问:什么发生在第二个断点,更具体地说,什么是GDB处理它(或者是我学习的是错了吗?)
编辑: @dbrank已经给出关于改变一个很好的例子一个指令的数据字段,我会试着用一个类似的例子使它更全面(似乎是寄存器)。 (约断点的机制中的任何附图理解!)
我试过你的例子,但我的程序输出原始数据?有任何想法吗? – Tony
上面的例子是为-m32标志编译的(对于x86)。在x86_64编译的代码有点不同,你需要在不同的位置放置一个断点(用断点覆盖原始值0x2a)。 – dbrank0
对不起,这么晚回应,你的例子确实有效。感谢您的指导。 – Tony