Files
Serdtse-Sysoly/qualifiers/modbus-mirror-native-c-reverse-medium/WRITEUP.md
T
2026-09-17 00:50:07 +03:00

42 lines
2.2 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">Modbus Mirror</h1>
<p align="center">
<img src="https://img.shields.io/badge/category-Reverse-blueviolet" alt="Reverse"/>
<img src="https://img.shields.io/badge/difficulty-medium-orange" alt="medium"/>
</p>
В раздатке есть диагностическая утилита `modbus_mirror`, написанная на C для PLC/Modbus-контура. Внутри находится зеркальная таблица ladder-регистров с сервисным ключом. Начинаем с разбора данных, которые использует утилита.
## Решение
В Ghidra или IDA видим `validate_frame`, проверку CRC16 и обработку регистров. Рядом со строками и кодом валидации встречаются `MMIRCFG` и `modbus-mirror`. Первый похож на сигнатуру контейнера, второй используется как XOR-ключ.
Разметка блока оказывается такой:
```text
MMIRCFG | длина u32 LE | зашифрованный JSON
```
Длина нужна, чтобы отделить полезные данные от остального ELF. Находим маркер, читаем размер и берём ровно соответствующий фрагмент:
```python
from pathlib import Path
import json
data = Path("public/modbus_mirror").read_bytes()
pos = data.index(b"MMIRCFG") + len(b"MMIRCFG")
size = int.from_bytes(data[pos:pos + 4], "little")
blob = data[pos + 4:pos + 4 + size]
key = b"modbus-mirror"
plain = bytes(b ^ key[i % len(key)] for i, b in enumerate(blob))
print(json.loads(plain)["service"])
```
После XOR получаем JSON с зеркалом регистров. Поле `service` содержит сервисный ключ — это и есть флаг. Логика Modbus помогла найти место использования конфига, но генерировать корректные кадры для решения не требуется.
[Солвер](solve/solve.py).
## Флаг
`caplag{ladder_registers_reflected_the_service_key}`