Files
2025-12-22 05:19:38 +03:00

2.3 KiB
Raw Permalink Blame History

Разбор, исходя только из 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):

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. Считаем пароль и флаг

Используем найденный логин:

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}