阅读 241

解决运行在kali环境下的pwntools无法给gdb.attach()时候传递gdbscript的问题

最近在做pwn题,写了如下脚本:


##!/usr/bin/env python
from pwn import*
 
r=process('./ret2libc2')
 
sys_adr=0x08048490
gets_adr=0x08048460
buf2_adr=0x0804A080
gdb.attach(r,'''
b * 080486BA 
''')#这里下个断点
 
payload=b'A'*112+gets_adr+sys_adr+buf2_adr+buf2_adr
 
r.sendline(payload)
r.sendline('/bin/sh')
r.interactive()           
复制代码

本来是很简单的一个题,但我今天调试的时候发现了一个问题

在这里插入图片描述
提示在倒入gdbscript文件的时候提示,No such file or directory,但是我去目录下看了看,确实是有这个文件的。
在这里插入图片描述

显然这是一个bug我又在ubuntu里面跑了同一个脚本仔细查了一下。发现没有这个问题。 为了解决这个bug,我去翻pwntools的源码,因为gdb相关的命令是在pwnlib里面的,我就用了如下命令查看:

>>>import pwnlib
>>>pwnlib.__file__
'/home/kali/lib/python3.7/site-packages/pwnlib/__init__.py'
>>>
复制代码

在pwnlib的目录下翻了翻,因为和gdb有关就 之后浏览/home/kali/.local/lib/python3.7/site-packages/pwnlib/gdb.py看到了一些东西,

在这里插入图片描述

在这里插入图片描述
可以看到,gdb.attach()的原理主要是通过在新终端中启动命令。命令的组成中 -x的参数对应的是gdbscript文件也就是"b * 080486BA"这一个下断点的命令。 之后我又去翻了翻misc的库,它在pwnlib.util里面
在这里插入图片描述
显然pwntools-terminal是没有的,我没装,那么打开的就是后面一些东西。检查了一下发现DISPLAY在os的环境变量里面,优先级比较高,然后我就去查了一下x-terminal-emulator 发现以下命令会产生相同的问题:

/usr/bin/x-terminal-emulator -e '/usr/bin/gdb -q  "./ret2libc2"  -x "/tmp/gdbscript"'
复制代码

在这里插入图片描述
之后我在Ubuntu里面执行相同的命令,虽然也报错,但不太一样。
在这里插入图片描述
区别就在于一个有双引号,一个没有。 然后我在两个系统里面分别 cat /usr/bin/x-terminal-emulator得到了不同的结果
在这里插入图片描述
在这里插入图片描述

在kali里面是二进制文件,但在ubuntu里面是脚本文件,而且最后启动的还是gnome-terminal,于是我的思路就来了,原来x-terminal-emulator只是一个引用而已,并不是一个实际的伪终端程序。 网上查了查,发现x-terminal-emulator可以被配置:

sudo update-alternatives --config x-terminal-emulator
复制代码

在这里插入图片描述
可以看到,在kali里面默认的引用是qterminal,其他的还有xterm等,于是我使用qterminal使用该命令

qterminal -e '/usr/bin/gdb -q  "./ret2libc2"  -x "/tmp/gdbscript"'
复制代码

在这里插入图片描述
可以看到这个命令被转义了,转义成了以下命令:

qterminal -e /usr/bin/gdb -q  \"./ret2libc2\"  -x \"/tmp/gdbscript\"
复制代码

这就导致gdb在接收这个文件路径的时候/tmp/gdbscript结果接收了"/tmp/gdbscript", 导致路径出错,gdb的路径不能有双引号。 之后我一连试了koi8rxterm,lxterm,uxterm ,xterm发现都没问题只有qterminal有问题,于是就交了一个issue github.com/lxqt/qtermi… 所以解决方法就是换x-terminal-emulator的引用程序,不过qterminal很漂亮,别的虽然不出错,但都很丑。 忙了半天,这个bug就算解决了吧,以后还是用ubuntu比较好。