CTF Simple BOF: Я хочу купить этот флаг!!! (writeup)

Всем привет.

Идем дальше. Идем в MEGABANK от EVIL CORP с огромным желанием "купить" флаг.
Скачиваем банк-клиент, unzip его, открываем в IDA и идем в main.

IDA-main.png

Далее идем в login

IDA-login.png

Видим, что тут у нас есть пользовательский ввод логина и пароля, но тут у нас все по феншую, ввод ограничен, тут мы ничего переписать не можем. Сразу видно, что в банке хороший разработчик =) но где же взять логин и пароль, не может же он быть захардкоден прямо в приложухе?

IDA-creds.png

IDA-creds2.png

А не, может, оказывается... Запоминаем.

Далее идем в admin_menu
IDA-admin.png

Видим, что флаг стоит как чугунный мост. Видим что можно работать, но заработать прям точное количество денег не получится из-за оплаты труда и комиссии, да и работать слишком долго надо.
Видим, что можем поменять дефолтные креды, которые мы видели ранее на свои и ... О, тут прием пользовательского ввода уязвимый! На вход принимается символы.

Там где мы смотрели креды, там же видно, что все 3 переменные лежат друг за другом, значит, чтобы переписать balance, надо переписать admin_login и admin_pass. Размер admin_login 10байт, размер admin_pass 34байта и далее unsigned int переменная balance. Но как нам записать в int из строки? Можем обратиться к ASCII таблице. Видим что в коде написан hex суммы необходимой для покупки флага, по таблице это будет CDB.
Пробуем нагрузку

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDB и в отладке видим что у нас сумма стала 424443, что нам не подходит. Почему так получилось? Потому что есть Big-Endian и есть Little-Endian. поменяем местами B и C.
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDC - ура, все переписалось как надо, баланс точный и соответствует необходимому для покупки флага. выбираем пункт меню покупка флага и получаем флаг.

Так как у нас pwn, то будем использовать pwn.
sploit.png

PWNED
 
  • Нравится
Реакции: Edmon Dantes и GoBL1n

KatCote

New member
24.02.2023
1
0
BIT
1
Извиняюсь если это глупый вопрос, но откуда мы взяли 10 и 34 байта?? Откуда 10 я еще примерно могу понять, но вот 34 никак не выходит найти. Заранее Спасибо
 

yetiraki

Green Team
07.02.2023
63
108
BIT
441
Извиняюсь если это глупый вопрос, но откуда мы взяли 10 и 34 байта?? Откуда 10 я еще примерно могу понять, но вот 34 никак не выходит найти. Заранее Спасибо
Не бывает глупых вопросов.

Справедливо урезонили дерзость зарвавшегося юнца.
Когда я писал райтап, я меньше знал, чем сейчас и писал исходя из имевшихся знаний, но дела там обстоят так:
1. 2 раза кликаем на admin_login и проваливаемся туда, где лежат переменные.
2.1 ПКМ на admin_login и выбираем Array и у нас указывается размер массива. Так же и для admin_password.
2.2 Либо можно вычитать адреса где лежат переменные со всеми align и прочим и получать размеры массивов.
Я использовал вычитание адресов и получилось admin_login = 10 admin_password = 28
3. Размер balance 4 (он int), но между окончанием admin_password и balance есть еще 4 байта. Как они там и почему я так и не допер, в этой части нагрузку я формировал опытным путем.

Вот что в памяти с модифицированной нагрузкой получилось, что бы лучше видно было.

answer01.png

Надеюсь смог ответить на вопрос.

PS
Полезные ссылки

серия статей
 
Последнее редактирование:
  • Нравится
Реакции: ZevSS
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!