awdp pwn

news/2025/3/19 13:06:33/文章来源:https://www.cnblogs.com/cosyQAQ/p/18780813

第十八届CISCN&CCB半决赛

awdp pwn

typo

snprintf() 是一个 C 语言标准库函数,用于格式化输出字符串,并将结果写入到指定的缓冲区,与 sprintf() 不同的是,snprintf() 会限制输出的字符数,避免缓冲区溢出。

C 库函数 int snprintf(char str, size_t size, const char format, ...) 设将可变参数 (...) 按照 format 格式化成字符串,并将字符串复制到 str 中,size** 为要写入的字符的最大数目,超过 size 会被截断,最多写入 size-1 个字符。

与 sprintf() 函数不同的是,snprintf() 函数提供了一个参数 size,可以防止缓冲区溢出。如果格式化后的字符串长度超过了 size-1,则 snprintf() 只会写入 size-1 个字符,并在字符串的末尾添加一个空字符(\0)以表示字符串的结束。

声明:

下面是 snprintf() 函数的声明。

int snprintf ( char * str, size_t size, const char * format, ... );

看到 edit​ 函数,当时就在分析怎么改这个 snprintf​ 函数,感觉是参数不对

unsigned __int64 edit()
{signed int v1; // [rsp+4h] [rbp-11Ch] BYREFunsigned __int64 v2; // [rsp+8h] [rbp-118h]char s[264]; // [rsp+10h] [rbp-110h] BYREFunsigned __int64 v4; // [rsp+118h] [rbp-8h]v4 = __readfsqword(0x28u);printf("Index: ");__isoc99_scanf("%d", &v1);if ( (unsigned int)v1 < 0x20 ){if ( *((_QWORD *)&unk_4060 + v1) ){v2 = **((_QWORD **)&unk_4060 + v1);printf("New size of content: ");memset(s, 0, 0x100uLL);read(0, s, 0x100uLL);snprintf(*((char **)&unk_4060 + v1), (size_t)"%lu", s, 8LL);// 比赛的时候就觉得这个有问题,但不知道怎么改if ( v2 < **((_QWORD **)&unk_4060 + v1) ){puts("Too large");**((_QWORD **)&unk_4060 + v1) = v2;}printf("What do you want to say: ");read(0, (void *)(*((_QWORD *)&unk_4060 + v1) + 8LL), **((_QWORD **)&unk_4060 + v1));}else{puts("No card here");}}else{puts("Invalid index");}return __readfsqword(0x28u) ^ v4;
}

image-20250319125127408

image-20250319125136166

Prompt

off by null 给它 nop掉

image-20250319125152332

找到 sub_1A40函数,猜测memcpy存在溢出,把rdx改小

unsigned __int64 __fastcall sub_1A40(__int64 a1)
{signed int v2; // [rsp+18h] [rbp-18h]signed int v3; // [rsp+1Ch] [rbp-14h]unsigned __int64 v4; // [rsp+28h] [rbp-8h]v4 = __readfsqword(0x28u);if ( *(_QWORD *)(a1 + 48) ){if ( *(_QWORD *)(a1 + 32) ){v2 = **(_DWORD **)(a1 + 56);v3 = **(_DWORD **)(a1 + 40);if ( (unsigned int)v2 < 0x10 && *((_QWORD *)&unk_5060 + v2) && (unsigned int)v3 <= 0x500 ){qword_50E0[v2] = v3;if ( *(_QWORD *)(a1 + 64) && *(_QWORD *)(a1 + 72) )memcpy(*((void **)&unk_5060 + v2), *(const void **)(a1 + 72), 0LL);elsememset(*((void **)&unk_5060 + v2), 0, v3);}}}return v4 - __readfsqword(0x28u);
}

找到 sub_1A40函数,memcpy存在溢出,改rdx参数为0

unsigned __int64 __fastcall sub_17BB(__int64 a1)
{int i; // [rsp+18h] [rbp-18h]signed int v3; // [rsp+1Ch] [rbp-14h]unsigned __int64 v4; // [rsp+28h] [rbp-8h]v4 = __readfsqword(0x28u);if ( *(_QWORD *)(a1 + 32) ){v3 = **(_DWORD **)(a1 + 40);if ( (unsigned int)v3 <= 0x500 ){for ( i = 0; i <= 15 && *((_QWORD *)&unk_5060 + i); ++i );if ( i <= 15 ){qword_50E0[i] = v3;*((_QWORD *)&unk_5060 + i) = malloc(v3);if ( !*((_QWORD *)&unk_5060 + i) )exit(1);memset(*((void **)&unk_5060 + i), 0, v3);if ( *(_QWORD *)(a1 + 64) && *(_QWORD *)(a1 + 72) )memcpy(*((void **)&unk_5060 + i), *(const void **)(a1 + 72), 0LL);}}}return v4 - __readfsqword(0x28u);
}

其他方法:

在第一个函数 sub_17BB 里面

image-20250319125231993

把0x500改成0x100,防止large bin attack之类的

image-20250319125243157

patch后

image-20250319125309767

这里有个 off by null ,把这一行nop掉(比赛中有改,我应该是改改这个和上面的 memcpy 一起成功的)

image-20250319125320504

image-20250319125328798

这个函数有 uaf 比赛时没看到,把0x1000改小

image-20250319125336811

image-20250319125351573

成了

post_quantum

输入函数,把0x20改小

int sub_1441()
{char buf[56]; // [rsp+0h] [rbp-40h] BYREFunsigned __int64 v2; // [rsp+38h] [rbp-8h]v2 = __readfsqword(0x28u);read(0, buf, 0x20uLL);return atoi(buf);
}

image-20250319125402847

同样 off by null 把free 下面一行 nop 掉

image-20250319125420643

image-20250319125427838

这样就改成了,上传就修复成功了

还可以改这个 0x1F 改小

image-20250319125436470

image-20250319125444990

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

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

相关文章

matlab并行计算

parfor比较难用,要求变量之间不能有干扰,必须能相互独立,这里推荐一下parfeval,相当于多开了n个matlab。 parfeval可以并行运行同一个函数,赋值不同的参数。 首先创建并行池-: p = parpool(2);%这里相当于使用了两个核心,根据你的CPU核心数决定。parfeval用于并行执行代…

1.4K star!几分钟搞定AI视频创作,这个开源神器让故事可视化如此简单!

story-flicks 是一个基于AI技术的自动化视频生成工具,能够将文字剧本快速转化为高质量短视频。开发者@alecm20通过深度学习算法,实现了从文本解析到视频合成的全流程自动化处理,支持多平台适配输出,是内容创作者和自媒体运营者的效率神器。 嗨,大家好,我是小华同学,关注…

C#实现自己的Json解析器(LALR(1)+miniDFA)

C#实现自己的Json解析器(LALR(1)+miniDFA) Json是一个用处广泛、文法简单的数据格式。本文介绍如何用bitParser(拥有自己的解析器(C#实现LALR(1)语法解析器和miniDFA词法分析器的生成器))迅速实现一个简单高效的Json解析器。 读者可在(JsonFormat)查看、下载完整代码。 J…

R语言中绘制火山图

001、# 生成随机数据 set.seed(123) # 设置种子以便结果可重复 genes <- paste("Gene", 1:1000) # 基因名称 logFC <- rnorm(1000, mean = 0, sd = 2) # log2 fold change,均值为0,标准差为2的正态分布 pvalue <- runif(1000, min = 0, max = 1) # p值…

Windows 系统安装 Python3.7 、3.8、3.9、3.10、 3.11 最新版,附带相应程序。

在 Windows 系统上下载和安装 Python 的教程: 下是 Python 3.7 到 3.11 每个版本在 Windows 64 位系统下最后更新版本的直接下载地址。 其他版本访问Python 官方网站。 Python 3.7.9此版本为 Python 3.7 系列最后更新版本,下载地址:python-3.7.9-amd64.exePython 3.8.10它是…

库存持有成本的底层运算逻辑是什么?

你可能会觉得,库存持有成本这个概念听起来有点抽象: 库存不就是放在仓库里待着吗,怎么还会“花钱”? 其实,库存持有成本就是你把货物放在仓库里,背后所产生的一系列费用。 这些费用包括仓库租金、保险费用、商品的折旧损耗,还有库存过期的风险等等。 今天,我们就来拆解…

Windows部署deepseek R1训练数据后通过AnythingLLM当服务器创建问答页面

如果要了解Windows部署Ollama 、deepseek R1请看我上一篇内容。 这是接上一篇的。 AnythingLLM是一个开源的全栈AI客户端,支持本地部署和API集成。它可以将任何文档或内容转化为上下文,供各种语言模型(LLM)在对话中使用。以下是关于Windows环境下使用AnythingLLM API的一些…

变量数据类型流程控制

常量变量 常量 1.概述:在代码的运行过程中,值不会发生改变的数据 2.分类:整数常量:所有整数小数常量:所有带小数点的2.5 1.5 2.0字符常量:带单引号的 单引号中必须有且只能有一个内容1(算) 11(不算) (不算) a1(不算) (算) (两个空格不算)写一个tab键(算) 字符…

Vue2-自定义创建项目、ESLint、Vuex及综合案例购物车

Vue2自定义创建项目 基于VueCli自定义创建项目架子 步骤:安装VueCLI脚手架npm i @vue/cli -g 可以通过vue --version 判断是否下载VueCLI在某个文件夹中创建vue项目vue create 项目名称 (项目名中不能包含大写字母)选择Manually select features选择Babel(语法降级)、Ro…

yum install -y devtoolset-8-gcc*

如果执行结果为上面这个结果的话,需要执行以下操作 yum install centos-release-scl*修改CentOS-SCLo-scl.repo文件 baseurl=https://mirrors.aliyun.com/centos/7/sclo/x86_64/rh/ 和 gpgcheck=0修改CentOS-SCLo-scl-rh.repo文件和上面一样查看 [root@iZbp153shsqfoddljmkit4…

几个技巧,教你去除文章的 AI 味!

给大家分享一些快速去除文章 AI 味的小技巧,有些是网上被分享过的,也有些是我个人的经验。学会之后,无论是写工作文案、毕业设计、自媒体文章,还是平时生活中写写好评,都是非常轻松的。最近有不少朋友在利用 AI 写毕业设计论文,几秒钟一篇文章就刷出来的,爽的飞起。 结果…

Sci Chart中的XyDataSeries与UniformXyDataSeries

在 SciChart 中,XyDataSeries 和 UniformXyDataSeries 是两种用于处理数据序列的核心类,主要差异体现在数据存储方式、性能优化及适用场景上。 以下是具体对比: 1. 数据存储与结构差异 **XyDataSeries<TX, TY>** 需要同时存储 X 和 Y 值的完整坐标对。例如,对于每个数…