Forwarded from VRN
Гипнолуч
Скачиваем исходники на go и видим что с именем dr.cosmodinamikov не удастся зарегистрироваться. Пробуем им войти и использую это имя и как пароль. Внутри читаем прикольные комменты тех, кто побывал тут до тебя 😁👍
Скачиваем исходники на go и видим что с именем dr.cosmodinamikov не удастся зарегистрироваться. Пробуем им войти и использую это имя и как пароль. Внутри читаем прикольные комменты тех, кто побывал тут до тебя 😁👍
😱5👎3😁1
Forwarded from thxStuck
к доменному имени через / добавляем docs
https://t-bugman-18kk0hkv.spbctf.net/docs
мы переходим на FastApi
Тут у нас есть все Get и Post запросы сайта
😱5👍1
Forwarded from thxStuck
Видим /bugman-photos-stash-20240328
Нажимаем на него и тыкаем Try it out -> Execute
Forwarded from thxStuck
Получаем html code. Отсюда уже можно взять флаг, но мы обязаны увидеть картинку))
Forwarded from thxStuck
Forwarded from Vladimir Markov
Привет. По задаче "Элементарно, Ватсон!" в канале какое-то очень сложное решение предложено. Есть в разы проще в одну строчку кода)
В задаче сказано что используется "Усовершенствованный классический метод шифрования" (имеется в виду классический шифр древней спарты). Просто вместо одной палочки там две. Однако на процедуре взлома это никак не сказывается, принцип остается точно таким же: нам нужно подобрать такой
На строчках 11 и 12 замечаем две части нашего ключа:
В задаче сказано что используется "Усовершенствованный классический метод шифрования" (имеется в виду классический шифр древней спарты). Просто вместо одной палочки там две. Однако на процедуре взлома это никак не сказывается, принцип остается точно таким же: нам нужно подобрать такой
m, чтобы data[::m] представлял собой осмысленный текст. При m = 32 мы получаем "HOLMES_CASE_DB||Case_1:_The". Далее выводим все остальные строчки (соединять их в один текст не будем - слишком сложно):data = "H_S_|_e_gI..."
print("\n".join(data[i::32] for i in range(32)))
На строчках 11 и 12 замечаем две части нашего ключа:
m3_th0Ugh7_r3WarD_bRoU6ht} и tctf{Cr1. Остается только их правильно соединить.❤5👍1👏1🤯1
Forwarded from Vladimir Markov
Еще там нет решения задачи "Доктор Хаос":
Ключевые элементы, которые нужно было заметить:
1. Используется симметричное шифрование без перестановок с помощью надежного алгоритма RC4 (взломать его возможно)
2. Строка до шифрования представляет из себя результат сериализации protobuf структуры (первые 3 байта служебные, потом zip от введенного текста, служебные байты, zip от флага и еще служебные байты)
3. Для генерации ключа используется
Так как алгоритм RC4 взломать невозможно, а алгоритм генерации ключа явно очень слабый, стоит атаковать его. Все что нужно сделать это написать C++ программку, которая будет подавать на вход EncryptBirthmaRC4 один и тот же текст (главное не забыть про служебные байты от protobuff) и сверять что первые N байт (например 4) зашифрованного текста совпадают с теми что лежат в patient-chart.bin (или наоборот можно подавать зашифрованный текст на вход - без разницы, шифрование делается с помощью xor). Так как initial_seed локально и на сервере равен 1, а количество запросов на сервер скорее всего не превысило 100к, правильный seed (а с ним и key) мы найдем меньше чем за секунду. После чего используем найденный ключ для расшифровки текста.
По сути вся задача решалась в 6 строчек:
Ключевые элементы, которые нужно было заметить:
1. Используется симметричное шифрование без перестановок с помощью надежного алгоритма RC4 (взломать его возможно)
2. Строка до шифрования представляет из себя результат сериализации protobuf структуры (первые 3 байта служебные, потом zip от введенного текста, служебные байты, zip от флага и еще служебные байты)
3. Для генерации ключа используется
default_random_engine, который представляет из себя самый простой псевдослучайный генератор. Более того, каждый раз при запуске программы seed будет одним и тем же (initial_seed=1), никакой инициализации от текущего времени.Так как алгоритм RC4 взломать невозможно, а алгоритм генерации ключа явно очень слабый, стоит атаковать его. Все что нужно сделать это написать C++ программку, которая будет подавать на вход EncryptBirthmaRC4 один и тот же текст (главное не забыть про служебные байты от protobuff) и сверять что первые N байт (например 4) зашифрованного текста совпадают с теми что лежат в patient-chart.bin (или наоборот можно подавать зашифрованный текст на вход - без разницы, шифрование делается с помощью xor). Так как initial_seed локально и на сервере равен 1, а количество запросов на сервер скорее всего не превысило 100к, правильный seed (а с ним и key) мы найдем меньше чем за секунду. После чего используем найденный ключ для расшифровки текста.
По сути вся задача решалась в 6 строчек:
int main(int argc, char* argv[]) {
// Содержимое patient-chart.bin
std::string ciphertext = {5, 110, -102, 115, ...};
for (int i = 0; i < 100000; i++) {
std::string plaintext = EncryptBirthmaRC4(ciphertext);
// Проверяем удалось ли расшифровать
if (plaintext[0] == -48 && plaintext[1] == -111 &&
plaintext[2] == 60 && plaintext[3] == -32) {
printf("Message decoded on #%d! See plaintext\n", i);
}
}
}
❤1
Forwarded from Vladimir Markov
Еще мало кто решил задачку "CTF 2023":
Ключевые моменты, которые нужно было заметить:
1. Шифрование симметричное побайтовое с помощью xor. А значит для расшифровки текста достаточно просто повторить шифрование еще раз (xor отменится):
2. Выполнение кода займет несколько миллиардов лет из-за этого цикла:
3. В конце нас интересует ответ по модулю N, так что вспоминаем модульную арифметику из олимпиадного программирования. Это позволит избавиться от необходимости работать с числами из миллиардов знаков, что позволит сократить время выполнения всего до 3 миллионов лет
4. Операции внутри цикла подозрительно сильно напоминают умножение матриц:
Таким образом мы получаем что у нас есть цикл (* - умножение матриц, % - модуль по всем элементам):
Использование матриц может немного пугать, однако по сути этот цикл эквивалентен такому:
Весь этот цикл можно оптимизировать до
Двух этих оптимизаций достаточно чтобы сократить время расшифровки до 1 секунды.
Ключевые моменты, которые нужно было заметить:
1. Шифрование симметричное побайтовое с помощью xor. А значит для расшифровки текста достаточно просто повторить шифрование еще раз (xor отменится):
python DiffusionCipher.py ctf2023.yaml.protected ctf2023.yaml key.json
2. Выполнение кода займет несколько миллиардов лет из-за этого цикла:
n0, n1, m0, m1 = 0, 1, 0, 1
# n = 92153904885269267505545
while diffusionCycles <= n:
n0, n1 = n1, a * n1 - b * n0
m0, m1 = m1, x * m1 - y * m0
diffusionCycles += 1
result = (m1 * n1) % N
3. В конце нас интересует ответ по модулю N, так что вспоминаем модульную арифметику из олимпиадного программирования. Это позволит избавиться от необходимости работать с числами из миллиардов знаков, что позволит сократить время выполнения всего до 3 миллионов лет
4. Операции внутри цикла подозрительно сильно напоминают умножение матриц:
| n0 | | 0 1 0 0 | | n0 |
| n1 | = | -b a 0 0 | * | n1 |
| m0 | | 0 0 0 1 | | m0 |
| m1 | | 0 0 -y x | | m1 |
Таким образом мы получаем что у нас есть цикл (* - умножение матриц, % - модуль по всем элементам):
state = [0, 1, 0, 1]
for _ in range(n):
state = (A * state) % N
Использование матриц может немного пугать, однако по сути этот цикл эквивалентен такому:
a, b = 1, 2
for _ in range(n):
a = b * a
Весь этот цикл можно оптимизировать до
a * (b ** n). А для быстрого расчета b ** n можно использовать алгоритм быстрого возведения в степень, который возведет число (или матрицу) в степень n за O(log n). Главное не забывать про модули и не использовать numpy (у нас числа больше чем int64)!Двух этих оптимизаций достаточно чтобы сократить время расшифровки до 1 секунды.
🤯4🔥2