Разбор, исходя только из `caplag-crackme.apk` ## 1. Достаём логин из ресурсов 1. Распаковать APK или открыть в jadx: в `res/values/strings.xml` лежат строки `p0..p9`. 2. Склеиваем их: `EBUUBQ5JHhYGHQwOXREBERIMHV0N`. 3. Это Base64. Декодируем → байты. 4. В Java-коде (видно через jadx) эти байты XOR-ятся с ключом `"stdio.h"`. XOR даёт логин: ``` caplagveryeasyreverse ``` Быстрая проверка в консоли (при наличии python): ```bash python - <<'PY' import base64 chunks = ["EBU","UBQ","5JH","hYG","HQw","OXR","EBE","RIM","HV","0N"] data = base64.b64decode("".join(chunks)) key = b"stdio.h" print(bytes(b ^ key[i % len(key)] for i, b in enumerate(data)).decode()) PY ``` ## 2. Реверс native-проверки (libcrack.so) В `lib/*/libcrack.so` JNI-функция `checkAndGetFlag` выполняет: 1. `expected_pwd_raw = SHA256(login + "cryptoanalyzator")` 2. `key = SHA256(login + "s3cr3t_s@lt_42")` 3. `enc = AES-256-CBC(no padding, IV = 00 11 22 ... EE FF)`, шифрует `expected_pwd_raw`. 4. Сравнивает `enc` с константой `CIPHER_PASS`; сходится только при правильном логине. 5. Проверяет, что введённый пароль — hex(expected_pwd_raw) длиной 64 (регистр не важен). 6. Флаг: `caplag{ SHA256("Console.Readline();" + login + password_hex) }`. Нужные константы все видны в дизасме/строках `.so`. ## 3. Считаем пароль и флаг Используем найденный логин: ```bash python - <<'PY' import hashlib login = "caplagveryeasyreverse" pwd_hex = hashlib.sha256((login + "cryptoanalyzator").encode()).hexdigest() print("login :", login) print("pass :", pwd_hex) flag = hashlib.sha256((b"Console.Readline();" + login.encode() + pwd_hex.encode())).hexdigest() print("flag :", f"caplag{{{flag}}}") PY ``` Итоговые значения: - Логин: `caplagveryeasyreverse` - Пароль: `7dc1b259bd1ad518e41cca334fca14bd03139a2c0b3566036efe6d2bbb43df4c` - Флаг: `caplag{ae98661c54fb5d0d2e769d21a23d4802c7a24eb98741680949ddb6ed9d8f3e53}`