跳转到下一个“指令”使用 gdb
我正在尝试找出金丝雀值设置和检查机制。
#include int main(void) { return printf("Hi!\n"); }
反汇编主程序时,我
(gdb) disas main 0x080483f4 : lea 0x4(%esp),%ecx 0x080483f8 : and $0xfffffff0,%esp 0x080483fb : pushl -0x4(%ecx) 0x080483fe : push %ebp 0x080483ff : mov %esp,%ebp 0x08048401 : push %ecx 0x08048402 : sub $0x14,%esp 0x08048405 : mov %gs:0x14,%eax 0x0804840b : mov %eax,-0x8(%ebp) 0x0804840e : xor %eax,%eax 0x08048410 : movl $0x8048500,(%esp) 0x08048417 : call 0x8048320 0x0804841c : mov -0x8(%ebp),%edx 0x0804841f : xor %gs:0x14,%edx 0x08048426 : je 0x804842d 0x08048428 : call 0x8048330 0x0804842d : add $0x14,%esp 0x08048430 : pop %ecx 0x08048431 : pop %ebp 0x08048432 : lea -0x4(%ecx),%esp 0x08048435 : ret
在 0x0804840e 处设置了一个断点,使用
b *0x0804840e
“程序流程在此断点停止后,我希望 gdb 转到下一个指令”而不是下一个<一行c 代码。我认为我不能为此使用 next
。那么除了在每条指令上设置断点之外,我还有什么其他选择呢?
I am attempting to figure the canary value setting and checking mechanism.
#include int main(void) { return printf("Hi!\n"); }
When disassemble the main, I get
(gdb) disas main 0x080483f4 : lea 0x4(%esp),%ecx 0x080483f8 : and $0xfffffff0,%esp 0x080483fb : pushl -0x4(%ecx) 0x080483fe : push %ebp 0x080483ff : mov %esp,%ebp 0x08048401 : push %ecx 0x08048402 : sub $0x14,%esp 0x08048405 : mov %gs:0x14,%eax 0x0804840b : mov %eax,-0x8(%ebp) 0x0804840e : xor %eax,%eax 0x08048410 : movl $0x8048500,(%esp) 0x08048417 : call 0x8048320 0x0804841c : mov -0x8(%ebp),%edx 0x0804841f : xor %gs:0x14,%edx 0x08048426 : je 0x804842d 0x08048428 : call 0x8048330 0x0804842d : add $0x14,%esp 0x08048430 : pop %ecx 0x08048431 : pop %ebp 0x08048432 : lea -0x4(%ecx),%esp 0x08048435 : ret
I set a breakpoint at 0x0804840e using
b *0x0804840e
After the program flow stops at this breakpoint I would like gdb
to go to the next instruction instead of next line of c code. I don't think I can use next
for this. So what other option do I have apart from setting a breakpoint at every instruction?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您想使用
stepi
,又名si
。它按照一条机器指令进行操作。(或者使用
ni
跳过call
指令。)查看 GDB 手册中有关继续和单步执行的部分,其中有 它的条目。
或者在GDB中,
help
/help running
会告诉你si
存在,help stepi
会告诉你更多关于它。You want to use
stepi
, akasi
. it steps by one machine instruction.(Or
ni
to step overcall
instructions.)Check the GDB manual's section on continuing and stepping, which has an entry for it.
Or inside GDB,
help
/help running
will show you thatsi
exists, andhelp stepi
will show you more about it.