Задания в pythonchallenge.com: задание 12 (dealing evil)

dealing evil
И снова pythonchallenge, на этот раз с весьма сложным на первый взгляд заданием. На странице видим только картинку с игрой в карты, игроков вероятно четверо, т.к. на столе раздача карт идёт на четырёх игроков.

В начале я подумал, что разгадка зашифрована в стартовой картинке, но потом обратил внимание на название файла в исходном коде: «evil1.jpg».

Очень похоже на то, как в Windows автоматически генерируются имена для новых файлов и папок: НоваяПапка1, НоваяПапка2 и т.д. Попробуем запросить с сервера файл с именем evil2.jpg.

Теперь понятно, что на верном пути. Теперь запросим файл evil2.gfx и оказывается такой файл существует. Посмотрим, что внутри файла.
evil2 source
Если присмотреться, то можно увидеть сигнатуру файла формата jpg, только она разрежена, замусорена лишними данными. «FF D8 FF E0 » — вот сигнатура jpg. Попытаемся выделить изображение, а остаток запишем в отдельный файл:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from requests import get
 
url = 'http://www.pythonchallenge.com/pc/return/evil2.gfx'
response = get(url, auth=('huge', 'file'), stream=True)
 
 
b = response.content
part_1 = []
part_2 = []
 
for i in range(0, len(b)):
    if i % 5 == 0:
        part_1.append(b[i])
    else:
        part_2.append(b[i])
 
with open('part_1.jpg', 'wb') as f:
    f.write(bytes(part_1))
with open('evil2.gfx', 'wb') as f:
    f.write(bytes(part_2))
from requests import get

url = 'http://www.pythonchallenge.com/pc/return/evil2.gfx'
response = get(url, auth=('huge', 'file'), stream=True)


b = response.content
part_1 = []
part_2 = []

for i in range(0, len(b)):
	if i % 5 == 0:
		part_1.append(b[i])
	else:
		part_2.append(b[i])

with open('part_1.jpg', 'wb') as f:
	f.write(bytes(part_1))
with open('evil2.gfx', 'wb') as f:
	f.write(bytes(part_2))

Берём и каждый пятый байт отсеиваем. Результат — это часть какого-то слова. Оставшуюся часть запишем в файл part_2.gfx, именно её и будем анализировать в дальнейшем.

Смотрим, что осталось в part_2.gfx и сразу бросается в глаза размытая сигнатура файла формата PNG: 89 50 4E 47 0D 0A 1A 0A. Опять отделяем зёрна от плевел картинку от мусора.

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
from requests import get
 
url = 'http://www.pythonchallenge.com/pc/return/evil2.gfx'
response = get(url, auth=('huge', 'file'), stream=True)
 
 
b = response.content
part_1 = []
part_2 = []
 
for i in range(0, len(b)):
    if i % 5 == 0:
        part_1.append(b[i])
    else:
        part_2.append(b[i])
 
with open('part_1.jpg', 'wb') as f:
    f.write(bytes(part_1))
with open('evil2.gfx', 'wb') as f:
    f.write(bytes(part_2))
 
gfx = []
part_1 = []
part_2 = []
with open('evil2.gfx', 'rb') as f:
    gfx = f.read()
 
for i in range(0, len(gfx)):
    if i % 4 == 0:
        part_1.append(gfx[i])
    else:
        part_2.append(gfx[i])
 
with open('part_2.jpg', 'wb') as f:
    f.write(bytes(part_1))
with open('evil2.gfx', 'wb') as f:
    f.write(bytes(part_2))
from requests import get

url = 'http://www.pythonchallenge.com/pc/return/evil2.gfx'
response = get(url, auth=('huge', 'file'), stream=True)


b = response.content
part_1 = []
part_2 = []

for i in range(0, len(b)):
	if i % 5 == 0:
		part_1.append(b[i])
	else:
		part_2.append(b[i])

with open('part_1.jpg', 'wb') as f:
	f.write(bytes(part_1))
with open('evil2.gfx', 'wb') as f:
	f.write(bytes(part_2))

gfx = []
part_1 = []
part_2 = []
with open('evil2.gfx', 'rb') as f:
	gfx = f.read()

for i in range(0, len(gfx)):
	if i % 4 == 0:
		part_1.append(gfx[i])
	else:
		part_2.append(gfx[i])

with open('part_2.jpg', 'wb') as f:
	f.write(bytes(part_1))
with open('evil2.gfx', 'wb') as f:
	f.write(bytes(part_2))


Если сложить две части, то получается: «dispro». Продолжим.

Здесь явно два изображения, одно PNG, другое — JPG.

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
from requests import get
 
url = 'http://www.pythonchallenge.com/pc/return/evil2.gfx'
response = get(url, auth=('huge', 'file'), stream=True)
 
 
b = response.content
part_1 = []
part_2 = []
 
for i in range(0, len(b)):
    if i % 5 == 0:
        part_1.append(b[i])
    else:
        part_2.append(b[i])
 
with open('part_1.jpg', 'wb') as f:
    f.write(bytes(part_1))
with open('evil2.gfx', 'wb') as f:
    f.write(bytes(part_2))
 
gfx = []
part_1 = []
part_2 = []
with open('evil2.gfx', 'rb') as f:
    gfx = f.read()
 
for i in range(0, len(gfx)):
    if i % 4 == 0:
        part_1.append(gfx[i])
    else:
        part_2.append(gfx[i])
 
with open('part_2.png', 'wb') as f:
    f.write(bytes(part_1))
with open('evil2.gfx', 'wb') as f:
    f.write(bytes(part_2))
 
gfx = []
part_1 = []
part_2 = []
with open('evil2.gfx', 'rb') as f:
    gfx = f.read()
 
for i in range(0, len(gfx)):
    if (len(part_1) + 1) * 3 - 1 == i:
        part_1.append(gfx[i])
    else:
        part_2.append(gfx[i])
 
with open('part_3.jpg', 'wb') as f:
    f.write(bytes(part_1))
with open('evil2.gfx', 'wb') as f:
    f.write(bytes(part_2))
from requests import get

url = 'http://www.pythonchallenge.com/pc/return/evil2.gfx'
response = get(url, auth=('huge', 'file'), stream=True)


b = response.content
part_1 = []
part_2 = []

for i in range(0, len(b)):
	if i % 5 == 0:
		part_1.append(b[i])
	else:
		part_2.append(b[i])

with open('part_1.jpg', 'wb') as f:
	f.write(bytes(part_1))
with open('evil2.gfx', 'wb') as f:
	f.write(bytes(part_2))

gfx = []
part_1 = []
part_2 = []
with open('evil2.gfx', 'rb') as f:
	gfx = f.read()

for i in range(0, len(gfx)):
	if i % 4 == 0:
		part_1.append(gfx[i])
	else:
		part_2.append(gfx[i])

with open('part_2.png', 'wb') as f:
	f.write(bytes(part_1))
with open('evil2.gfx', 'wb') as f:
	f.write(bytes(part_2))

gfx = []
part_1 = []
part_2 = []
with open('evil2.gfx', 'rb') as f:
	gfx = f.read()

for i in range(0, len(gfx)):
	if (len(part_1) + 1) * 3 - 1 == i:
		part_1.append(gfx[i])
	else:
		part_2.append(gfx[i])

with open('part_3.jpg', 'wb') as f:
	f.write(bytes(part_1))
with open('evil2.gfx', 'wb') as f:
	f.write(bytes(part_2))

Основная сложность здесь — это выделить формулу для извлечения байтов изображения: «(len(part_1) + 1) * 3 — 1»

Что ж, осмысленного слова пока нет. Получается вот что: disproity. Посмотрим, что осталось в файле evil2.gfx.

Явно прослеживается сигнатура GIF-файла. Попытаемся выделить изображение:

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
from requests import get
 
url = 'http://www.pythonchallenge.com/pc/return/evil2.gfx'
response = get(url, auth=('huge', 'file'), stream=True)
 
 
b = response.content
part_1 = []
part_2 = []
 
for i in range(0, len(b)):
    if i % 5 == 0:
        part_1.append(b[i])
    else:
        part_2.append(b[i])
 
with open('part_1.jpg', 'wb') as f:
    f.write(bytes(part_1))
with open('evil2.gfx', 'wb') as f:
    f.write(bytes(part_2))
 
gfx = []
part_1 = []
part_2 = []
with open('evil2.gfx', 'rb') as f:
    gfx = f.read()
 
for i in range(0, len(gfx)):
    if i % 4 == 0:
        part_1.append(gfx[i])
    else:
        part_2.append(gfx[i])
 
with open('part_2.png', 'wb') as f:
    f.write(bytes(part_1))
with open('evil2.gfx', 'wb') as f:
    f.write(bytes(part_2))
 
gfx = []
part_1 = []
part_2 = []
with open('evil2.gfx', 'rb') as f:
    gfx = f.read()
 
for i in range(0, len(gfx)):
    if (len(part_1) + 1) * 3 - 1 == i:
        part_1.append(gfx[i])
    else:
        part_2.append(gfx[i])
 
with open('part_3.jpg', 'wb') as f:
    f.write(bytes(part_1))
with open('evil2.gfx', 'wb') as f:
    f.write(bytes(part_2))
 
 
gfx = []
part_1 = []
part_2 = []
with open('evil2.gfx', 'rb') as f:
    gfx = f.read()
 
for i in range(0, len(gfx)):
    if i % 2 != 0:
        part_1.append(gfx[i])
    else:
        part_2.append(gfx[i])
 
 
with open('part_4.gif', 'wb') as f:
    f.write(bytes(part_1))
with open('part_5.gif', 'wb') as f:
    f.write(bytes(part_2))
from requests import get

url = 'http://www.pythonchallenge.com/pc/return/evil2.gfx'
response = get(url, auth=('huge', 'file'), stream=True)


b = response.content
part_1 = []
part_2 = []

for i in range(0, len(b)):
	if i % 5 == 0:
		part_1.append(b[i])
	else:
		part_2.append(b[i])

with open('part_1.jpg', 'wb') as f:
	f.write(bytes(part_1))
with open('evil2.gfx', 'wb') as f:
	f.write(bytes(part_2))

gfx = []
part_1 = []
part_2 = []
with open('evil2.gfx', 'rb') as f:
	gfx = f.read()

for i in range(0, len(gfx)):
	if i % 4 == 0:
		part_1.append(gfx[i])
	else:
		part_2.append(gfx[i])

with open('part_2.png', 'wb') as f:
	f.write(bytes(part_1))
with open('evil2.gfx', 'wb') as f:
	f.write(bytes(part_2))

gfx = []
part_1 = []
part_2 = []
with open('evil2.gfx', 'rb') as f:
	gfx = f.read()

for i in range(0, len(gfx)):
	if (len(part_1) + 1) * 3 - 1 == i:
		part_1.append(gfx[i])
	else:
		part_2.append(gfx[i])

with open('part_3.jpg', 'wb') as f:
	f.write(bytes(part_1))
with open('evil2.gfx', 'wb') as f:
	f.write(bytes(part_2))


gfx = []
part_1 = []
part_2 = []
with open('evil2.gfx', 'rb') as f:
	gfx = f.read()

for i in range(0, len(gfx)):
	if i % 2 != 0:
		part_1.append(gfx[i])
	else:
		part_2.append(gfx[i])


with open('part_4.gif', 'wb') as f:
	f.write(bytes(part_1))
with open('part_5.gif', 'wb') as f:
	f.write(bytes(part_2))

Как оказалось это была последняя итерация выделения изображений. Мы получили ответ!


Спойлер

disproportional

Bookmark the permalink.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *