# 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.


- Мы получили большую строку, в которой не все символы являются флагом.
Разбираем код вывода символов строки в регистр. Лишние симолы попадают в порт UDR.
Нужные символы выводятся в порт DDRB по особому правилу*. Код на языке python приведен на рисунке 3.
Это и будет флаг.
*особое правило: нужные индексы символов флага: 0, 4, 9, 15, 22, 30, 39...

### 2) Динамика
- Устанавливаем симулятор, например, AVRStudio, Рис.4.

- вставляем в код раздел инициализации стека (где написано DataLost) и он начинает отлаживаться.

- В отладке программа сама расшифровывает большую строку и кладет в память - это обфусцированный флаг.
- Далее программа выводит симолы флага в разные порты. В порты данные из регистра выводит макрос OUTI.
Портам соответствуют адреса: UDR - 0xC , DDRB - 0x17.
Символы настоящего флага под индексами 0, 4, 9, 15, 22, 30, 39...
- Программа несколько последних символов флага не отправляет в порты. Теперь, зная индексы флага,
его можно получить скриптом на любом языке программирования, Рис.3.
## FLAG:
`BSC{L0w_lev3l_-_it_1s_n0t_h4rD}`