[NSSCTF]prize_p2

题目

打开是一段js代码

// 导入所需的模块
const { randomBytes } = require('crypto'); // 导入 crypto 模块,用于生成随机字节
const express = require('express'); // 导入 Express.js 模块,用于构建 Web 应用程序
const fs = require('fs'); // 导入文件系统模块,用于文件操作// flag.txt 文件的路径
const fp = '/app/src/flag.txt';// 创建 Express 应用程序
const app = express();// 用于存储 flag 数据的缓冲区
const flag = Buffer(255);// 以只读模式打开 flag.txt 文件
const a = fs.open(fp, 'r', (err, fd) => {// 将文件的前 44 个字节读取到 flag 缓冲区中fs.read(fd, flag, 0, 44, 0, () => {// 读取完文件内容后,删除 flag.txt 文件fs.rm(fp, () => {});});
});// 根路径的路由
app.get('/', function (req, res) {// 以文本/javascript;charset=utf-8 格式发送此文件的内容作为响应res.set('Content-Type', 'text/javascript;charset=utf-8');res.send(fs.readFileSync(__filename));
});// 获取 flag 提示的路由
app.get('/hint', function (req, res) {// 根据随机数发送 flag 缓冲区的一个片段作为提示res.send(flag.toString().slice(0, randomBytes(1)[0] % 32));
});// 获取 flag 的路由
app.get('/getflag', function (req, res) {res.set('Content-Type', 'text/javascript;charset=utf-8');try {let a = req.query.a;// 检查提供的值是否与随机生成的值匹配if (a === randomBytes(3).toString()) {// 如果匹配,作为响应发送指定文件的内容res.send(fs.readFileSync(req.query.b));} else {// 如果不匹配,在一定时间延迟后发送指定文件的内容(如果未提供延迟时间,默认为一天)const t = setTimeout(() => {res.send(fs.readFileSync(req.query.b));}, parseInt(req.query.c) ? Math.max(86400 * 1000, parseInt(req.query.c)) : 86400 * 1000);}} catch {// 捕获任何错误并发送问号作为响应res.send('?');}
});// 启动服务器监听 80 端口
app.listen(80, '0.0.0.0', () => {console.log('开始监听');
});

代码分析

先问g大哥 简单知道代码表达的意思

这是一段Express.js 服务器

所谓提供不同路由就是说

路由是用于定义应用程序如何响应客户端发起的不同 HTTP 请求的机制。换句话说,路由决定了当用户访问特定的 URL 时,服务器应该做出什么样的响应。

Express.js 允许开发人员使用 app.get()app.post()app.put()app.delete() 等方法来定义不同类型的路由。其中,app.get() 用于处理 HTTP GET 请求,app.post() 用于处理 HTTP POST 请求,依此类推。

例如,本题代码中,我们可以看到以下几个不同的路由:

根路径路由:

app.get('/', function (req, res) { res.set('Content-Type', 'text/javascript;charset=utf-8'); res.send(fs.readFileSync(__filename)); });

这个路由处理了根路径 '/' 的 GET 请求,当用户访问根路径时,服务器会发送当前文件的内容作为响应。

提示路由:

app.get('/hint', function (req, res) { res.send(flag.toString().slice(0, randomBytes(1)[0] % 32)); });

这个路由处理了 /hint 路径的 GET 请求,当用户访问 /hint 路径时,服务器会发送 flag 的一个片段作为提示。

分析到这里 火速去看一下hint

得到片段flag

多试几次 但是最多显示的字符是32个

所以本题的关键是在这里setTimeout(()

也就是说

要传a的值要符合随机生成的三位数

b的值是flag的路径

c的值决定延迟时间 在86400 * 1000之间取大,也就是说如果a的值不匹配至少延迟一天

所以我们这里先查询一下这个setTimeout()函数的绕过

解题思路

还真的找到绕过方式

看这个函数的官方文档setTimeout(callback, delay[, ...args]) | Node.js API 文档

那么我们传参c大于2147483647即可绕过

然后我试了一下

/getflag?a=111&b=/app/src/flag.txt&c=2147483648

发现不行

重返代码看看

原来这里把flag.txt文件删掉了

那怎么绕过呢

看了别人的wp

原来可以用文件描述符就是proc这个目录

之前也接触过

但是没有完全理解

现在再来学习一下

滑动验证页面

一、文件描述符概念

  Linux 系统中,把一切都看做是文件,当进程打开现有文件或创建新文件时,内核向进程返回一个文件描述符,文件描述符就是内核为了高效管理已被打开的文件所创建的索引,用来指向被打开的文件,所有执行I/O操作的系统调用都会通过文件描述符。

这里引用一下

我理解是打开一个文件就会创建一个进程,就会返回一个文件描述符,而这个文件描述符就指向这个打开的文件。很巧的是这题打开了flag.txt却没有关闭,我们可以通过文件描述符来获取到被删除文件的内容。linux的/proc目录是一个伪文件系统,linux一切皆文件,linux常见的进程也要变成文件存储在/proc目录下。在/proc目录下有很多以数字为名字的文件夹,就是进程运行时对应的进程号,而在这些文件夹下有一个fd文件夹,用于存放这个进程所拥有的文件描述符(数字)

之前就学过self文件

也就是说

/app/src/flag.txt 文件被 open() 打开,但最终没有关闭,虽然删除了该文件,但在 /proc 这个进程的 pid 目录下的 fd 文件描述符目录下还是会有这个文件的文件描述符,通过这个文件描述符我们即可得到被删除文件的内容。/proc/self/fd 这个目录里包含了进程打开文件的情况,目录里面有一堆/proc/self/fd/id文件,id就是进程记录的打开文件的文件描述符的序号。id可爆破猜测获得。

我这里爆了一下 好像把服务器爆宕了 (看别的wp这么说的)

最后得到18

payload:

/getflag?a=111&b=/proc/self/fd/18&c=2147483648

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

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

相关文章

论文笔记:(Security 22) 关于“二进制函数相似性检测”的调研

个人博客链接 注:部分内容参考自GPT生成的内容 [Security 22] 关于”二进制函数相似性检测“的调研(个人阅读笔记) 论文:《How Machine Learning Is Solving the Binary Function Similarity Problem》(Usenix Securi…

Golang中实现调用Windows API向指定目标发送ARP请求

简介 Go库中很多实现的arp都是支持osx/linux/bsd之类的, 但几乎没有支持windows的, 也试了一些方式, 目前还是选用调用windows的API, 记录一下这一次windows的API的调用经验。 实现 代码 package main/* #cgo CFLAGS: -I. #cgo …

Reactor模型详解

目录 1.概述 2.Single Reactor 3.muduo库的Multiple Reactors模型如下 1.概述 维基百科对Reactor模型的解释 The reactor design pattern is an event handling pattern for handling service requests delivered concurrently to a service handler by one or more inputs.…

OpenCV如何模板匹配(59)

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV如何实现背投(58) 下一篇 :OpenCV在图像中寻找轮廓(60) 目标 在本教程中,您将学习如何: 使用 OpenCV 函数 matchTemplate()搜索图像贴片和输入…

第四篇:记忆的迷宫:探索计算机存储结构的奥秘与创新

记忆的迷宫:探索计算机存储结构的奥秘与创新 1 引言 1.1 计算机存储系统的发展与重要性 在现代计算技术中,存储系统承担着非常关键的角色,它不仅负责信息的持久保存,同时确保高效的数据访问速度,影响着整体系统性能的…

《Fundamentals of Power Electronics》——基础交流建模方法

PWM整流器小信号交流模型建模的主要步骤为: (a)利用小纹波近似的动态版本,建立与电感和电容波形的低频平均值有关的方程; (b)平均方程的扰动和线性化; (c)交流等效电路模型的建立。 以下图buck-boost电路为例进行分析。 首先测…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑碳捕集和电转气的综合能源系统优化调度》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

SpringBoot与SpringMVC的区别

SpringBoot与SpringMVC的区别是什么? SpringBoot和SpringMVC是Java开发中常用的两个框架,它们都是由Spring框架所提供的,但在功能和使用方式上有着一些区别。本文将分别介绍SpringBoot和SpringMVC的特点和区别。 一、SpringBoot的特点&#…

Qt服务器端与客户端交互

Qt做客户端与服务器端交互第一步引入network 第一步引入network后继续编程首先界面设计 创建server和socket 引入QTcpServer&#xff0c;QTcpSocket MainWindow.h代码如下 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QTcpServer&…

13_Qt中的快捷键

Qt Creator的一些快捷操作&#xff1a; 项目管理&#xff1a; Build&#xff1a;以增量方式构建项目。Rebuild&#xff1a;重新构建项目。Clearn&#xff1a;清除项目构建过程中产生的所有中间文件。Run qmake&#xff1a;使用qmake/cmake重新构建项目。会重新执行UIC、MOC、…

如何面对并发下的bug

整理总结自蒋炎岩老师的b站课程&#xff0c;https://jyywiki.cn/OS/2022/index.html 并发bug与应对 应对bug的方法 在代码里边增加很多检查(加断言) #include "thread.h"unsigned long balance 100;void Alipay_withdraw(int amt) {if (balance > amt) {usleep(…

迎接AI时代:智能科技的社会责任与未来展望

AI智能体的社会角色、伦理挑战与可持续发展路径 引言&#xff1a; 在技术的浪潮中&#xff0c;AI智能体正逐步成为我们生活的一部分。它们在医疗、教育、交通等领域的应用&#xff0c;预示着一个全新的时代即将到来。本文将结合实际案例和数据分析&#xff0c;深入探讨AI智能体…

农作物害虫分类数据集12846张27类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;12846 分类类别数&#xff1a;27 类别名称:["ants","aphids…

Cisco WLC 2504控制器重启后所有AP掉线故障-系统日期时间

1 故障描述 现场1台WLC 2504控制器掉电重启后&#xff0c;所有AP均无线上线&#xff0c; 正常时共有18个AP在线&#xff0c;而当前为0 AP在线数量为0 (Cisco Controller) >show ap sumNumber of APs.................................... 0Global AP User Name..........…

国内各种免费AI聊天机器人(ChatGPT)推荐(中)

作者主页&#xff1a;点击&#xff01; 国内免费AI推荐(ChatGPT)专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月29日15点20分 随着人工智能技术的不断发展&#xff0c;AI聊天机器人已经逐渐融入我们的日常生活。它们可以提供各种服务&#xff0c;例如聊天、…

关于win平台c语言引入开源库的问题与解决

许久不写博客&#xff0c;五一还在加班&#xff0c;就浅浅写一篇吧 最近除了做物联网平台 还对网关二次开发程序做了修改&#xff0c;网关的二次开发去年年底的时候做过&#xff0c;但是当时的逻辑不是十分完善&#xff0c;差不多已经过了半年了&#xff0c;很多细节已经忘记了…

一毛钱不到的FH8208C单节锂离子和锂聚合物电池一体保护芯片

前言 目前市场上电池保护板&#xff0c;多为分体方案&#xff0c;多数场合使用没有问题&#xff0c;部分场合对空间有进一步要求&#xff0c;或者你不想用那么多器件&#xff0c;想精简一些&#xff0c;那么这个芯片就很合适&#xff0c;对于充电电池来说&#xff0c;应在使用…

foobar2000 for Mac:卓越音乐播放器

当您在寻找一款音质卓越、功能丰富的音频播放器时&#xff0c;foobar2000 for Mac无疑是您的首选。它拥有简洁明了的界面设计&#xff0c;易于上手&#xff0c;同时支持多种音频格式&#xff0c;让您无需担心兼容性问题。 foobar2000 for Mac v2.6.4免激活版下载 foobar2000 fo…

3.3Java全栈开发前端+后端(全栈工程师进阶之路)-前端框架VUE3框架-企业级应用-Vue组合式API

为什么要使用Composition API 一个Options API实例 在前面的课程中&#xff0c;我们都是采用 Options API&#xff08;基于选项的 API &#xff09; 来写一个组件的。下面是一个实例&#xff1a; <template> Count is: {{ count }}, doubleCount is: {{ doubleCount…

Python数据分析案例44——基于模态分解和深度学习的电负荷量预测(VMD+BiGRU+注意力)

案例背景 承接之前的案例&#xff0c;说要做模态分解加神经网络的模型的&#xff0c;前面纯神经网络的缝合模型参考数据分析案例41和数据分析案例42。 虽然我自己基于各种循环神经网络做时间序列的预测已经做烂了.....但是还是会有很多刚读研究生或者是别的领域过来的小白来问…