CTF Экзамен?? (writeup)

Всем привет.

Решил переключиться на pwn, попробовать, что это и как. Оказалось интересно.
Приступим. Скачиваем архив, unzip его и в IDA.

В иде смотрим функцию main, жмем F5 для генерации псевдокода.

IDA.png


Что мы видим а данном скриншоте, а то, что у нас есть флаг внутри (т.к. приложуха локальная, то и флаг в ней фейковый, но в реальной приложухе должен быть реальный флаг).
Далее мы видим что есть вывод текста с последующим запросом ответа от пользователя с помощью scanf (int32 в hex виде) и без ограничения и проверок количества полученных символов, что может привести к преполнению буфера или перетеранию переменных по стеку.

Далее видим, что есть вызов функции которая как-то проверяет введенные пользователем значения и если все успешно введено, то делается инкремент balls (наверное баллам). Внутри этой функции подсчитывается куб по полученном значению.
IDA2.png


Что же дальше? Дальше мы видим, что бы получить флаг у нас должно быть 300 баллов, но цикл с расчетами у нас рассчитан всего на 100 баллов. Как же нам честным получить флаг? Азино какое-то =)

Штош, значит будем пробовать нечестным путём выиграть в нечестной игре. Смотрим как у нас лежат переменные.
IDA3.png


Видим, что переменные идут друг за другом - значит можно их переписать (т.к. помним про scanf)
Значит надо подгадывать нагрузку.

Пробуем в отладке на каждой итерации увеличивать количество символов в нашем ответе и смотрим как меняется память. В итоге получаем нагрузку ААAAAAAAAA и в balls у нас попала ерунда
IDA4.png

IDA5.png


Но нам там ерунда не нужна, нам там надо 300 (не забываем про hex, 300 будет 012C)
Делаем нагрузку 012CAAAAAAAA и получаем в balls 300. Но каждый раз так в цикле делать - можно очень сильно устать, поэтому обратимся к автоматизации. PWN (библиотека?) для питона
Она позволяет делать многое, но пока делаем для локальной приложухи.

pwn template ./exam
Это сделает нам сплоит для того, что бы внутри мы уже внедряли свою нагрузку в автоматическом режиме.
Во время работы с локальной приложухой сплоит работал успешно, однако как только я подключился к удаленной - перестал, пришлось отлаживать и менять некоторые вещи и делать ветвление для локальной версии и для удаленной, на будущее, чтобы не забыть.
Запуск сплоита для локальной приложухи ./exploit.py LOCAL NOASLR
Для удаленной ./exploit.py REMOTE DEBUG

Выкладывание кода для копипасты сюда будет равносильно слитию флага, то я выложу только скриншот.
sploit.png


PWNED

PS
Спасибо участнику комьюнити ROP за указанное направление что почитать.
 

Вложения

  • IDA.png
    IDA.png
    128,2 КБ · Просмотры: 197

suzu

New member
13.05.2024
1
0
BIT
14
Все супер, только непонятно:
1) почему 12C стоит в начале пэйлоада
2) почему 'A' 8 штук, хотя 0xB8 - 0xB4 = 4
 

yetiraki

Green Team
07.02.2023
63
108
BIT
441
Все супер, только непонятно:
1) почему 12C стоит в начале пэйлоада
2) почему 'A' 8 штук, хотя 0xB8 - 0xB4 = 4

Спасибо.
1) little-endian/big-endian. scanf("&lX"); %lx — целое число типа long int со знаком в шестнадцатеричной системе счисления;
2) нам надо записать в саму переменную какое-то значение + переписать соседнюю переменную, обе они по 4 байта.
 
  • Нравится
Реакции: suzu
Мы в соцсетях:

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