2017年湖湘杯网络安全技能大赛Writeup
2017年 “湖湘杯”网络安全技能大赛Writeup
Misc ak,web差web400,pwn一分没有,re 两道,反正尽力了
MISC
流量分析
wireshar导出http文件发现flag.zip
打开为rgb
使用脚本把rgb转换成图片
1 | from PIL import Image |
打开图片得到flag
热身运动
一张gif,一个粉红色的老虎在一个国际象棋的棋盘上瞎j8动
使用Stegoslove查看每一帧记录下老虎移动的坐标
1 | 5b 4g 2b 4b 5b 2h 3e 2b 5f 8f 1e 2b 7f 6f 1f 4g 5f 6g 1b 3g 5g 6h 2e |
百度64进制编码得到一张表,对应坐标记录数字
1 | 5b 4g 2b 4b 5b 2h 3e 2b 5f 8f 1e 2b 7f 6f 1f 4g 5f 6g 1b 3g 5g 6h 2e |
再用数字对应base64码表
1 | 25 38 49 33 25 55 44 49 29 5 60 49 13 21 61 38 29 22 57 46 30 23 52 |
解最后的base64得到flagflag{1t_15_funny}
题目Encryptor.apk
逆向apk
得到关键代码
加密过程为:
j是md5以后的字符串换成字节了以后的长度
paramArrayOfByte1[i]是图片的每一个字节
用图片的每一个字节和md5字符串的第[i%j]号字节异或
因为是异或加密,解密只需要再加密一次即可得到flag
限制了加密文件必须为图片,把加密后的文件重命名为jpg放进加密机加密,得到flag图片
这是题目修改前的flag图片
这他妈的字写的什么j8玩意?
题目修改后的图片
misc300
题目为pkl后缀名
pkl是python的序列化文件
使用脚本读取之后是一行英文
S'The black pixels of a b/w image are at
剩下的是很多坐标,使用画图模块绘制散点图
1 | import pickle |
把脑袋倒过来看,对
是个漫画人物
漫画名为凯文的幻虎世界,作者Bill Watterson
flag 就是作者的名字billwatterson
嗯,cnm啊这尼玛谁想得到?出题人脑子可能有坑
人家原题叫who made me ,这tm 叫misc300。。醉了
WEB
web200:
题目提示:只是一个普通的上传。
打开页面以后得到亮点提示:
a.只能上传png b.htmlentities(ucfirst($op)); op变量做过简单的处理。
打开upload页面发现http://118.190.87.135:10080/?op=upload ==> op=upload应该是文件包含。
扫描一下目录:upload.php
、home.php
、flag.php
、show.php
加上两个目录image
和uploads
上传一个png
页面返回URL: op=show&imagekey=cf32f1071d5f2a4b89c72df04a1b5de02dce2bf1
到这里就更加印证了是一个文件包含漏洞了
这个imagekey
应该就是上传后的文件名,上传的文件应该是在uploads
文件下:
果然,然后包含它
重新思考了一下,包含upload.php
的时候,是op=upload
那么其代码应该是op=$_GET[op].’.php’
;在文件中加上php的,这时候我想到phar://
协议。
将x.php
(一句话shell)压缩成zip格式,然后再改成png格式上传到服务器,用包含结合phar协议来执行php文件:
Payload:op=phar://./uploads/e3b413b087bd7f56d3a67d3f970a88c489b60e66.png/x
可以执行,然后读取flag.php中的内容
Payload
:x=highlight_file('././flag.php');
web150 random
这道题是相当的坑,11点出了以后到4点左右才正常。
像这样的题,进去没什么提示,首先想到的源代码泄露,然后审计代码绕过一些的。访问.index.php.swp存在,这个是vi编辑器留下的,但是在11点-4点之间这段时间,这个里面根本没有源码,和index一样是乱码。
源码看到以后,就发现是mt_rand()
伪加密,mt_srand()
以time()
为种子进行播种,mt_rand()
生成的内容是依赖于time()
的。
思路:用python直接访问页面拿到pwd的值,在time()
生成的时间戳变化之前提交上去,就可以绕过第一层if($pwd == $_GET[pwd])
,但是这乱码是什么东东?
把源码放在本地,然后去生成、输出pwd 和 session。
发现还是乱码,那可能pwd就是乱码,ok。写个脚本,让脚本先访问题目地址,处理题目地址返回页面,取出pwd的值,再访问本地页面对比pwd的值,如果相同,则把本地页面生成的pwd、session的值分别作为pwd参数和action参数的值提交上去。
Flag为:you get the flag it is hxb2017{6583be26c1403c25677c03ac7b3d1f22}
脚本:
1 | import requests,re |
本地页面源码
1 | <?php |
web300
访问看到源码,过滤了很多字符,但是()[]=’+.;
这些字符没过滤,题目又提示能getshell。这让我想起了以前在网上看到过的一个符号一句话木马。
1 | <?php |
但是提交被拦截
因为+
在url中表示空格,而题目拦截空格。所以要把+
进行一次URL编码,传入后会自动进行解码:
将符号一句话中的+全部用%2b
替换
getflag
RE
简单的Android
apk文件
解压后用dex2jar把classes.dex转换成jar包
用jd-gui打开,发现代码中直接就包含了flag明文。没安装测试,直接交就过了
RE100
发现是win,还有upx壳,用3.91版的upx -d解压成功
解压后直接运行会挂掉,ida打开,main函数就在启动函数上面几个(通过字符串提示发现main函数)
按f5可以得到如下c代码
虽然很多函数没有识别,但是不影响这些分析
发现一堆没用的代码,其实关键的就是圈中的代码而已。这里的输入才会影响后面的结果。至于判断条件,if嵌套if,似乎不可能达成这些条件,应该是程序挂掉的原因。所以,直接进入关键函数sub_401080
明显是按位异或,供44个字符,每个和x22
或后等于相应的值就可以,反向计算拿到flag。但是要注意顺序,读取的行数是换了的,而且注意低存低高存高
本来想用idc脚本把数据抠出来,然后异或就好了。但是出了点问题,会读取出特别大的数字,只能一个一个手动弄出来。按照行的顺序,每一行从右边到左边。然后写python脚本如下:
执行得到结果
ps:
web400差点做出来,比赛结束前7分钟改题也是牛逼,misc100直接换题,misc300偷来原题还不给题目名,misc200用一堆写的屎一样的英文来强行加难度,这出题人真的是服气
送出题人串字母啊 mmmmmmmmp!