gdb代码跳转调试
不使用jump命令时怎么玩?
有时调试程序时,可能会出现因为某些错误f函数恒定为真/假,而又不想急于重新编译/搭建环境来解决这个问题。
这时,可以通过直接修改数据寄存器或者指令寄存器来达到目的(要清楚的知道f的影响范围,需要的寄存器)。
这里假设因为某些错误f恒为真,所以错误执行了f1分支,而实际上我们想执行的是f2.
示例代码
1 |
|
1 | (gdb) disassemble _start |
1 | (gdb) disassemble main |
f函数会将返回值放入rax寄存器,所以在f函数执行后,将rax寄存器修改为想要的值即可。
1 | (gdb) b f |
因为这里f函数对其他范围无影响,可以不执行。CPU从何处执行指令是由CS、IP中的内容决定的,所以可以直接修改rip,直接执行f2.。
1 | (gdb) r |