Files
Serdtse-Sysoly/finals/sortkey-station-pwn-easy/WRITEUP.md
T
2026-09-17 00:50:07 +03:00

36 lines
2.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<h1 align="center">SortKey Station</h1>
<p align="center">
<img src="https://img.shields.io/badge/category-PWN-blueviolet" alt="PWN"/>
<img src="https://img.shields.io/badge/difficulty-easy-brightgreen" alt="easy"/>
</p>
Складская станция сортирует этикетки и поддерживает старый формат ключей `+POS.C`. В ELF `sortkey-station` находим приведение позиции к знаковому 16-битному числу. Большая положительная позиция после него превращается в отрицательное смещение.
## Решение
При проверке старого ключа сервис обращается к `key_buf + (int16_t)pos` и сравнивает строку по этому адресу с `SORT-EXPORT`. Если подобрать `pos`, чтение уйдёт перед началом ключа — в профиль партии, содержимое которого можно задать.
Нужная область находится за 32 байта до `key_buf`. В 16-битной арифметике:
$$65504 - 65536 = -32.$$
Значит, подходит ключ `+65504.0`. Теперь размещаем строку допуска в профиле:
```python
profile = b"A" * 64 + b"SORT-EXPORT"
legacy_key = b"+65504.0"
```
Строка допуска начинается после 64 байт заполнения в профиле, по смещению `-32` от начала `key_buf`.
В `1) set batch profile` отправляем профиль, затем в `2) set legacy sort key` задаём `+65504.0`. Вызываем `3) dry-run sort`, чтобы сервис проверил допуск, и забираем результат через `4) export station batch`.
Проверка читает `SORT-EXPORT` из подставленного профиля и принимает его за разрешение на экспорт. В ответе получаем флаг.
[Солвер](solve/solve.py).
## Флаг
`caplag{legacy_sort_pointer_found_the_batch_grant}`