如何使用python对程序进行gdb调试

意义

许多时候,我们调试程序时,需要自动化的做输入,甚至有些时候,这些输入必须由代码构成,因为很多实验中的输入内容是很难手动输入的。那么我们就需要通过python完成这些输入。

那么我们就以一个简单的栈溢出实验来说明这个操作是如何完成的

准备

首先,我们需要准备python2.7,并且用pip下载模块pwntools。你会发现pwntools依赖一些其他的模块,不要紧,缺少一个pip下载一个就可以了。然后就是使用apt下载gdbserver.
python2 运行我们工具的环境
pwntools 我们的工具
gdbserver 我们工具连接gdb所需要的系统环境

正文

gdb.debug(ELFPath,Cmd) return Process

我们能够这样使用他,例如:p = gdb.debug('./main','start')
这个函数接受一个可执行程序的路径和一个命令,个人觉得其实这个命令是没有必要的.因为他运行起这个程序时会先停止于加载器函数dl_start处,及程序的最最最开始处.
那么具体会是怎么样的一个情况呢?
我去网上下载了一个可以栈溢出的程序,放在和我的脚本同一个地方.我的脚本上第一句写了
p = gdb.debug("./warmup_csaw_2016","")(感觉平常gdb.debug比gdb.attach好用一些,因为可能你执行到gdb.attach的时候,可执行程序已经过你attach的那个断点了.)
这个时候就会弹出一个窗口.
当然,我们的目的是给可执行程序输入.所以我们需要在读取输入前下个断点,让另一个程序先运行完输出的部分,然后在运行到这个读取输入的部分.(因为我们不知道这些读取输入的语句是不是会阻塞的.)如果你不想给python程序下断点,那么也可以使用pause.这个函数会在终端中阻塞得等待一个任意字符.
注:似乎有些人弹不出这个窗口<.<,那么就看看结尾我提供的一些解决方案吧
这里挂上我操作的视频pwntools操作视频

弹不出gdb窗口

可能有些选手使用的是vscode,你要是在vscode中运行这个程序的话,他可能就弹不出来了.那么我提供两个方案.
一.直接在终端中运行脚本
但是我们又要调试可执行程序,又要调试我们的python程序啊,我们知道bug是代码的好朋友,只要有代码的地方就会有bug.
二.我们在gdb.debug的前面,或者是gdb.attach的前面,或者直接就在程序的最顶端添加一句这句话.context.terminal = ['/bin/gnome-terminal','-x','sh','-c']当然这个里面的内容参数是启动一个新终端的参数,这里的参数是只适用于我的环境的.但是如果你也想用的话只要确保你的系统中有gnome-terminal,并且/bin目录下有它.怎么下载?很简单,用apt就可以了.

后续

由于种种原因,不能在本机上玩了.现在只有一个linux服务器环境(Centos8)了,怎么办呢?
在linux上安装一个叫tmux的终端就可以了.这个终端有趣了,我们之前的pwndbg是弹出新的窗口的,tmux上是分裂了一块出来.我们只要在服务器中设置默认tmux为默认终端chsh -s /bin/tmux root就会将root用户的登录终端修改成了tmux.当然有可能原先是没有tmux的,但是这个很方便下载,用yum就可以了.
但是我们发现,vscode里面的终端还是bash的.
那么我们点这个地方
在这里插入图片描述
点选择默认配置文件,然后选择tmux就可以了.之后的运行和调试界面就都是在tmux上了.而代码中加上context.terminal这句话就可以了.

from pwn import *
context.terminal = ['tmux','splitw','-h']
p = gdb.debug("./1.out",'start')

也许tmux有些操作是很让人不习惯的,这里有一篇tmux基本快捷键

这里有一点简单的介绍,我用用是够了
ctrl + b进入控制状态,然后page up和page down可以上下滚动.
ctrl+b后使用方向键可以切换focus窗口.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值