意义
许多时候,我们调试程序时,需要自动化的做输入,甚至有些时候,这些输入必须由代码构成,因为很多实验中的输入内容是很难手动输入的。那么我们就需要通过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窗口.