Открыть список
Как стать автором
Обновить

Кодировки, шифр сдвига, брут хешей и создание картинки с помощью PIL python. Решение задач с r0от-мi Cryto. Часть 1

Информационная безопасностьPythonCTF
Tutorial
image

Данная статья содержит решений заданий Encoding ASCII и Encoding UU направленные на кодировки, Hash Message Digest 5 и Hash SHA-2 — на нахождение прообраза хеша, Shift cipher — шифр сдвига, и Pixel Madness — на составление картинки.

Организационная информация
Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:

  • PWN;
  • криптография (Crypto);
  • cетевые технологии (Network);
  • реверс (Reverse Engineering);
  • стеганография (Stegano);
  • поиск и эксплуатация WEB-уязвимостей.

Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.

Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.

Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.

Encoding — ASCII


Начнем с самого первого задания — Encoding-ASCII.

image

Переходим к самому заданию. Видим последовательность 16-ых символов. Самое первое предположение — это обычный hex (все символы представлены в 16-м виде).

image

s = "4C6520666C6167206465206365206368616C6C656E6765206573743A203261633337363438316165353436636436383964356239313237356433323465"
s.decode("hex")

image

Получаем ответ и идем далее.

Encoding — UU


image

Переходим к самому заданию. Даже не смотря на подсказку в названии задания, отличить файлы в UUE (кодировка для передачи файлов, содержащих не текстовые данные) формате легко — они начинаются со строки:

Begin_права-на-файл_название-файла

image

s = '''begin 644 root-me_challenge_uudeview
B5F5R>2!S:6UP;&4@.RD*4$%34R`](%5,5%)!4TE-4$Q%"@``
`
end'''
 
f = open('./uu.enc', 'w')
f.write(s)
f.close()

import uu
uu.decode('uu.enc', 'uu.dec')
ans = open('uu.dec', 'r').read()

image

Сдаем флаг.

Hash — Message Digest 5


image

Нас просят найти прообраз для хеша md5. Это можно легко сделать с помощью этого сайта (https://md5decrypt.net/). Но мы, в целях обучения конечно, используем hashcat. Для этого используем следующие параметры и коды:

  • -a 0 — перебор по словарю;
  • -m 0 — тип хеша MD5;
  • File.hash — файл с хешем;
  • rockyou.txt — наш словарь;
  • --force — игнорировать ошибки.

image

Переходим к следующему заданию.

Hash — SHA-2


image

В качестве ответа нужно дать SHA1 хеш от прообраза этого хэша. Дело в том, что в данной лишний символ.

image

Удалим его. Для того, чтоюы определить алгоритм хеширования используем программу hashid.

image

Из представленных алгоритмов наиболее вероятен SHA-256. Как решать такое задание с помощью hashcat показал, теперь сделаем его с помощью этого
сайта.

image

Осталось взять SHA-1 от этой строки.

from hashlib import *
sha1(‘4dM1n’).hexdigest()

image

Shift cipher


image

Ну с алгоритмом шифровани нам помогают. Тот же самый Шифр Цезаря, только сдвиг происходит не в диапозоне от нуля до длины алфавита, а по всем возможным 256 значениям одного байта. Напишем программу, которая сначала сдвинет каждый символ на 1, потом на 2 и т.д. до 255.

s = open(‘ch7.bin’, ‘r’).read()
for x in range(255):
“”.join( chr((ord(y) + x)%256 ) ) for y in s)

image

Среди строк найдем ту, которая содержит ответ.

image

Pixel Madness


image

Нам дают несколько выражений, а в конце говорят, что 0 — это белый цвет, а 1 — черный. Скорее всего в итоге должна получиться картинка. Предполагаю, что в выражении нужно не умножать, а повторять необходимое количество раз определенный символ.

Быстро можно выполнить выражение с помощью функции eval, но сначала нужно изменить формат 0x1 на ‘0’*1.

s = ''''0x3+1x1+0x1+0x1+0x7+1x2+0x15+1x1+0x8+1x1+0x8+1x1+0x1+1x1+0x1+1x1+0x1+1x1+0x1+1x1+0x3+1x1+0x1+1x1+0x3+1x1+0x1+1x4+0x2+1x1+0x25
'0x2+1x1+0x4+1x1+0x4+1x3+0x1+1x2+0x2+1x8+0x11+1x4+0x1+1x3+0x6+1x2+0x4+1x1+0x4+1x2+0x7+1x4+0x4+1x2+0x7+1x2+0x3+1x2+0x3
'0x3+1x1+0x2+1x1+0x2+1x1+0x11+1x2+0x2+1x3+0x7+1x1+0x4+1x2+0x2+1x2+0x7+1x1+0x6+1x1+0x2+1x1+0x4+1x3+0x1+1x1+0x4+1x1+0x2+1x1+0x2+1x1+0x3+1x1+0x2+1x3+0x2+1x2+0x3
'1x1+0x2+1x1+0x4+1x1+0x2+1x1+0x1+1x1+0x2+1x1+0x2+1x1+0x1+1x2+0x2+1x2+0x1+1x2+0x3+1x1+0x3+1x1+0x2+1x2+0x1+1x3+0x3+1x1+0x2+1x1+0x4+1x2+0x1+1x1+0x4+1x1+0x3+1x2+0x12+1x2+0x1+1x1+0x3+1x7+0x3
'0x3+1x1+0x7+1x1+0x1+1x1+0x4+1x1+0x2+1x2+0x2+1x2+0x4+1x1+0x2+1x1+0x1+1x2+0x1+1x8+0x1+1x1+0x4+1x1+0x5+1x1+0x3+1x2+0x2+1x1+0x1+1x2+0x2+1x1+0x3+1x2+0x9+1x1+0x1+1x2+0x2+1x3+0x2+1x1                
'0x7+1x1+0x4+1x1+0x4+1x1+0x1+1x1+0x1+1x7+0x3+1x1+0x1+1x2+0x3+1x1+0x1+1x6+0x1+1x1+0x3+1x1+0x2+1x1+0x14+1x2+0x8+1x1+0x10+1x2+0x3+1x2+0x1+1x1+0x1
'0x6+1x5+0x4+1x1+0x7+1x1+0x2+1x1+0x3+1x2+0x4+1x1+0x8+1x1+0x3+1x2+0x1+1x2+0x3+1x1+0x8+1x1+0x2+1x2+0x1+1x1+0x3+1x7+0x5+1x2+0x2+1x1+0x2+1x2+0x3
'0x1+1x1+0x2+1x1+0x1+1x2+0x5+1x1+0x6+1x2+0x3+1x1+0x2+1x1+0x1+1x2+0x20+1x8+0x1+1x1+0x1+1x1+0x4+1x2+0x3+1x1+0x2+1x2+0x3+1x2+0x7+1x2+0x3+1x2+0x4
'0x2+1x1+0x3+1x5+0x5+1x2+0x7+1x1+0x4+1x2+0x2+1x1+0x2+1x2+0x1+1x1+0x3+1x1+0x6+1x2+0x2+1x2+0x3+1x2+0x2+1x3+0x1+1x1+0x6+1x3+0x3+1x5+0x3+1x1+0x4+1x1+0x5
'0x4+1x2+0x3+1x2+0x3+1x1+0x5+1x2+0x2+1x1+0x1+1x1+0x1+1x1+0x1+1x2+0x9+1x1+0x3+1x1+0x2+1x1+0x1+1x1+0x2+1x1+0x1+1x2+0x2+1x1+0x2+1x1+0x1+1x1+0x4+1x3+0x1+1x1+0x2+1x2+0x3+1x2+0x3+1x1+0x5+1x1+0x4+1x1+0x2
'0x6+1x5+0x4+1x1+0x1+1x1+0x2+1x2+0x6+1x1+0x1+1x7+0x4+1x3+0x3+1x1+0x4+1x1+0x2+1x2+0x4+1x1+0x6+1x1+0x6+1x8+0x3+1x1+0x5+1x1+0x7
'0x2+1x1+0x3+1x6+0x4+1x1+0x1+1x3+0x4+1x1+0x2+1x2+0x4+1x1+0x5+1x1+0x2+1x1+0x3+1x2+0x3+1x1+0x2+1x3+0x1+1x1+0x2+1x2+0x3+1x3+0x2+1x3+0x9+1x1+0x4+1x2+0x7+1x2'''

s = s.replace("x", "'*").replace("+","+'")
examp = s.split('\n')
bits = [eval(i) for i in examp]

print(bits)

image

Теперь создадим картинку с помощью библиотеки PIL. Допишем следующий код, выпоним и откроим получившуюся картинку.

from PIL import Image

width, height = len(bits[0]), len(bits)

pic = Image.new('RGB', (width, height))
pix = pic.load()

for i in range(height):
	for j in range(width):
		 pix[j,i] = ( bits[i][j]=='0' and (255,255,255) or (0,0,0) )

pic.save('pixel.png')

image

Я приблизил картинку, читаем слово SOLUTION. На самом деле тут больше стеги, чем крипты. Данная статья будет интересна, скорее всего, только новичкам.

Дальше больше и сложнее… Вы можете присоединиться к нам в Telegram. Там можете предлагать свои темы и участвовать в голосовании на выбор темы для следующих статей.
Теги:ctfcryptographyhashcatPILpythonинформационная безопасностьбralf_crypto
Хабы: Информационная безопасность Python CTF
Всего голосов 13: ↑12 и ↓1 +11
Просмотры5K

Похожие публикации

Python для работы с данными
26 мая 202131 500 ₽Нетология
Python-разработчик плюс
20 мая 2021168 000 ₽Яндекс.Практикум
Основы языка Python
24 мая 202120 800 ₽Luxoft Training
Мидл python-разработчик
27 мая 202185 000 ₽Яндекс.Практикум
Программирование на Python: Введение
18 октября 202130 000 ₽Сетевая Академия ЛАНИТ

Лучшие публикации за сутки