RailAnnot

PWN medium

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("