搭建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

相关文章

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Python极速搭建局域网文件共享服务器完整指南

《Python极速搭建局域网文件共享服务器完整指南》在办公室或家庭局域网中快速共享文件时,许多人会选择第三方工具或云存储服务,但这些方案往往存在隐私泄露风险或需要复杂配置,下面我们就来看看如何使用Py... 目录一、android基础版:HTTP文件共享的魔法命令1. 一行代码启动HTTP服务器2. 关键参

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon