36 lines
2.1 KiB
Markdown
36 lines
2.1 KiB
Markdown
<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}`
|