Вы правы, что мы должны программировать сокеты для связи с сервером. Раньше я пробовал Python, но в итоге вместо этого использовал простые старые скрипты Bash.
Для начала вы можете взглянуть на то, как инициализировать сокет с помощью Bash, следуя руководству здесь: http://hacktux.com/bash/socket
Шаг 1: Инициализировать сокет
Вы можете использовать Bash exec
и перенаправление unix
для создания сокета на псевдопуть. Синтаксис пути: / dev /
exec 3 / dev / tcp / cs2107.spro.ink / 9000;
Шаг 2. Чтение выходных данных сервера
Нам нужно прочитать закодированные байты из вывода сервера. Это можно сделать с помощью команды cat
, но это не сработает так, как вы ожидали. Это связано с тем, что сервер ожидает ввода от клиента и нет символа EOF. (Я предполагаю, что это связано с потоковой передачей данных) Чтобы предотвратить это, вам нужно избегать чтения за пределами вывода сервера, то есть останавливаться на строке 7.
head -7
Шаг 3: Grepping & преобразование данных
egrep -o '^ [0-9a-f] {20}' | xxd -r -p | md5sum
После того, как мы прочитали кусок информации, мы можем использовать egrep для получения шестнадцатеричных байтов. Поскольку длина шестнадцатеричного дампа фиксирована, мы можем использовать регулярное выражение для извлечения необходимых данных.
Передача шестнадцатеричного дампа по конвейеру xxd -r -p
преобразует шестнадцатеричный дамп в двоичный и выведет их как обычный текст. Затем md5sum
выполнит грязную работу и вычислит за нас ответ.
Шаг 4: Обратная запись на сервер
awk '{print $ 1}'> & 3;
В моем случае md5sum выводит ответ и дополнительный символ в конце строки, поэтому я использую awk
для печати первого столбца и обратной записи на сервер.
Шаг 5: повторить еще 499 раз
Аналогично шагам 2-4, за исключением того, что нам нужно изменить шаг 2, потому что сервер будет выводить только «правильно» в последующем ответе вместо длинного вводного текста. Измените заголовок
, чтобы он читался в 2 строки. Нам также нужно сделать это еще 499 раз:
for i in {1..499}
do
head -2 <&3 | egrep -o '^[0-9a-f]{20}' | xxd -r -p | md5sum | awk '{print $1}' >&3;
done
Шаг 5: Захватить флаг
После того, как все ответы 500 были завершены, флаг может быть получен путем захвата сокета.
cat
P / S Я брал тот же модуль и выполнял то же задание, что и OP, так что, думаю, я поделюсь своим ответом здесь. Просто случайно узнал об этом посте после завершения модуля.