GDB的调试技巧太多了,完全可以单独出一本书的,这篇文章仅仅是介绍自己这几天在做CS:APP上的二进制炸弹这道实验题所获得的一点点收获,权作以后备忘。
一.首先生成调试版本的可执行文件,然后gdb ./bomb即可。
二.设置断点
使用命令b 函数名或行号都可以。如b main。然后enter 命令run执行到断点处。info breakpoint查看断点信息。
三.掌握单步调试 step 和next命令。
step命令可以进入子函数内部,next则不进入函数内部,仅执行一个表达式的计算。
四.查看寄存器和内存的值
即使用打印命令print,比如查看寄存器eax的值,print /x $eax,查看内存的值, print /x *(int*)(0xbffff2e8),同理这个东西可以查看栈帧的值。x命令可以用来查看指针的指向的内存内存。如x /10x 0xbffff2e8。
五.修改寄存器和内存的值
使用set命令,如修改eax值为0x5,即 set $eax=0x65,修改内存则为set *(char*)(0x804a890)='B'。当然set命令还可以设置一些东西,比如单步调试模式 set step-mode on和反汇编模式 set disassemble-next-line on,在我反汇编bomb文件,并gdb时,就设置这两项。
六.栈信息
函数调用时要入栈,函数返回时要出栈,所以查看栈的信息也非常有用。bt(backrace)命令可以查看栈帧(stack frame)值,使用help stack 可以看到一下信息,自己按下面操作即可。
backtrace -- Print backtrace of all stack frames
bt -- Print backtrace of all stack frames
down -- Select and print stack frame called by this one
frame -- Select and print a stack frame
return -- Make selected stack frame return to its caller
select-frame -- Select a stack frame without printing anything
up -- Select and print stack frame that called this one。
最后,还是想讲一下二进制炸弹的调试,这个实验对你上面的实践有很大的帮助,而且比较有趣。这个实验能帮助深刻理解程序的调用和返回,参数的传入,和函数的返回值。具体细节这里不讨论,我是花了十几个小时才通全关,还是觉得要自己亲自实践才能更深入理解。