第三届鲲鹏杯初赛(校赛)
阳光摆烂大男孩
Solves
个人情况(右上角PROFILE,所有队员均要贴出):
@hey
@wulala
@抓到一只梗
WEB
ezssrf@hey
代码审计
1 |
|
此时使用了危险函数include();此时可以联想到文件包含,使用filter伪协议进行读取
1 | php://filter/read=convert.base64-encode/resource=flag.php |
此时回显为waf!
,此时我们可以知道题目对我们的输入做了过滤,将flag
加入了黑名单;此时怀疑存在文件敏感信息泄露;又因为不需要使用到扫描器
此时我们可以读取比较常见的文件比如index.php
代码审计2
1 |
|
此时我们知道了其过滤规则,在检测到$path中含有flag且$secret是不等于$secret的MD5散列值时便会输出waf!
;那么此时我们可以构造$secret等于
$secret的MD5散列值来绕过这个过滤;此时的考点变为MD5的绕过
payload
1 | file=php://filter/convert.base64-encode/resource=flag.php&secret=0e215962017 |
ezser@hey
代码审计
1 |
|
此时一般看到echo new $a($b)
这种形式,就需要考虑利用php的原生类来遍历目录以及读取文件;但是此时存在双参数new $a($b, $c)
并且类中存在注释时我们就要知道此时的考点在于通过php的原生类的反射类获取注释内容;此时我们观察源码可知flag在注释里但并不会被显示出来,但是我们可以利用通过反射 ReflectionMethod 类来获取类方法的相关信息;此时我们需要调取的是Flag类中的方法
ReflectionClass API
1 | $ref = new ReflectionClass(B::class); |
ReflectionMethod API
1 | ReflectionMethod::__construct — ReflectionMethod 的构造函数 |
分析题目,猜测flag是藏在类的注释中,我们能够实例化任意类,并调用类方法,那么就可以利用PHP内置类中的ReflectionMethod来读取Flag类里面各个函数的注释;本题考察的是 PHP反射,ReflectionMethod构造Flag类中的函数方法,再通过getDocComment获取函数的注释。综上所述,此时我们就可以构造一个反射对象来打印所有类的注释来得到flag
payload
1 | ?a=ReflectionMethod&b=Flag&c=read&d=getDocComment |
此时这个payload就相当于(reflectionMethod(Flag,read) ->getDocConmment())
参考文章:
https://ethe448.github.io/2022/02/25/%E4%BB%8E%E4%B8%80%E9%81%93ctf%E9%A2%98%E7%9C%8Bphp%E5%8E%9F%E7%94%9F%E7%B1%BB/#toc-heading-4
解法二
此时我们知道SplFileObject类也可以读取文件,此时我们来关注一下他的用法
SplFileObject类摘要
1 | class SplFileObject extends SplFileInfo implements RecursiveIterator, SeekableIterator { |
SplFileObject目录
1 | SplFileObject::__construct — Construct a new file object |
此时我们发现fpassthru可以利用,它可以输出文件指针处的所有剩余数据;所有此时我们可以利用这个特性来读取注释
payload
1 | ?a=SplFileObject&b=index.php&c=r&d=fpassthru |
PWN
rebot@wulala
拿到附件,先查保护,保护全开。
一般保护全开的题只有两种,一种是堆题,一种就是nc gift。
ida打开附件,用c++写的源码,大概意思就是输入一个字符串,rebot会把你输入的字符串输出并且加一个’!’。
在botspace::Rebot::send里有一个botspace::system这个函数里有system函数,所以正常的话只需要输入\bin\sh就能拿到shell。
但是botspace::system,里面包含了对输入字符串的限制条件。
第一个限制条件是输入字符串与地址&unk_3004比较,地址内容为sh,所以输入的字符串不能含有sh。
第二个限制是echo,这个指令会把字符串输出,所以要考虑绕过这个函数。
payload=$($0) #/bin/sh可以用$0来表示,这样可以绕过第一个限制,但是如果直接输入这个,echo函数会将$0打印在屏幕,所以再套一个$($0),从而得到一个system(“$0”)。
cat flag没有反应是因为字符串后面有一个’!’,手动exit。
1437@wulala
拿到附件,先查保护。只开了NX。
ida打开附件,定义了一个v6数组来储存题意描述的’植物’,第一个for循环把数组内的内容全部换成空格。(相当于pvz中的草地?)
漏洞点在第二个for循环,循环内对i和j的数值只限制了不能为负数(否则跳出循环),并没有限制i和j的大小,所以可以通过调整i和j的大小使数组v6溢出。
但是这题并不像以往栈溢出的题目,漏洞函数是gets之类(指输入的为%s字符串)的危险函数,只能输入%c单个字符,所以需要将payload一个字符一个字符逐个输入。
有/bin/sh,有system,无栈保护,因此直接通过栈溢出来跳转到这个地址。
payload仿写的这条payload=b'a'*16+p64(0)+p64(0x4040A0)
这题的payload因为是可以任意位置输入字符,所以可以直接在数组溢出位置8字节后直接输入跳转的地址位置。
p64(0x40128A)为\x8a\x12@\x00\x00\x00\x00\x00
写exp
1 | from pwn import * |
Crypto
classical@hey
1 | 4yc2guKbQyaTe7HaAZWzSD7V3grmuf1cvGrzfDhErgkeXENS9WG61sgwN26cRwvdEwH93aU5F1vQQ6j7JvjTMWka9orBaCeU2QwLmeMrJj2s6F9853AJ3mbc3cq4qpLDBh7hQP1Pa6m54xjrB7b3rZXzndmFZHybQWt9U84ueRz5GfxxyqTu7oSjujD9559Mzqa6WRg1mzsQpMCo4S468pn7NBtr5kmGSDykwgy6jhtRL2GH2JwzZgN5UDxvHkARsvTu9eNdfTnEkid4Tjf1XEeZ1xiVMNbQNfKnJfFgfb1HWKFswdCkLZvt |
直接一键解码得到另外一个音符密码
直接找网站解密即可
ezRSA@抓到一只梗
利用工具求出公钥,私钥。
解密脚本
1 | import gmpy2 |
REVERSE
两题都是异或,直接找目标数组写脚本。
ezRE@wulala
目标数组v9
由于是ida自动转化数组,把dd转成db的过程产生了一些无用字符手动抠掉就行。
找规律,每4字节,抠掉3字节(中文占2字节)
1 |
|
REez@wulala
相比第一题更简单了,少了字节转换的过程
目标数组在这个函数里面。
把0,全抠掉。
1 |
|
Misc
ezpatch@hey
查壳
无壳
IDA分析
此时可知当dword_40E880 == dword_40E888
便会输出flag.png
CE调试
此时贪吃蛇的长度为三,所以我们输入数值三进行扫描;让贪吃蛇吃掉一个果子之后就可以找出结果
接下来将结果放入地址栏并改变数值为640即可获得flag
ezfile@抓到一只梗
解压得到一个未知后缀名的文件,拖入winhex查看发现是,4B 44 4D 56 [KDMV],查看发现是vmdk后缀文件。拖入虚拟机,利用指令,binwalk -e file(1),得到一张图片名为c的jpg图片。查看文件属性,发现备注为颜文字加密,在线网站解密即可。