[QUOTE]
Kevgen сказал(а):
Всем привет!
Сегодня рассмотрим задание "Абсолютная безопасность" из криптографии от Antichat.
Итак, приступим!
Ищем вектор
Нам дается IP'шник, и три подсказки:
- Возможно проверка на утечку флага является "узким местом"?
- Вы не любите кошек? Да вы просто не умеете их готовить!
- Я думаю стоит накапливать зашифрованные флаги.
Откроем IP. Видим, что он обнаружил контент, который не может обработать браузер.
Поэтому смотрим на вторую подсказку и запускаем netcat (для винды - ncat) и подключаемся:
Код:
ncat 62.173.140.174 11000
Для взаимодействия у нас есть две команды: "request" и "exit". Если с "exit" все ясно, то с "request" нет. Для этого смотрим вверх и видим кусок кода, который используется при отправке request'а.
Python:
Код:
async
def
gen_enc_flag
(
)
:
rand_bytes
=
urandom
(
23
)
enc
=
bytes
(
i
^
j
for
i
,
j
in
zip
(
flag
,
rand_bytes
)
)
for
i
in
range
(
23
)
:
assert
enc
[
i
]
!=
flag
[
i
]
,
"leak detected"
return
enc
.
hex
(
)
Я в коде не силен, поэтому просто загрузил код в ChatGPT
За его ответ судить не берусь, но общее понимание появилось.
Сначала функция генерирует 23 рандомных байта, далее она делает XOR байта первого символа флага с первым сгенерированным байтом, потом тоже самое со вторым и.т.д.
После XOR'ов всех символов флага программа проверяет на равенство каждый байт зашифрованного флага и изначального. Если таковой есть, то печатает "Leaked some plaintext".
Получается, что в каждом зашифрованном флаге на своем месте нет ни одного символа от изначального.
Т.е если флаг - Antichat{eto_ne_flag}, то первый байт (43 для "C") нам никогда не встретится. Тоже самое и для остальных символов.
Сбор флагов
Тут мы обращаемся к третьей подсказке "Я думаю стоит накапливать зашифрованные флаги".
Осталось определиться с количеством собираемых флагов. Слышал, что 5000 достаточно, но я определил для себя - 30000. Так сказать, наверняка .
Ясно дело, что вручную это ооочень долго, поэтому автоматизируем, используя
pynput для ввода с клавиатуры.
Сам код:
Python:
Код:
import
time
import
pynput
from
pynput
.
keyboard
import
Key
,
Controller
keyboard
=
Controller
(
)
# Create the controller
i
=
0
time
.
sleep
(
10
)
while
i
>
hashes.txt
;
sleep
0.1
;
done
2к флагов достаточно.
Решалка:
Python:
Код:
with
open
(
'hashes.txt'
,
'r'
)
as
file
:
hashes
=
file
.
readlines
(
)
list1
=
[
]
flag
=
[
]
symbols
=
"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_{}!$@%^&*()"
for
i
in
range
(
len
(
hashes
)
)
:
hashes
[
i
]
=
bytes
.
fromhex
(
hashes
[
i
]
)
for
x
in
range
(
23
)
:
for
a
in
symbols
:
for
i
in
range
(
len
(
hashes
)
)
:
if
hashes
[
i
]
[
int
(
x
)
]
==
ord
(
a
)
:
if
a
in
list1
:
list1
.
remove
(
a
)
break
else
:
if
a
not
in
list1
:
list1
.
append
(
a
)
flag
+=
list1
print
(
''
.
join
(
flag
)
)