不宽的宽字符

根据提示,通过nc 202.38.93.141 14202来进行连接,可以用自己的机器进行连接,也可以直接点击“打开/下载题目”连接:


意料之中的无法打开flag,看来得下载附件看看源码了


#include <iostream>
#include <fstream>
#include <cctype>
#include <string>
#include <windows.h>int main()
{std::wcout << L"Enter filename. I'll append 'you_cant_get_the_flag' to it:" << std::endl;// Get the console input and output handlesHANDLE hConsoleInput = GetStdHandle(STD_INPUT_HANDLE);HANDLE hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);if (hConsoleInput == INVALID_HANDLE_VALUE || hConsoleOutput == INVALID_HANDLE_VALUE){// Handle error – we can't get input/output handles.return 1;}DWORD mode;GetConsoleMode(hConsoleInput, &mode);SetConsoleMode(hConsoleInput, mode | ENABLE_PROCESSED_INPUT);// Buffer to store the wide character inputchar inputBuffer[256] = { 0 };DWORD charsRead = 0;// Read the console input (wide characters)if (!ReadFile(hConsoleInput, inputBuffer, sizeof(inputBuffer), &charsRead, nullptr)){// Handle read errorreturn 2;}// Remove the newline character at the end of the inputif (charsRead > 0 && inputBuffer[charsRead - 1] == L'\n'){inputBuffer[charsRead - 1] = L'\0'; // Null-terminate the stringcharsRead--;}// Convert to WIDE charswchar_t buf[256] = { 0 };MultiByteToWideChar(CP_UTF8, 0, inputBuffer, -1, buf, sizeof(buf) / sizeof(wchar_t));std::wstring filename = buf;// Haha!filename += L"you_cant_get_the_flag";std::wifstream file;file.open((char*)filename.c_str());if (file.is_open() == false){std::wcout << L"Failed to open the file!" << std::endl;return 3;}std::wstring flag;std::getline(file, flag);std::wcout << L"The flag is: " << flag << L". Congratulations!" << std::endl;return 0;
}

看得不是很懂,丢给ai分析一下


1. 控制台输出初始化

这行代码输出提示信息,要求用户输入一个文件名。


2. 获取控制台句柄

这里获取了标准输入和标准输出的句柄。如果获取失败,程序会返回错误码1。


3. 设置控制台模式

这行代码设置了控制台输入模式,启用了ENABLE_PROCESSED_INPUT标志,以便处理特殊字符(如回车、退格等)。


4. 读取用户输入

这里使用ReadFile函数从控制台读取用户的输入。如果读取失败,程序会返回错误码2。


5. 处理输入字符串

这行代码检查输入的最后一个字符是否是换行符\n,如果是,则将其替换为字符串终止符\0,并减少字符计数。


6. 转换为宽字符

这里将多字节字符转换为宽字符(wchar_t),使用的是UTF-8编码。


7. 构建文件名

将用户输入的文件名与固定字符串"you_cant_get_the_flag"拼接起来,形成最终的文件名。


8. 打开文件

这里尝试以宽字符形式打开文件。


9. 检查文件是否打开成功

如果文件打开失败,程序会输出错误信息并返回错误码3。


10. 读取文件内容

从文件中读取第一行内容到变量flag中。


11. 输出结果

输出读取到的“flag”内容。


12. 返回0

程序正常结束,返回0。


其中,关键代码在这:

首先将输入的字符数组(char *)转变成宽字符数组(wchar_t *),导入宽字符串后又将其转换成了字符数组(char *)。

这整个过程会将输入的每一个字符(1个byte)先扩展成一个宽字符(2个byte),如果输入的是ascii码,扩展之后会在新增的1个高位byte上补 0x00. 由于大部分机型是小端存储,所以 1byte 低地址存储的应该是低位,即ascii码,高位的 1byte 存储的是 0x00。所以从宽字符串转到普通字符串时,ascii码不变,但每个ascii码后面多了个 0x00,而这又是字符串终止符 ‘\0’ 的ascii码,所以导致如果输入的字符串有ascii码,那么打印输出的字符串只能显示第一个ascii码,后面的都因终止符而不能显示。但如果输入不是ascii码,而是其他的unicode,则可以避免这种情况。中文是一种unicode,它在普通字符数组里存储是占两个字节的,而且是一体的,不会在扩展为宽字符数组时被分成两个1byte并补0x00。利用这个特性,我们就可以将目标输出 Z:\theflag 以两个byte为一组的形式转变为其他unicode。


需要将字符串Z:\theflag转成16进制ascii码:

得到结果如下:

0x5a 0x3a 0x5c 0x74 0x68 0x65 0x66 0x6c 0x61 0x67


再由小端存储的规则,将转换结果变成(将每两位调换位置,为了使每个2 byte都遵循小端存储)

0x3a 0x5a 0x74 0x5c 0x65 0x68 0x6c 0x66 0x67 0x61

将每两位作为一组,变为\u3a5a \u745c \u6568 \u6c66 \u6761


此时再去unicode转中文:

得到结果:

㩚 瑜 敨 汦 条


还要注意一点,因为filename后面被加上了一串ascii字符串,所以我们要截断后面的字符串,如果不把后面截断,就会在filename里多出现一个”f”字符。

所以要在后面加一个\uxx00(xx是两个十六进制数,而且要求选的xx要使得\uxx00是可见字符)

这里选择的加的后缀是\u9a00

\u3a5a \u745c \u6568 \u6c66 \u6761 \u9a00


进行unicode转中文:

得到结果:

㩚 瑜 敨 汦 条 騀


去掉空格:

㩚瑜敨汦条騀

成功得到flag

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

无脑使用matlab运行YOLOv5模型,实现目标检测

文章目录 前言代码报错解决方法缺点总结 前言 YOLO 是一种经典的一阶段目标检测算法&#xff0c;它将检测问题转化为回归问题。与 Faster R-CNN 不同&#xff0c;YOLO 不是提取 RoI,而是直接通过回归的方法生成每个类的边界框坐标和概率。与 Faster R-CNN相比&#xff0c;大大…

java ssm 高校固定资产管理系统 高校物资管理 资产信息 源码 jsp

一、项目简介 本项目是一套基于SSM的高校固定资产管理系统&#xff0c;主要针对计算机相关专业的和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本、软件工具等。 项目都经过严格调试&#xff0c;确保可以运行&#xff01; 二、技术实现 ​后端技术&am…

《战国王朝》青铜材料具体作用介绍

《战国王朝》中的青铜材料是游戏里非常重要的金属材料&#xff0c;而青铜材料的具体作用就是青铜用于制作第三层次的工具和武器;它比铜制的更好&#xff0c;但不如铁和钢制的&#xff0c;相比石制和铜制工具&#xff0c;青铜物品的使用寿命更长。 战国王朝青铜材料有什么用 青…

unity3d————延时函数

1.public void InvokeRepeating(string methodName, float time, float repeatRate); 延迟重复执行函数 InvokeRepeating 参数一&#xff1a;函数名字符串 参数二&#xff1a;第一次执行的延迟时间 参数三&#xff1a;之后每次执行的间隔时间 注意&#xff1a; 1-1.延时函数第…

焊接手电钻板子后总结

复用旧工程部分方案注意事项&#xff1a; 粘贴暑假时候做的工程原理图&#xff0c;复制到现在的项目中竟然忘记修改3V3的名称&#xff0c;导致3V3MCU与3V3的区别&#xff0c;这个错误以后一定要注意&#xff1a; 现在工程中的供电3V3&#xff0c;不是3V3MCU: 焊接QFN芯片&…

大模型智能客服比传统智能客服“智”在哪里?

随着人工智能技术的飞速发展&#xff0c;智能客服已成为企业提升服务效率和客户满意度的关键工具。在智能客服的演进过程中&#xff0c;大模型智能客服以其卓越的性能和智能化水平&#xff0c;逐渐崭露头角&#xff0c;更是为客户服务带来了新的变革。那么&#xff0c;大模型客…

Google Play上架/更新被拒的原因及解决方案

Google Play商店是全球Android开发者发布应用的首选平台&#xff0c;但在这个平台上发布或更新应用时&#xff0c;开发者必须遵守严格的规定和政策。如果违反这些规定&#xff0c;应用可能会被拒绝上架或更新&#xff0c;甚至可能导致开发者账号被封禁。本文将总结Google Play上…

docker安装到D盘

双击安装docker默认是安装在c盘&#xff0c;并且安装时我们没法选择位置&#xff0c;如果我们要安装在其他盘可以通过命令行安装 1、下载docker https://docs.docker.com/desktop/setup/install/windows-install/ Docker Desktop 可以使用 WSL 和 Hyper-V任意一种架构&#xf…

Exploring Defeasible Reasoning in Large Language Models: A Chain-of-Thought A

文章目录 题目摘要简介准备工作数据集生成方法实验结论 题目 探索大型语言模型中的可废止推理&#xff1a;思路链 论文地址&#xff1a;http://collegepublications.co.uk/downloads/LNGAI00004.pdf#page136 摘要 许多大型语言模型 (LLM) 经过大量高质量数据语料库的训练&…

山寨一个Catch2的SECTION

Catch2 是一个 C 单元测试库&#xff0c;吹嘘自己比 NUnit 和 xUnit 还要高明&#xff0c; 支持在 TEST_CASE() 中的多个 SECTION&#xff0c; 意思是说 SECTION 外头的代码相当于setup 和 teardown&#xff0c;section 内部则被认为是实际的 test case&#xff0c; 这种写法可…

TensorFlow_T7 咖啡豆识别

目录 一、前言 二、前期准备 1、设置GPU 2、导入数据 3、查看数据图片 三、数据预处理 1、加载数据 2、可视化数据 3、配置数据集 四、构建VGG-16网络 1、VGG优缺点分析 2、自建模型 3、网络结构图 五、编译 六、 训练模型 一、前言 &#x1f368; 本文为&#…

平替备用机!不到 5 元的 410 随身 WiFi 免刷机实现短信转发

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 各位用备用机的&#xff0c;应该有很多只是插上不常用的手机卡&#xff0c;然后装个短信转发的 App 来看看验证码什么的吧。每隔一段时间还要去看看备用机还有没有电&#xff0c;但其实这种需求骁龙 410 芯…

【EmbeddedGUI】脏矩阵设计说明

脏矩阵设计说明 背景介绍 一般情况下&#xff0c;当屏幕内容绘制完毕后&#xff0c;实际应用通常需要更新屏幕中的一部分内容&#xff0c;而不是单纯显示一个静态图片在那。 如下图所示&#xff0c;屏幕中有一个图片控件&#xff08;Img2&#xff09;和一个文本控件&#xf…

网络基础-超文本协议与内外网划分(超长版)

一、超文本协议 1. HTTP协议简介 1.1. 网络架构简单介绍 (1). C/S架构&#xff08;Client/Server架构&#xff09; (2). B/S架构&#xff08;Browser/Server&#xff09; 总结对比 2. HTTP协议版本 2.1. HTTP/0.9 &#xff08;1991年发布&#xff09; 2.2. HTTP/1.0 &a…

5分钟搞懂 Golang 堆内存

本文主要解释了堆内存的概念&#xff0c;介绍了 Linux 堆内存的工作原理&#xff0c;以及 Golang 如何管理堆内存。原文: Understanding Heap Memory in Linux with Go 你想过为什么堆内存被称为 "堆" 吗&#xff1f;想象一下杂乱堆放的对象&#xff0c;与此类似&…

今日 AI 简报 | 开源 RAG 文本分块库、AI代理自动化软件开发框架、多模态统一生成框架、在线图像背景移除等

❤️ 如果你也关注大模型与 AI 的发展现状&#xff0c;且对大模型应用开发非常感兴趣&#xff0c;我会快速跟你分享最新的感兴趣的 AI 应用和热点信息&#xff0c;也会不定期分享自己的想法和开源实例&#xff0c;欢迎关注我哦&#xff01; &#x1f966; 微信公众号&#xff…

【C++学习(35)】在Linux中基于ucontext实现C++实现协程(Coroutine),基于C++20的co_await 协程的关键字实现协程

文章目录 为什么使用协程协程的理解协程优势协程的原语操作yield 与 resume 是一个switch操作&#xff08;三种实现方式&#xff09;&#xff1a; 基于 ucontext 的协程基于 XFiber 库的操作1 包装上下文2 XFiber 上下文调度器2.1 CreateFiber2.2 Dispatch 基于C20的co_return …

技术段子——论如何在0.387秒以内获取到闲鱼的上新数据。

个人一直在做闲鱼辅助相关的工具类软件。因为知道阿里系请求和风控的原因&#xff0c;再加个人做软件一直想的是如何让用户稳定运行。 因为阿里系对于请求的风控&#xff0c;所以个人风格导到软件效率一直一般。并不是做不到快速抓取&#xff0c;而是用效率换稳定。 所以&#…

【C#设计模式(10)——装饰器模式(Decorator Pattern)】

前言 装饰器模式可以在运行时为对象添加额外的功&#xff0c;而无需修改原始对象的代码。这种方式比继承更加灵活。 代码 //蛋糕类&#xff08;抽象类&#xff09; public abstract class Cake {public abstract void Create(); } //奶油蛋糕类 public class CreamCake : Cak…

2025年PMP考试安排是怎样?备考计划与重要时间节点公布

PMP考试在中国大陆每年举行四次&#xff0c;分别是在3月、6月、9月和12月。而中国港澳台地区的PMP考试则可以每天进行机考。在中国大陆地区的笔试考试中&#xff0c;主要采用涂卡和机读卡来记录成绩。 每次PMP考试的时间都是在周六的9点到12点50分&#xff0c;共计230分钟。 P…