Files
Serdtse-Sysoly/qualifiers/copycache-runner-pwn-hard/WRITEUP.md
T
2026-09-17 00:50:07 +03:00

46 lines
2.7 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">CopyCache Runner</h1>
<p align="center">
<img src="https://img.shields.io/badge/category-PWN-blueviolet" alt="PWN"/>
<img src="https://img.shields.io/badge/difficulty-hard-critical" alt="hard"/>
</p>
Раннер сборки прошивок загружает шаблон политики подписи в кеш и проверяет его перед запуском задания. На диске шаблон менять нельзя, но для запуска важна именно копия в памяти. В ELF `copycache-runner` ищем, какие поля открывают экспорт и кто может их перезаписать.
## Решение
Смотрим расположение полей кешированной политики.
| Смещение | Поле | Что нужно для запуска |
|---:|---|---|
| 0 | `name[16]` | На проверку не влияет |
| 16 | `flags` | `0x4558504f` |
| 20 | `job` | `0x26050613` |
| 24 | `checksum` | `flags ^ job ^ 0xa5a5a5a5` |
После загрузки `job` уже правильный, а `flags` равен нулю. Поэтому прямой вызов `run sealed job` заканчивается `policy denied`.
В меню есть операция `AEAD_COPY`. Она принимает смещение и 32-битное слово, проверяет только попадание записи внутрь всей структуры, после чего выполняет:
```c
memcpy((char *)&cache + off, &word, 4);
```
Граница структуры соблюдается, но служебные поля внутри неё доступны для записи наравне с остальными данными. Для экспорта меняем разрешение и пересчитываем контрольную сумму.
```python
flags = 0x4558504f
job = 0x26050613
checksum = flags ^ job ^ 0xa5a5a5a5
```
Через `3) AEAD_COPY` пишем `flags` по смещению `16`, затем `checksum` по смещению `24`. Если хочется проверить себя, `2) show cached policy` показывает новые значения.
При выборе `4) run sealed job` сервис проверяет разрешение на экспорт, номер задания и контрольную сумму в кеше. Изменённая политика проходит проверки, и сервис выдаёт флаг. Файл шаблона на диске при этом остаётся прежним.
[Солвер](solve/solve.py).
## Флаг
`caplag{copy_cache_changed_policy_without_touching_disk}`