RailAnnot
RailAnnot обрабатывает служебные аннотации PDF-нарядов. В раздатке есть ELF `railannot`. У объекта аннотации 16-битный счётчик ссылок, а у страницы — отдельный указатель на него. Если счётчик обнулится при переполнении, объект освободится, но указатель страницы продолжит ссылаться на него.
## Решение
Создаём аннотацию через `1) load annotation`: `refs = 1`. Затем `2) attach annotation to page` добавляет вторую ссылку, и `refs` становится равен `2`.
Пункт `3) replay stream references` прибавляет произвольное `n`:
```c
ann->refs = (uint16_t)(ann->refs + n);
```
При нуле объект освобождается, но `page_ref` не обнуляется. Передаём `65534` и получаем `2 + 65534 = 65536`, что в `uint16_t` превращается в `0`. Аннотация удалена, страница продолжает держать висячий указатель.
В `4) allocate replacement cache object` выделяется блок того же размера. Заполняем его поддельной аннотацией:
```python
import struct
payload = struct.pack("