Files
2026-09-17 00:50:07 +03:00

42 lines
2.2 KiB
Markdown
Raw Permalink 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">Orchid Wallet</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>
В раздатке есть неподписанный IPA финансового клиента `OrchidWallet.ipa`. В бинаре находится зашифрованный конфиг, а в поддельном provisioning profile — ключ к нему. Начинаем с распаковки IPA как ZIP.
## Решение
В `Payload/OrchidWallet.app/` находим Mach-O `OrchidWallet` для arm64 и `embedded.mobileprovision`. В бинаре есть отдельная секция `__DATA,__orchid` с маркером `ORCHIDCFG`.
Сразу за сигнатурой лежат четыре байта длины в little-endian, затем зашифрованный блок. Сохраняем его отдельно — это весь конфиг, а не исполняемый код.
Переходим к `embedded.mobileprovision`. Среди текста находим запись `KeyHint=<слово-из-букв-и-дефисов>`. Значение после `=` используется как повторяющийся XOR-ключ:
```python
import json
import re
import zipfile
with zipfile.ZipFile("public/OrchidWallet.ipa") as ipa:
data = ipa.read("Payload/OrchidWallet.app/OrchidWallet")
profile = ipa.read("Payload/OrchidWallet.app/embedded.mobileprovision")
pos = data.index(b"ORCHIDCFG") + len(b"ORCHIDCFG")
size = int.from_bytes(data[pos:pos + 4], "little")
blob = data[pos + 4:pos + 4 + size]
key = re.search(rb"KeyHint=([A-Za-z-]+)", profile).group(1)
plain = bytes(b ^ key[i % len(key)] for i, b in enumerate(blob))
config = json.loads(plain)
print(config["flag"])
```
Mach-O содержит зашифрованные данные, а профиль из того же пакета даёт ключ для их расшифровки. На выходе получается JSON с полем `flag`.
[Солвер](solve/solve.py).
## Флаг
`caplag{ios_modules_staged_then_cleaned}`