Mirages-CTF writeup

​ 这次的比赛分为3周,学长说第一周的挺基础,适合我们练手,正好最近离散停课,计算方法也没开,时间还算充足,就进坑了。虽说是个人赛,但实际上是和小队成员开黑做的23333。做出来的题基本是上是web和misc,re。。。。不会,先好好学学汇编以及计算机系统再说。在这稍微总结一下web和misc

web

Web第一步

打开链接就看到了这么一句话:一看你就不是组织的人,不用组织的ip,还想进组织的网站。23333,意思很明显了,伪造ip。刚开始纳闷了会儿,他们组织的ip到底是啥呀我也不知道哇,然后看到了这个链接的title上写着:110.110.110.110。好吧,修改一下X-Forwarded-For,刷新。然后是另一句话:I like Iphone X. Why don’t you use it? 伪造ua。。。注意这里有个坑,很多人还去搜了Iphone X的ua,其实不用,直接写Iphone X就OK了,题目给了Hint:简体中文。说的就是这个。再刷新:Actually, I’m Chinese,I don’t want to hear any other language。还要改语言。。。一开始我直接改成了Chinese,发现没反应,于是换成了zh-CN,可以了。再刷新:Not a local login. Do you want flag? 改host….其实就是改请求头而已,干嘛还要改4次,有毒。

flag:mctf{_Wh01e_FamilY}

PHP加密

题目:加油吧,骚年,莫名其妙的字符串,必有其来源 。打开链接一看,发现是一串base64.

fTdydHtWOV9gaG5VXDJqPHcxPFxhbHRVfDdpPUV5TlxdQ2hpVWA=

1
}\7arltt{UV|97_i`=hEnyUN\\2]jC<hwi1U<`

直接解密显然不对,应该还有一段加密函数。@kurumi扫了下后说有源码,顺便丢给了我们。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$flag = 'flag{********************************}';
$flag= strrev($flag);
$key = '*';
for($i=0;$i<strlen($flag);$i++)
{
$str[$i] = ord($flag[$i])+ord($key)*$i;
while($str[$i]>125)
{
$str[$i] = $str[$i]-78;
}
}
$out = "";
for($i=0;$i<strlen($flag);$i=$i+2)
{
$out = $out.chr($str[$i]);
}
for($i=1;$i<strlen($flag);$i=$i+2)
{
$out = $out.chr($str[$i]);
}
echo base64_encode($out);
?>

加密流程大概就是,先逆转,然后遍历,令str这个数组的每一位等于对应位置上字符的ascii码值加上下标乘以42,如果这个数值大于125,就减78,直到小于等于125为止,然后再把str这个数组的偶数下标位抽出来,插到后面。大概就是把abcdef变成acebdf这样。

脚本写来写去还是有问题,最后没能跑出来QAQ,借鉴了队友@kurumi的脚本:

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
26
27
28
29
30
31
32
import base64
import sys
def decrypto(out, key):
t = base64.b64decode(out)
#print [ord(x) for x in t]
a = t[:(len(t)+1)/2]
b = t[(len(t)+1)/2:]
t = ''
for i in range(min(len(a), len(b))):
t += a[0]
t += b[0]
a = a[1:]
b = b[1:]
if a:
t += a[0]
if b:
t += b[0]
t = [ord(x) for x in t]
for i in range(len(t)):
while t[i] < i * 42:
t[i] += 78
t[i] -= i * 42
if not 32 <= t[i] <= 126:
t[i] += 78
print ''.join([chr(x) for x in t])[::-1]
def main():
decrypto('fTdydHtWOV9gaG5VXDJqPHcxPFxhbHRVfDdpPUV5TlxdQ2hpVWA=', 42)
main()

虽然可能会有点不精确,但最后修正一下就行了。。。(一开始有点死脑筋,但这题应该是可以直接恢复的,逻辑和算法太菜了哎)

flag{e20ad328b0aa23210c57c48ac8b6f112}

忘记密码

忘了童年的QQ账号以及密码!!这题的title也有提示,md5,而且源码里边也有提示:密码全是字母。一开始以为是md5碰撞,爆破什么的也试过。最后学长发现,这TM就是一个php弱类型比较。找纯数字和纯大写字母的md5值为0e开头的即可。

flag:MCTF{Md5_1s_So_SaD}

喵喵喵

喜欢撸猫就一起来吧。title为:听说猫喜欢机器人。显然是robots协议,看一下,果然有源码:

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
26
27
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=gbk">
<title>听说猫喜欢机器人</title>
</head>
<body>
<img src="./aabbcc.jpg">
</body>
</html>
<?php
$flag='********';
if (isset ($_GET['cat'])) {
if (ereg ("^[0-9b-f]+$", $_GET['cat']) === FALSE)
echo '喵喵好像特别喜欢小写字母和数字';
else if ($_GET['cat']==0)
{
if(strpos ($_GET['cat'], 'miaomiao') !==FALSE)
{
die('Flag: '.$flag);
}
else
{ echo '<p>好像必须要喵喵呢</p>';}
}
else
{echo '<p>喵喵迷路了</p>';}
}
?>

传入一个cat,先检测是否在0-9和b-f范围内,再判断是否为零,发现这里是弱类比较,只有两个等号,显然可以用0e绕,然后还要有miaomiao,也就是要有a,那就00截断吧。大概就是这样了构造url:http://116.196.124.92:32769?cat=0e2333%00miaomiao

flag:mctf{you_get_ereg}

phpbest!!!

1
php是世界上最好的语言!谁说不是我跟谁急!

还加了个网易云链接:当初就不该学php。有闲情的话去听听吧23333。这次的title为:Secure Hash Algorithm又是Hash??而且有这么一句:这货不是SQL,我绝对不骗人。要求输入name 和 pass来登录,试了下注入,好吧,真的不是。根据前面几题的经验,title提示都是有用的,于是开始考虑php的弱类型,用0e也不对。然后直接post数据,用数组试试,。。。!!!!过了????

name[]=2&pass[]=3

flag:mctf{This_is_the_fulage}

投身黑产的b佬1

题目类似于一个老虎机,抽到05555就有flag,hint: bp真好用,直接用bp碰撞拿到flag。

flag:{Good_luck_Boy!}

(万一是个妹子呢2333333

Misc

这有flag

下载下来是一张图片,Hint: 萌新温馨提示:使用二进制工具(010 editor, winhex)来查看文件/你听过base64吗。。。这提示约等于wp了吧。。。。16进制打开末尾有base64串,解密即可

flag:MCTF{th1s_ls_fL4g}

这有flag?

还是图片,用stegesolve看一下,emmmm,没什么用,LSB也没有什么,binwalk分析一下

1
2
3
4
5
6
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 JPEG image data, EXIF standard
12 0xC TIFF image data, big-endian, offset of first image directory: 8
13446 0x3486 Zip archive data, at least v2.0 to extract, compressed size: 17, uncompressed size: 15, name: flag.txt
13591 0x3517 End of Zip archive

有压缩包,foremost 2.jpg ,直接解压那个zip包,发现里面有flag.txt,打开得到flag

flag:MCTF{Real_F1Ag}

这有flag??

这个题又不小心存进了明文,按理来说应该要去改高度啥的才能看到flag,由于我有先strings的习惯,于是就。。。。

1
2
3
4
5
6
7
8
strings 3.png | grep {
v/{LSCs
{`:>=e
<photoshop:LayerName>MCTF{Hhhh_g0t_1t}</photoshop:LayerName>
<photoshop:LayerText>MCTF{Hhhh_g0t_1t}</photoshop:LayerText>
{&hPD
{[k
<{A$FU

就直接拿到了flag。。。。

flag:MCTF{Hhhh_g0t_1t}

签到题

加群,群相册有二维码,关注公众号发送flag即可。

falg:MCTF{We1c0me_2_MCTF}

这有flag???

这个150分的题,本来脑洞还有点大的,但后来放了这么一个Hint: 萌新温馨提示:LSB/plaintext莫非是出题人怕被打?嗯哼?下载下来是一张图片和一个hint文件,而且hint没有后缀。LSB嘛,把图片提取一下,发现有个zip压缩包,改后缀,解压走起,有密码????试试是不是伪加密,然而并不是。哎,它都已经给了提示了。。。明文攻击(然而我们做的时候并没有,还是qrzbing 提示我做出来的)看一下加密包,里面有flag.txt和一张图片,然后转而分析hint文件,binwalk一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
binwalk hint
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 Zip archive data, at least v2.0 to extract, compressed size: 346, uncompressed size: 1312, name: [Content_Types].xml
915 0x393 Zip archive data, at least v2.0 to extract, compressed size: 239, uncompressed size: 590, name: _rels/.rels
1715 0x6B3 Zip archive data, at least v2.0 to extract, compressed size: 244, uncompressed size: 817, name: word/_rels/document.xml.rels
2281 0x8E9 Zip archive data, at least v2.0 to extract, compressed size: 854, uncompressed size: 2973, name: word/document.xml
3182 0xC6E Zip archive data, at least v2.0 to extract, compressed size: 1761, uncompressed size: 8398, name: word/theme/theme1.xml
4994 0x1382 Zip archive data, at least v2.0 to extract, compressed size: 1337, uncompressed size: 3725, name: word/settings.xml
6378 0x18EA Zip archive data, at least v2.0 to extract, compressed size: 501, uncompressed size: 1444, name: word/fontTable.xml
6927 0x1B0F Zip archive data, at least v2.0 to extract, compressed size: 295, uncompressed size: 655, name: word/webSettings.xml
7272 0x1C68 Zip archive data, at least v2.0 to extract, compressed size: 364, uncompressed size: 711, name: docProps/app.xml
7946 0x1F0A Zip archive data, at least v2.0 to extract, compressed size: 385, uncompressed size: 757, name: docProps/core.xml
8642 0x21C2 Zip archive data, at least v2.0 to extract, compressed size: 2904, uncompressed size: 29103, name: word/styles.xml
11591 0x2D47 Zip archive data, at least v2.0 to extract, compressed size: 11906, uncompressed size: 12427, name: docProps/key.xml
24346 0x5F1A End of Zip archive

又是一个zip包,改后缀打开,注意到docProps目录下有个key.xml,而且还是2017.10.22修改过的,很明显了,然后分析一下这个key.xml,发现它是一张图片,那么很显然,明文攻击的已知文件就在这了。压缩,直接爆,1分钟不到就爆开了,打开flag.txt,发现里面是这样的:

1
VSBmaW5kIG1lLHRoZW4gSSdsbCBnaXZlIHUgbXkgZmxhZzpNQ1RGe0xTQl8mJl9wbEBpblRleHR9LkRvIHUgdGhpbmsgaXMgaXQgc28gZnVja2luZyBlZ2c/bGFpIGRhIHdvIHlhIGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaA==

显然是个base64,但后面那一串重复的什么鬼啊,解密一下看看

1
U find me,then I'll give u my flag:MCTF{LSB_&&[email protected]}.Do u think is it so fucking egg?lai da wo ya hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

看到了吗?lai da wo ya。。。丫的以为我不敢吗?

flag:MCTF{LSB_&&[email protected]}

这有flag-ex

本来Hint给的是Water,可能出题人觉得太隐晦了,后来就直接改成了水印。。我也不是很懂盲水印这玩意儿,google了一波,在github上找到了这段脚本,装上python的一些第三方库后跑一个命令就OK了。参考链接

(PS:感觉这200分的题比150分的好做,如果都不给Hint的话。

flag:MCTF{W4T3RMark_1s_c00l}

最后来一波霸气的图片5连

话说还是好好学数据机构离散和数电,其余时间写写python,看看二进制,刷刷英语好了,太菜了,肝不动、肝不动。