第三届红帽杯网络安全攻防大赛

  1. Misc
    1. 签到
      1. 解题思路
    2. 玩具车
      1. 解题思路
    3. Advertising for Marriage
      1. 解题思路
  2. Crypto
  3. 本文参考文章

Misc

签到

解题思路

进去之后填个调查问卷,完成调查问卷后即可在新打开的页面中获得flag

玩具车

解题思路

打开题目并解压后发现以下文件,大致就是提供了小车的原理图,L298n 的简易电路图,还有一堆音频文件

玩具车文件

使用 Audacity 查看音频文件的波形,发现以下规律

  • 波形相同组一:L293_1_A1 ; L293_1_A2 ; L293_2_A1 ; L293_2_A2
  • 波形相同组二:L293_1_B1 ; L293_1_B2 ; L293_2_B1 ; L293_2_B2
  • 波形相同组三:L293_1_EnA ; L293_1_EnB ; L293_2_EnA ; L293_2_EnB

A音频波形分析

B音频波形分析

En音频波形分析

按照以前在电工课上的经验,En 是使能端,需要高电平才会给电机输出驱动。 A 和 B 可以控制电机转动方向,进而控制小车直线运动与转向,大致规律如下。

  • A(高电平) + B(高电平) = 前进
  • A(低电平) + B(低电平) = 后退
  • A(低电平) + B(高电平) = 原地右转
  • A(高电平) + B(低电平) = 原地左转

接下来就是 wave 和 PIL 相结合,把运动轨迹画出来

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
import wave
import numpy as np
from PIL import Image, ImageDraw

wav_A = wave.open("D:/CTF Practice/L293_1_A1.wav", 'r')
wav_B = wave.open("D:/CTF Practice/L293_1_B1.wav", 'r')
wav_En = wave.open("D:/CTF Practice/L293_1_EnA.wav", 'r')

def read_wav(wav):
num_frame = wav.getnframes()
num_channel = wav.getnchannels()
framerate = wav.getframerate()
str_data = wav.readframes(num_frame)
wave_data = np.fromstring(str_data, dtype = np.short)
wave_data.shape = -1, num_channel
return wave_data, framerate

def convert_level(level):
if level != 0: return 1
return 0

def draw(wav_A, wav_B, wav_En):
wave_data_A, framerate_A = read_wav(wav_A)
wave_data_B, framerate_B = read_wav(wav_B)
wave_data_En, framerate_En = read_wav(wav_En)

width = 4000
height = 500
im = Image.new('RGB',(width,height),'white')
draw = ImageDraw.Draw(im)
pos = [300, 300]
direction = 1
walk = 0

cnt = 0
rotate_cnt = 0
for i in range(len(wave_data_A)):
cnt += 1
if cnt % 200 != 0: continue
level_A = convert_level(wave_data_A[i][0])
level_B = convert_level(wave_data_B[i][0])
level_En = convert_level(wave_data_En[i][0])


if level_En == 1:
if level_A == 0 and level_B == 0:
rotate_cnt = 0
walk = 1
draw.point((pos[0],pos[1]),'black')
if direction == 0:
pos[0] -= 1
if direction == 2:
pos[0] += 1
if direction == 1:
pos[1] += 1
if direction == 3:
pos[1] -= 1
if level_A == 1 and level_B == 1:
rotate_cnt = 0
walk = 1
draw.point((pos[0],pos[1]),'black')
if direction == 0:
pos[0] += 1
if direction == 2:
pos[0] -= 1
if direction == 1:
pos[1] -= 1
if direction == 3:
pos[1] += 1
if level_A == 0 and level_B == 1:
walk = 0
rotate_cnt += 1
if rotate_cnt % 40 == 0:
direction += 1
direction = direction % 4
if level_A == 1 and level_B == 0:
walk = 0
rotate_cnt += 1
if rotate_cnt % 40 == 0:
direction -= 1
if direction < 0: direction = 3

im.show()

draw(wav_A, wav_B, wav_En)

利用脚本获得flag轨迹

题目总结

  • 使用 Audacity 查看音频文件的波形
  • wave,PIL和numpy包的利用

Flag:flag{63177867-8a43-47ab-9048-298867128b3a}

Advertising for Marriage

解题思路

内存取证题,首先查看镜像信息,命令如下

1
volatility imageinfo -f Advertising\ for\ Marriage.raw

查看镜像信息

发现需要使用预设WinXPSP2x86

然后查看进程信息,命令如下

1
volatility pslist -f Advertising\ for\ Marriage.raw ‐‐profile=WinXPSP2x86

查看进程

发现可疑进程记事本

查看记事本,命令如下

1
volatility notepad -f Advertising\ for\ Marriage.raw --profile=WinXPSP2x86

发现了题目的暗示(hint)
hint:????needmoneyandgirlfirend

扫描所有文件,命令如下

1
volatility filescan -f Advertising\ for\ Marriage.raw --profile=WinXPSP2x86

发现png图片

找到一张 png 图片:vegetable.png

导出图片,命令如下

1
volatility dumpfiles -f Advertising\ for\ Marriage.raw --profile=WinXPSP2x86 -Q 0x000000000249ae78 -D ./

修改文件格式

89 50 4E 47是png图片的格式,所以将得到的dat格式文件改为png格式,发现了如下信息

在win10下能正常打开图片

win10下打开png图片

在kali下打开png图片时报错:IHDR: CRC ERROR

kali下打开png图片

生成修复后的图片

估计图片尺寸被修改了,用脚本计算图片实际长度和宽度,并且生成修复后的图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import os
import binascii
import struct

img = open("D:/CTF Practice/vegetable.png", "rb").read()

for w in range(1024):
for h in range(1024):
data = img[0xc:0x10] + struct.pack('>i',w) + struct.pack('>i',h) + img[0x18:0x1d]
crc32 = binascii.crc32(data) & 0xffffffff
if crc32 == struct.unpack('>i',img[0x1d:0x21])[0] & 0xffffffff:
print w, h
print hex(w), hex(h)
open("D:/CTF Practice/vegetable_new.png", "wb").write(img[:0xc] + data + img[0x1d:])
exit()

用 Stegsolve 查看图片,找到模糊的 flag,一般情况较难恢复,同时,也发现 lsb 有点东西

模糊的flag

获得flag

开头的 0x00000070 像是后面数据的长度,上网查了一下找到相同的例子,是使用 livz/cloacked-pixel 加密的。
这个工具解密需要密钥,密钥为上面记事本找到的提示:????needmoneyandgirlfirend,需要魔改工具爆破前 4 字节。

爆破得到密钥 b1cxneedmoneyandgirlfirend。

解密图片隐写信息,得到字符串:VmlyZ2luaWEgY2lwaGVydGV4dDpnbnh0bXdnN3IxNDE3cHNlZGJzNjI1ODdoMA==。

进一步 base64 解码得到:Virginia ciphertext:gnxtmwg7r1417psedbs62587h0。

使用 在线维吉尼亚密码解密工具 进行解密,密钥还是前面那个 b1cxneedmoneyandgirlfirend 。

解密得到 flagisd7f1417bfafbf62587e0。

Flag: flag{d7f1417bfafbf62587e0}

总结

Crypto

翻车现场

Flag:flag{fa0f8335-ae80-448e-a329-6fb69048aae4}

本文参考文章

https://impakho.com/post/redhat-2019-online-writeup#toc-9


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,可以邮件至 xingshuaikun@163.com。

×

喜欢就点赞,疼爱就打赏