Init. Commit
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
<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}`
|
||||
Reference in New Issue
Block a user