Init. import
This commit is contained in:
13
Caplag-Crackme-Reverse/README.MD
Normal file
13
Caplag-Crackme-Reverse/README.MD
Normal file
@@ -0,0 +1,13 @@
|
||||
## Информация для участников
|
||||
> Ну что, любимые реверсеры, вот вам обычный и "очень простой" таск :D
|
||||
Всего-то надо вбить **логин** и **пароль** в Android-приложение и получить флаг
|
||||
Ничего сложного: логин где-то спрятан, пароль как-то проверяется... да и вообще, всё уже лежит у вас под носом
|
||||
|
||||
## Выдать участникам
|
||||
для участников: public/caplag-crackme.apk
|
||||
|
||||
## Решение
|
||||
райтап - solve/solve.md
|
||||
|
||||
## Флаг
|
||||
`caplag{ae98661c54fb5d0d2e769d21a23d4802c7a24eb98741680949ddb6ed9d8f3e53}`
|
||||
52
Caplag-Crackme-Reverse/solve/solve.md
Normal file
52
Caplag-Crackme-Reverse/solve/solve.md
Normal file
@@ -0,0 +1,52 @@
|
||||
Разбор, исходя только из `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}`
|
||||
|
||||
Reference in New Issue
Block a user