2.1 KiB
ProxyRewrite
ProxyRewrite проверяет правила переписывания URL. Передаём образец, замену и исходную строку. Результат записывается в буфер output[64]. В ELF proxyrewrite видно, что длинную замену копируют без проверки размера. Рядом лежат маршрут и флаг диагностики.
Решение
У задания три соседних поля:
| Смещение | Поле | Что записываем |
|---|---|---|
| 0 | output[64] |
64 байта заполнителя |
| 64 | route[48] |
/internal/diag и добивку |
| 112 | diag, 4 байта |
0x50525859 |
В rewrite() каждое совпадение match в target заменяется всей строкой replace. Чтобы запись была предсказуемой, задаём match = A и target = A, тогда замена выполнится ровно один раз.
Собираем замену по смещениям полей:
import struct
route = b"/internal/diag"
payload = b"B" * 64
payload += route.ljust(48, b"C")
payload += struct.pack("<I", 0x50525859)
Всего 116 байт. Они заполняют output, записывают диагностический путь в начало поля route и выставляют diag.
В пункте 2) simulate rewrite последовательно передаём A, payload и снова A. После переписывания выбираем 3) dispatch rewritten request. Сервис обрабатывает запрос в диагностической ветке и возвращает флаг.
Флаг
caplag{rewrite_converter_crossed_into_the_route}