AAA CTF101 安全攻防实践短学期 Misc Lab 1

实验指导

仅供参考。

Task 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>>> i, u, g, r
('绫地宁宁', 'utf-8', 'gbk', 'replace')

>>> i.encode(u).decode(g, r)
'缁�鍦板畞瀹�'

>>> i.encode(g).decode(u, r)
'籵�����'

>>> i.encode(u).decode('latin-1')
'绫å\x9c°å®\x81å®\x81'

>>> i.encode(g).decode('latin-1')
'ç±µØÄþÄþ'

>>> i.encode(u).decode(g, r).encode(g, r).decode(u, r)
'�?地宁�?'

>>> i.encode(g).decode(u, r).encode(u).decode(g)
'绫碉拷锟斤拷锟斤拷'

GB 2312 的编码方式:

  • 单字节:0xxxxxxx(如同 ASCII)
  • 双字节:1xxxxxxx 1xxxxxxx
B0B1
0x000x7F
0xA10xA9
0xB00xF7
0xA10xFE

GBK 的编码方式:

  • 单字节:0xxxxxxx(如同 ASCII)
  • 双字节:1xxxxxxx xxxxxxxx
B0B1
0x000x7F
0xA10xA9
0xB00xF7
0xA10xFE
0x810xA00x400x7E
0x800xFE
0xA80xA9
0xAA0xFE
0x400x7E
0x800xA0

GB18030 的编码方式:

  • 单字节:0xxxxxxx(如同 ASCII)
  • 双字节:1xxxxxxx xxxxxxxx(如同 GBK)
  • 四字节:1xxxxxxx 0011xxxx 1xxxxxxx 0011xxxx
B0B1B2B3
0x000x7F
0x810xFE0x400x7F
0x800xFE
0x810xFE0x300x3F0x810xFE0x300x3F

如果编解码的过程中出现了无法解析的字符或字节序列(例如 GBK 编码 \uFFFD 字符时),编解码就会出错。那么此时就必须选择忽略这个字符(ignore)或将其替换为特定字符(replace),这两个步骤都势必会造成信息的丢失。这种情况下信息就不可恢复。
也就是说,实验指导中所给的六种乱码情况中,3 和 4 是一定可以恢复的,因为 Latin-1 是单字节编码,不存在解码失败的问题。而 1,2,5,6 都有可能出现无法恢复的编码错误。

例如在 Python 中对于字符串“绫地”的编解码过程:

步骤字符/字节序列说明
绫地
.encode('utf-8')\xe7\xbb\xab\xe5\x9c\xb0三字节编码
.decode('gbk', 'replace')缁�鍦�双字节编码,\xab\xb0 替换为 “�”
.encode('gbk', 'replace')\xe7\xbb?\xe5\x9c?“�” 替换为 “?”
.decode('utf-8', 'replace')�?�?\xe7\xbb\xe5\x9c 替换为 “�”
步骤字符/字节序列说明
绫地
.encode('gbk')\xe7\xb1\xb5\xd8双字节编码
.decode('utf-8', 'replace')籵�\xd8 替换为 “�”
.encode('utf-8')\xe7\xb1\xb5\xef\xbf\xbd三字节编码
.decode('gbk')绫碉拷

而对于字符串“宁宁”:

步骤字符/字节序列说明
宁宁
.encode('utf-8')\xe5\xae\x81\xe5\xae\x81三字节编码
.decode('gbk')瀹佸畞双字节编码
.encode('gbk')\xe5\xae\x81\xe5\xae\x81
.decode('utf-8')宁宁
步骤字符/字节序列说明
宁宁
.encode('gbk')\xc4\xfe\xc4\xfe双字节编码
.decode('utf-8', 'replace')����\xc4\xfe 替换为“�”
.encode('utf-8')\xef\xbf\xbd\xef\xbf\xbd
\xef\xbf\xbd\xef\xbf\xbd
.decode('gbk')锟斤拷锟斤拷

在这里我们也可以看到,“��”(\xef\xbf\xbd \xef\xbf\xbd)会被 GBK 解码为“锟斤拷”(\xef\xbf \xbd\xef \xbf\xbd)。

绫地宁宁天下第一!

Challange 1

可以发现 cipher.txt 中的重复字符串: {gY  K`cfeZK 
其中前者的出现位置为 [2, 60, 611, 1104, 1278, 1655, 2090]

1
2
3
4
5
6
sage: factor(754)
2 * 13 * 29
sage: factor(611 - 60)
19 * 29
sage: factor(1278 - 1104)
2 * 3 * 29

可以确定密钥长度为 29。经过一些正则匹配:[A-Za-z0-9 ,.!?\'"-]+ 基本可以确定大多数正确的 key,再经过手动修改几个 key,最终成功解密。

Challenge 2

TonyCrane’s easy OSINT

1
2
3
4
5
6
7
8
9
10
11
12
$ exiftool TonyCrane.jpg | grep GPS
GPS Latitude Ref : North
GPS Longitude Ref : East
GPS Altitude Ref : Above Sea Level
GPS Time Stamp : 12:28:33
GPS Processing Method : GPS
GPS Date Stamp : 2023:02:09
GPS Altitude : 63.4 m Above Sea Level
GPS Date/Time : 2023:02:09 12:28:33Z
GPS Latitude : 35 deg 42' 11.67" N
GPS Longitude : 139 deg 45' 8.62" E
GPS Position : 35 deg 42' 11.67" N, 139 deg 45' 8.62" E

所以,拍摄图片时 TonyCrane 位于海拔 63.4 m,时间为 2023 年 2 月 9 日 21:28:31.122 UTC+9。

yyy’s real OSINT

1
2
$ exiftool yyy.jpeg | grep Modify
Modify Date : 2022:02:16 16:32:29

根据图片中的一些高大建筑物,识图得知地点在厦门的南湖公园。


AAA CTF101 安全攻防实践短学期 Misc Lab 1
https://heap.45gfg9.net/t/ZJU/2023-CTF101/cd45fec93111/
作者
45gfg9
发布于
2023-07-09
许可协议