Данное задание было одним из простых и основывалось на расшифровке файла, шифр которого мы имеет.
Все просто, приступаем!
fib = [1, 1]
for i in range(2, 11):
fib.append(fib[i - 1] + fib[i - 2])
def c2f(c):
n = ord(c)
b = ''
for i in range(10, -1, -1):
if n >= fib[i]:
n -= fib[i]
b += '1'
else:
b += '0'
return b
flag = open('flag.txt', 'r').read()
enc = ''
for c in flag:
enc += c2f(c) + ' '
with open('flag.enc', 'w') as f:
f.write(enc.strip())
10000100100 10010000010 10010001010 10000100100 10010010010 10001000000 10100000000 10000100010 00101010000 10010010000 00101001010 10000101000 10000010010 00101010000 10010000000 10000101000 10000010010 10001000000 00101000100 10000100010 10010000100 00010101010 00101000100 00101000100 00101001010 10000101000 10100000100 00000100100
Первый код, это код по которому шифровался флаг. Бинарник — это тот самый флаг который прошел данный скрипт.
Данное задание считается самымпростым в данной ctf, а поэтому имеет множество решений.
- Написание обратного скрипта для преобразований байтов обратно в символы для получения флага.
- Взять все читаемые символы и провести их через этот скрипт для получения словаря который будет использоваться для замены закодированного текста.
Я выбрал 2 путь так как для меня он казался более быстрым и понятным.
Первым делом я выбрал все символы для написания скрипта который создаст мне словарь.
inp = open('inputslov.txt', 'r', encoding="utf-8")
out = open('outputslov.txt', 'w')
fib = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
znak = inp.read()
def c2f(c):
n = ord(c)
b = ''
for i in range(10, -1, -1):
if n >= fib[i]:
n -= fib[i]
b += '1'
else:
b += '0'
return b
while True:
for c in znak:
puk = c2f(c)
print(c + " " + puk)
out.write(c + " " + puk + "\n")
break
Файл inputslov.txt имел в себе просто набор символов которые могли быть в коде.
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ()-_{}0123456789
В outputslov.txt мы имели по сути словарь который имел строчки по типу: ключ значение
Вот пара строчек из выходного файла.
a 10000100000
b 10000100010
c 10000100100
d 10000101000
e 10000101010
f 10001000000
.....
Так как словарик создан, требовался скрипт для замены исходного зашифрованного текста на полноценный флаг!
Был написан такой кривой скрипт.
Да я очень плохо пишу скрипты и первый раз работаю с python. Но раз это у меня вышло, то для начала я все делаю правильно!
startfile = open('flag.enc', 'r').readline()
keyfile = open('outputslov.txt', 'r' ).readlines()
flagsttr =''
startwords = startfile.split(' ')
for tt in range(0,len(startwords)):
for i in range(0,len(keyfile)):
if startwords[tt] in keyfile[i]:
flagsttr +=keyfile[i][0]
print (flagsttr)
Да этот скрипт имеет уйму косяков и так же легко оптимизируется. Но я пожалуй оставлю это на вас! =)
После выполнения скрипта мы получаем наш заветный флаг!
Повторюсь что скрипты ОЧЕНЬ плохие, но тут все делалось все быстро и без знаний на получение конечного результата.