prize_p2
prize_p2
const { randomBytes } = require('crypto');
const express = require('express');
const fs = require('fs');
const fp = '/app/src/flag.txt';
const app = express();
const flag = Buffer(255);
const a = fs.open(fp, 'r', (err, fd) => {
fs.read(fd, flag, 0, 44, 0, () => {
fs.rm(fp, () => {});
});
});
app.get('/', function (req, res) {
res.set('Content-Type', 'text/javascript;charset=utf-8');
res.send(fs.readFileSync(__filename));
});
app.get('/hint', function (req, res) {
res.send(flag.toString().slice(0, randomBytes(1)[0]%32));
})
// 随机数预测或者一天之后
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('?');
}
})
app.listen(80, '0.0.0.0', () => {
console.log('Start listening')
});
1.setTimeout:
setTimeout是使用Int32来存储延时参数值的,也就是说最大的延时值是2^31-1。 一旦超过了最大值,其效果就跟延时值为0的情况一样。数为 2147483648,即可实现延时为0。
2.fd:
/app/src/flag.txt 文件被 open() 打开,但最终没有关闭,虽然删除了该文件,但在 /proc 这个进程的 pid 目录下的 fd 文件描述符目录下还是会有这个文件的文件描述符,通过这个文件描述符我们即可得到被删除文件的内容。/proc/self/fd 这个目录里包含了进程打开文件的情况,目录里面有一堆/proc/self/fd/id文件,id就是进程记录的打开文件的文件描述符的序号。id可爆破猜测获得。
payload:
http://node4.anna.nssctf.cn:28729/getflag?b=/proc/self/fd/18&c=2147483648


浙公网安备 33010602011771号