# Byte is 8bit ## Описание Программа претерпела небольшие потери, до того как попала к нам. Помогите с ней разобраться. Эта программа все сделает сама. Практически все... --- The program suffered a little loss before it came to us. Help us deal with it. This program will do everything by itself. Pretty much everything… ## Краткое описание уязвимости Программа написана под 8-битный процессор AVR ATmega16. Необходимо ознакомиться с языком ассемблера под данный тип процессора и разобраться в алгоритме. # Решение Программа написана под 8-битный процессор AVR ATmega16 Таск имеет два решения. (может и больше) ### 1) Статика - Провторяем ассемблерный код расшифровщика на любом другом языке и расшифровываем большую строку с текстом. (Для этого надо ознакомиться с языком ассемблера для данного типа процессора). В разделе процедур находим единственную функцию (Рис.1), разбираемся что она делает. На рисунке 2 повтор функции на языке Python. ![](https://i.imgur.com/mNpU7Hm.png) ![](https://i.imgur.com/9o1SrDT.png) - Мы получили большую строку, в которой не все символы являются флагом. Разбираем код вывода символов строки в регистр. Лишние симолы попадают в порт UDR. Нужные символы выводятся в порт DDRB по особому правилу*. Код на языке python приведен на рисунке 3. Это и будет флаг. *особое правило: нужные индексы символов флага: 0, 4, 9, 15, 22, 30, 39... ![](https://i.imgur.com/2bBsFby.png) ### 2) Динамика - Устанавливаем симулятор, например, AVRStudio, Рис.4. ![](https://i.imgur.com/AA4HAm7.png) - вставляем в код раздел инициализации стека (где написано DataLost) и он начинает отлаживаться. ![](https://i.imgur.com/Vx0rgwY.png) - В отладке программа сама расшифровывает большую строку и кладет в память - это обфусцированный флаг. - Далее программа выводит симолы флага в разные порты. В порты данные из регистра выводит макрос OUTI. Портам соответствуют адреса: UDR - 0xC , DDRB - 0x17. Символы настоящего флага под индексами 0, 4, 9, 15, 22, 30, 39... - Программа несколько последних символов флага не отправляет в порты. Теперь, зная индексы флага, его можно получить скриптом на любом языке программирования, Рис.3. ## FLAG: `BSC{L0w_lev3l_-_it_1s_n0t_h4rD}`