GDB调试
GDB调试
这篇文章用于记录gdb调试的学习
常用指令
1 | gdb pwn #开始调试 |
给exp加gdb调试
1 | context.terminal = ["tmux","splitw","-h"]#左右分屏 |
此处加了一个小插件tmux可以双栏显示调试,更方便查看。
1 | sudo apt update |
终端输入tmux即可启动
在gdb调试中一般要注意三个区域
区域1:当前状态下各个寄存器中存储的值(可称之为寄存器区)
区域2:当前执行步骤所执行的汇编指令以及该指令附近的汇编语句(可称为程序汇编区)
区域3:从rsp往下部分栈中的情况(可称为栈区)
利用GDB计算偏移量
32位:返回地址的偏移为 ebp地址-esp地址-esp距起始位置的距离+4(ebp)
以这题为例
1 | .text:08048E8F 8D 44 24 1C lea eax, [esp+1Ch] |
使用x/gx计算0xffffd1d8-0xfffd150-0x1C+4=112
64位同理但是是+8
下断点
无PIE时
1 | b main #main可换成任意函数 |
有PIE时
1 | b* $rebase(要下断点的偏移) |
使用这个指令前得先让程序跑起来,gdb才能知道elf的基地址,偏移可以在IDA中查看,IDA中此时看到的地址即为偏移
GDB放置在函数里时如何使用
gdb放置在exp里时通常可以查看我们的payload传输进去之后程序执行流的变化或调试寄存器的信息
可以以下几种形式进行调试
1 | gdb.attach(io) #放在哪里断点就下在哪里一般放在发送payload之前 |
注意有时我们还没启动gdb程序执行流就已经关闭就会报错这样的信息
显示没有那个进程,debug输出可以看到我们的payload是被发送出去了的,这种情况就是脚本执行太快了gdb还没来得及启动就运行结束了,加上sleep(1)在发送或接收脚本之前即可解决
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 mint1.!