И снова pythonchallenge, на этот раз с весьма сложным на первый взгляд заданием. На странице видим только картинку с игрой в карты, игроков вероятно четверо, т.к. на столе раздача карт идёт на четырёх игроков.
В начале я подумал, что разгадка зашифрована в стартовой картинке, но потом обратил внимание на название файла в исходном коде: «evil1.jpg».
Очень похоже на то, как в Windows автоматически генерируются имена для новых файлов и папок: НоваяПапка1, НоваяПапка2 и т.д. Попробуем запросить с сервера файл с именем evil2.jpg.
Теперь понятно, что на верном пути. Теперь запросим файл evil2.gfx и оказывается такой файл существует. Посмотрим, что внутри файла.
Если присмотреться, то можно увидеть сигнатуру файла формата 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