ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Задания/Квесты/CTF/Конкурсы (https://forum.antichat.xyz/forumdisplay.php?f=112)
-   -   Writeup: "Странный PWN?" (antichat) (https://forum.antichat.xyz/showthread.php?t=1643689)

Don Reverso 15.07.2024 20:53

  • Название: Странный PWN?
  • Категория: pwn
  • Платформа: antichat
Нас встречает одинокий файлик task.elf, радующий весьма разносторонним функционалом:

https://forum.antichat.xyz/attachmen...1054239698.png

Конечно, первые 2 пункта выглядят интересно, но что-то подсказывает, что интересней всего будет выбрать пункт 3:

https://forum.antichat.xyz/attachmen...1054342030.png

У нас появился какой-то mood, явно не соответствующий реальному, и программа зажилила нам флаг. Так что ковырнём её с помощью IDA:

https://forum.antichat.xyz/attachmen...1054516550.png

А тут всё на ладони, под каждую опцию есть своя функция, вызываемая в зависимости от введённого нами символа. И нас, в первую очередь, интересует функция get_flag():

https://forum.antichat.xyz/attachmen...1054955662.png

Здесь алгоритм следующий: сначала мы вводим ответ на вопрос "Do you want a flag?", после переменная change_moodсравнивается с единицей, и, если проверка пройдена, то нам дают флаг. Но что интересно: эта переменная нигде не меняется на единицу, а значит - нам самим придётся до неё добраться ручками. Вот её отображение в памяти:

https://forum.antichat.xyz/attachmen...1059151792.png

А вот переменная, которая соседничает с ней:

https://forum.antichat.xyz/attachmen...1059182424.png

И эта str- та самая переменная, которая используется для хранения ответа на вопрос "Do you want a flag?", она указана в fgets(13-я строка, 2 картинки назад). Между этими метками в секции .bss никаких больше нет, но обратите на адреса этих меток:
Код:

0x4AA0C0
для strи
Код:

0x4AB0B0
для change_mood. Посчитайте разность, и вы получите число 4080- именно столько символов нам нужно занести в качестве ответа, чтобы следующий перезаписывал change_mood. Попробуем пронести строку вида
Код:

"a" * 4080 + "b"
, чтобы увидеть, возымеет ли эффект эта попытка. Подобную строку легко написать на питоне:

https://forum.antichat.xyz/attachmen...1059621641.png

Дебажить это дело я буду из-под WSL, в IDAсоответствующий пункт "Remote Linux Debugger" и небольшая настройка с IP и портом. Копируем получившуюся строку и в процессе дебаггинга вставляем это дело на место str:

https://forum.antichat.xyz/attachmen...1060736211.png

А теперь глянем в память:

https://forum.antichat.xyz/attachmen...1060824539.png

Сработало! Теперь change_moodхранит в себе символ 'b', или, десятеричным числом, 98. Но нам-то нужно, чтобы там была единица! А если посмотреть в таблицу ASCII-символов, то
Код:

chr(1) == CTRL+A
(да-да, такие комбинации - отдельные символы). Заметьте, если попытаться ввести питоновский "\x01", то это лишь будут 4 соответствующих символа. Поэтому воспользуемся методом, который описан здесь - вставим 4080символов
Код:

а
, а затем... Просто нажмём
Код:

CTRL+A
!

https://forum.antichat.xyz/attachmen...1061242899.png

И снова сработало! Теперь всё, что нам осталось сделать - подключиться через netcatи проделать всё то же самое:

https://forum.antichat.xyz/attachmen...1061361627.png

Получилось, таск решён! И, казалось бы, всё круто - но я не указал вам один момент. Внимательного читателя этот райтап смутил одним моментом:

https://forum.antichat.xyz/attachmen...1061479041.png

В fgetsстоит ограничение на 4000символов! Тем не менее, нам удалось пробросить аж 4081символ... Странный, какой-тоPWN, не находите?

Когда я увидел это ограничение, я, конечно, огорчился, поняв, что мне не хватает 81 символа, но всё же попробовал, можно сказать - попытал удачу. И каково же было моё удивление, когда сработало!

А оказалось всё интересно: спасибо @yetiraki - он подсказал, что fgetsоказался самописной функцией. И действительно - второй аргумент в её псевдокоде мелькает лишь в проверке на неотрицательность, и больше нигде. Полагаю, как такового ограничения по символам эта функция вообще не имеет...

Кстати, после того, как зарешал, придумал, как можно запускать программу, не копируя пейлоад в 4000 символов:

Код:

python3 -c "print('3\n' + 'a'*4080 + '\x01')" | ./task.elf
https://forum.antichat.xyz/attachmen...1066686012.png

Будет вполне удобно решать у себя на машине!

Штош, надеюсь, этот небольшой райтап помог вам в нашей нелёгкой стезе.

Удачного пывына!

made 4@rev_with_da_boys


Время: 16:58