Почти все задания были решены, поэтому здесь будет рассказано о том, как решить таски с помощью python3. Советую установить и посмотреть, как он устроен. Установить несложно, потом просто в поиске винды ищете IDLE и тыкаете команды (не забывайте про табуляцию, в питоне это важно), которые внизу увидете. В цтфах очень часто важна скорость, в этом питон помогает, он несложный и имеет много модулей.
Таск ведет нас на сайт, там строка из чисел похожая на флаг, похоже что каждый символ переведен в число по таблице ASCII. Окей, пишем на питоне следующий скрипт
flag = "115 117 116 100 67 84 70 { 104 51 114 51 95 49 53 95 102 108 52 103 }"
splitted_flag = flag.split(" ") # делим строку на массив, делитель - пробел
# получается в splitted_flag теперь такое ['115', '117', '116', ..., '103']
new_flag = ""
# Это цикл, на каждой его итерации из массива splitted_flag берется элемент и присваивается переменной symbol. Цикл закончится, когда все элементы уже были использованы
for symbol in splitted_flag:
# Если текущий элемент не '{' и не '}'
if symbol not in ["{", "}"]:
# то переводим число в символ и записываем в конец строки new_flag
# переводим например строку '115' в число 115
int_symbol = int(symbol)
# переводим число в печатаемый символ, 115 -> 's'
сhr_symbol = chr(int_symbol)
# записываем в конец строки символ
new_flag += сhr_symbol
else:
# иначе просто записываем в конец строки
new_flag += symbol
# Выводим флаг
print(new_flag)
Суть этого таска узнать про кодировки base64 и base32, пишем скрипт:
# Подключаем модуль base64 и импортируем функции b32decode, b64decode
from base64 import b32decode, b64decode
flag = "QW5vdGhlciB5ZXQgYmFzZSwgYnV0IGhhbGYgYXMgbXVjaCBPTjJYSVpDREtSREhXWVRCT05TVjYyTFRMNVFYT1pMVE41V1dLN0k9"
flag_64 = b64decode("QW5vdGhlciB5ZXQgYmFzZSwgYnV0IGhhbGYgYXMgbXVjaCBPTjJYSVpDREtSREhXWVRCT05TVjYyTFRMNVFYT1pMVE41V1dLN0k9")
print (flag_64)
# >> Another yet base, but half as much ON2XIZCDKRDHWYTBONSV62LTL5QXOZLTN5WWK7I=
flag_32 = b32decode("ON2XIZCDKRDHWYTBONSV62LTL5QXOZLTN5WWK7I=")
print (flag_32)
# >> sutdCTF{base_is_awesome}
В этом таске нужно отправить на сервер POST запрос. Здесь есть много решений, например нагуглить сайт http://seriyps.ru/postget/ и отправить через него, но сейчас посмотрим, как делать это на питоне. Здесь понадобится библиотека requests. Чтобы установить либу нужно найти менеджер пакетов питона - pip.
Скорее всего он находится по этому пути:
C:\Users\имя юзера\AppData\Local\Programs\Python\Python38-32\Scripts
Дальше shift + right mouse > открыть окно powershell здесь
в консоли .\pip.exe install requests
.
Теперь открываете также IDLE и пишете скрипт:
import requests
# Сайт, куда отправим запрос
url = "http://34.90.1.185:7777/"
# отправляем post запрос
response = requests.post(url)
# печатаем ответ
print(response.text)
# >> sutdCTF{postman_or_python}
Это задание больше несет в себе смысл показать, какой питон бывает однострочный и очень понятный. Попытаюсь разобрать что в принципе это значит, но не думаю, что кто-то поймет с первого раза
print([ord(x) for x in input("> Enter the flag, I will check\n")] == [a + b for a,b in zip([101, 95, 111, 115, 94, 98, 85, 89], [2 * x for x in range(8)])])
Сначала генератор массивов (в питоне их называют списками).
a = [ord(x) for x in input("> Enter the flag, I will check\n")
# input - принимает строку от пользователя, выводя сообщение "Enter the ..."
# ord - переводит символ в число, например 'a' в 97 (по ascii таблице)
Эта строка примерно будет звучать так - принятую строку от пользователя представить как массив букв, каждую букву перевести в число и из них сделать новый массив. Тоесть на выходе - массив символов в формате числа. Дальше
[a + b for a,b in zip([101, 95, 111, 115, 94, 98, 85, 89], [2 * x for x in range(8)])]
[2 * x for x in range(8)]
- генерирует список [0, 2, 4, 6, 8, 10, 12, 14].
zip([101, 95, 111, 115, 94, 98, 85, 89], [2 * x for x in range(8)]
- создает массив по принципу [(101, 0), (95, 2), (111, 4), (115, 6), ...]
[a + b for a,b in zip(...)]
складывает элементы 101 + 0, 95 + 2, 111 + 4, 115 + 6 ... после чего создает новый массив уже с посчитанными числами:
[101, 97, 115, 121, 102, 108, 97, 103]
Вспоминаем первую часть и сравниваем два массива с помощью ==
, если пользователь ввел строку, которая образует массив выше (101, 97, ...) то это флаг, иначе нет. Вообще, этот массив уже флаг, достаточно перевести числа в символы. Можете сделать по аналогии как в Strange numbers или вот так:
flag = "".join(chr(x) for x in [101, 97, 115, 121, 102, 108, 97, 103])
print(flag)
# :)