Web
1.Websign
F12被js前台拦截,从浏览器设置里面打开开发者模式查看源码
也可以抓包查看
2.ez_rce
linux特性(好像是php特性?),执行两个反引号括起来的内容,两个单引号连接左右的部分以绕过过滤的关键词,%09代替空格
Eval()相当于直接执行一段php闭标签里的代码,这里闭合前面的,再在后面括起来需要反引号执行的部分
因为没有过滤/,所以直接看
Cat读取相关目录下的文件即可
3.ez_unser
考查反序列化,并且传入的代码必须包含test”:3
这里需要绕过__wakeuo()魔法函数,只需反序列化的对象个数大于实际的个数即可,但受到后面匹配条件的限制
这里可以又看到在析构函数提及了b,c值的传递,考虑使用引用传参的方式,就不需要再考虑__wakeup()函数的影响了
传参
同样反序列化后cat命令查查看flag所在目录即可
4.funmd5
打开题目,审计
使用了时间戳函数,返回linux元年以来的秒数,也就是说该值一秒一变,guessmd5的值则也会根据$time的变化而发生变化
这一段代码,如果get传入了名为md5的变量则执行if语句,$sub的值为时间戳的最后一位。
如果在$md5中匹配到0e则进行替换
第二条if语句则与上一条语句相斥:只有在md5数组中匹配到0e才能继续执行
因此这里肯定存在绕过
继续看
Flag的输出条件是当md5数组中的第一个元素的值等于它本身,并且数组中的第二个元素的值等于guesssmd5的值
现在思路比较清楚了:
1.绕过对于0e的置换
2.使md5数组中的第一个元素的值等于它本身
3.使数组中的第二个元素的值等于guesssmd5的值
这里1较为简单:
1的话,可以使用换行符%0a,使得0e绕过检测,preg_match没有设置多行匹配,因此只匹配了第一行
2的话,其实是一个常识,需要积累,因此ctf的学习还是要对学多写多积累
但还应该注意一点,由于sub变量的存在,外加substr函数的作用,这里md5数组的第一个值的长度会发生变化,考虑到前面绕过使用的换行符,我们选取sub变量值为1的时候进行截取,配合substr函数可以将换行符截掉
现在来到第3层,这里选择将代码扒下来本地测试(本地测试还是蛮好用的哈)
需要让md5数组的第二个元素的值与guessmd5一致并且这里是强等于,我们可以先取一个大于当前时间戳的值赋给md5数组的第二个对象,运行等到二者相等即可
至此,问题全部解决,写脚本
成功
MISC
1.王八快跑
下载下来附件,跑到头即可
2.搬好小板凳听故事
一长串base64,解码,最后有一段flag,但提交后并不正确
还需要16进制再转一次字符串
3.略略略来抓我呀(OSINT)
社工题,给了四张图片,没想到最后一张图片也能看到经纬度
那直接网站上查一下
高德地图看一下大致位置
结合图片上的信息
和达高科和某某口腔医院,这里在用百度地图的街景模式看一下
左上角这个楼,和照片里的一样
可以基本确定了
加上nssctf{}即可
4.where is flag
打开附件,一个流量包,放到wireshark里面导出http包,发现可疑压缩包
导出该压缩包,提取其中的文件,winhex打开查看16进制,发现为png文件但缺少前四个字节的文件头,因此手动补齐文件头并保存,发现是张二维码
使用工具扫描
应该存在某种加密,用bctester打开再扫描
将上面的16进制导出来保存为.txt
看来是零宽加密,但记事本里复制不全,用vscode打开复制,到解密网站(Unicode Steganography with Zero-Width Characters (330k.github.io))(需要梯子)解密即可
Crypto
1.爱丽丝梦境的兔子
题目描述很清晰,直接跟着做就可以了
Rabbit解密
社会主义核心价值观解密
每组字数为6的栅栏密码解密
2.disparity_rsa
这道题,n是可以利用在线网站分解出p和q的
p=57191
q=100824891894856702601201118009583648965164977561371042858637845367138181483380929730739526924561431398670347148954669147299066829552802628259180187574259704417901631558444093499584247442642574479809722666468258052387219612630695122930581802321960294913554359621973108878080665153439264529066699136581547328967
且此时c已知
根据rsa:
可求出e的模拟元d进而求出m
不过要注意密文后面多加了个s,s2n后应该是纯数字,所以应当把s删去
最后结果
3.Easy_base64
看代码,如果flag变量的前4位为”flag”则进行下面的操作,将byte类型的flag进行base64编码,并将一次编码后的密文数据类型转换为string型,接着对一次编码后的密文进行异或操作,规则是每一位与后一位异或
此时可以确定的是base64编码完的数据的前几位肯定是”flag”,因此可以通过字符串flag的base64编码(ZmxhZ3)去再次异或flag[i]^flag[i+1]
因为 flag[i]flag[i+1]=a[]—>flag[i]flag[i]flag[i+1]=a[]flag[i]—->flag[i+1]=a[]^flag[i+1]
所以通过此运算可得出flag[i]的后一位flag[i+1],做嵌套循环即可得出答案
这里给出脚本:
a=[55,21,16,50,105,71,14,27,41,30,34,16,50,111,74,62,5,18,54,52,106,85,31,54,24,111,83,11,38,1,53,17,37,17,35,47,32,52,40,2,9,59,47,54,25,111,77,16,48,26,33,9,55,108,0]
b='ZmxhZ3' #flag[i][0:6]
c=''
for j in range(len(a)):
for i in range(len(b)):
#print(a[i]^ord(b[i]),end=" ")
c=chr((a[i]^ord(b[i])))
b=b+str(c)[-1]
print(b)
运算结果
再次base64解码
原文地址:http://www.cnblogs.com/perfectcqf/p/16844974.html