Write-up ASSembly (SPRUSH CTF)
User1
Здесь могла быть ваша реклама https://t.me/ch4nnel1
Содержание:
Разбор

Тут даже из описания таска видно, что речь идет о виртуальной машине -> реверс виртуальной машины юхууу (о нееет). Посмотрев на файлы понимаем, что kek - код виртуальной машины, а ASSembly сама виртуалка.
Сначала я попробовал посмотреть на это все в иде, но там бы пришлось слишком много думать и реверсить, чтобы разобраться в устройстве байткода машины, так что я как обычно забил на это.
Поэтому вспомнил блог крутого ctf'ера, реверсера https://archercreat.github.io/, в котором есть разборы VM'ок разной сложности. Но я слишком тупой для быстрого освоения фреймворков. Так что да... На вариант почитать про реверс виртуалок, я тоже забил.
Уже никаких надежд на решение этого задания нет, но как последнюю надежду запускаю виртуалку под strace

Мдааа... Ничего интересного нам это не дает. Но зато это подтолкнуло меня на дебаг виртуалки. Дебажить можно разными способами и прогамми, лично я дебагал используя радар и ставя брейкпоинты на чтение, тех мест куда записывался наш инпут. Так можно дойти до места в бинаре, где один проксоренный байт из нашего инпута сравнивается со значением на стеке.
Пока я дебагал, еще я параллельно смотрел в предоставленный байт-код. Из интересного, нужного нам, там можно заметить значения по адресам 0c-2b (32 байта (максимальная длина флага) идущих сразу после строчки, которая просит ввести флаг) и 2c-4b (32 не повторяющихся байт от 00 до 1f).

Пользуясь дебагом и логикой можно примерно восстановить алгоритм проверки флага.
order = [ 0x0B, 0x07 ... 0x0A, 0x16 ] #те 32 не повторяющехся байт
comp = [0x6e,0x14 ... 0x43,0x03] #32 байта с 0xc
a=input()
check=True
for i in range(32):
somevalue = #оно каждый раз меняется, но где берется, я не нашел
if(a[order[i]]^somevalue!=comp[i]):
check=False
break
return check
Дальше дело за малым, восстановить флаг имея все нужные переменные, к примеру с помощью этого скрипта, хотя можно и ручками.

Решение
- Отдебагать ВМ с загруженным байт кодом, отследить с чем и где сравнивается наш инпут
- Заметить закономерности между некоторыми байтами кода и переменными, что использует ВМ (не обязательно, все можно получить с помощью дебага)
- Написать скрипт, что восстановит флаг, или сделать это ручками
Эпилог
Во-первых хочу нормальный райтап на реверс этой VM

Во-вторых, если вам правда интересно научится реверсу ВМ, то советую почитать блог, что я уже упоминал https://archercreat.github.io/, да и просто пообщаться с его автором, @archercreat. Судя по его райтапам на другие темы (не ВМ) и выступлению на этом же ctf, человек умный и ему есть, что рассказать. Пару раз общался с ним по поводу его райтапов, получал емкие и нужные ответы.
В-третьих, в радаре кажется есть баг, что когда ставишь rw (read-write) брейкпоинт, радар не реагирует на него совсем. Однако когда ставишь read брейкпоинт, он реагирует на него и при записи по этому адресу. В общем, какой-то странный баг, нужно будет написать о нем панкейку (автор радара), если смогу воспроизвести.
В-четвертых, мне нравится, что я потихоньку начал слезать с иглы иды, и учиться пользоваться другими утилитами. Можете меня поздравить

Эпилог эпилога
Пока искал картинку для предыдущего мема в нормальном качестве, наткнулся на прикольное отображение оной на одном из сайтов спаршенных Яндексом, почти ctf таск
