---
# System prepended metadata

title: 'Simple BOF: Я хочу купить этот флаг!!!'

---

Дан ELF файл. Сразу открываю его в IDA.

Смотрю дизассемблированый код:

![](https://hackmd.io/_uploads/B1-powYsh.png)

Здесь две интересные функции: **call** и **login**
Посмотрим их:

* call

![](https://hackmd.io/_uploads/rJXInPFj3.png)

* login

![](https://hackmd.io/_uploads/BymFnvtsh.png)

Функциия **call** для нас бесполезна. Смотрим **login**:
Идёт ввод логина и пароля.

Сразу найдём креды. Данные пременные являются константами, смотрим их значения в памяти:

![](https://hackmd.io/_uploads/S1elaPKjh.png)

Итого:

```
Login: admin
Password: Super_secret_admin_password
```

После авторизации открывается панель админа (admin_menu):

![](https://hackmd.io/_uploads/S1DPRPYjn.png)

Проананализирую:

1) Глобальная переменная баланс, изменение которой происходит на константное число (9990), и сразу заметим, что с начальным балансом (1000) никак не получится набрать 4408386 (CDB), значит смотри дальше.
2) Вспоминаю вторую подсказку "Что такое Little-Endian? :)" о понимаю, что необходимое необходимое значение баланса не **"CDB"**, а **"BDC"** (про числовое значение сразу забываем).
3) Есть возможность сменить логин. Возможно пригодится.

Посмотрим, где в памяти хранится баланс:

![](https://hackmd.io/_uploads/S1sWb_to3.png)

Интересно... Чуть выше находится **admin_login** и **admin_pass**, а мы как раз можем изменить значение **admin_login**.

Сразу рассчитаю, сколько символов нужно ввести.
Рассчитаем разницу адрессов: **0000564D8BF5A03C** (balance) - **0000564D8BF5A010** (admin_login) = **2C** = **44** 

-> Payload: 44 символа + BDC

```
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDC
```

Проверяем:

![](https://hackmd.io/_uploads/ByKD7uYin.png)


Отлично. Идём получать флаг.

![](https://hackmd.io/_uploads/BJ1H7_tj2.png)

Победа. Флаг - **CODEBY{0vErFL0w_1n_D@tA}**




