![]() |
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Код:
0x4AB0B0Код:
"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Код:
аКод:
CTRL+Ahttps://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Будет вполне удобно решать у себя на машине! Штош, надеюсь, этот небольшой райтап помог вам в нашей нелёгкой стезе. Удачного пывына! made 4@rev_with_da_boys |
| Время: 16:58 |