# Reverse 10 — Редстоуновый шеллкод

## Флаги

- **Флаг 1:** `vsosh{3ncrypt3d_by_st3v3}`
- **Флаг 2:** `vsosh{d3crypt3d_by_y0u}`

---

## Этап 1: blob1

`main` выделяет RWX-страницу через `mmap`, копирует `blob1_encrypted` (27 байт), XOR-ит с `0x42`, вызывает как функцию.

После расшифровки blob1:
```
C3          ; ret  (сразу возвращается)
<26 байт>   ; "vsosh{3ncrypt3d_by_st3v3}\0"  ← флаг 1
```

Флаг 1 не выводится — нужно найти его в памяти после расшифровки.

**Статически:** извлечь `blob1_encrypted` из бинаря (виден в Ghidra), XOR с `0x42`.

**Динамически (GDB):** брейкпоинт после XOR-цикла → `x/s $rax+1`.

## Этап 2: blob2

`blob2_encrypted` (161 байт) расшифровывается введённым ключом (cycling XOR).
Без флага 1 blob2 остаётся мусором → краш при вызове.

После расшифровки blob2 — shellcode с хэшем Хорнера:
```
acc = 0
for i in 0..7: acc = (acc * 31 + input[i]) & 0xFFFF
if acc == 0x8592: print flag2
```

Флаг 2 хранится внутри blob2 XOR'd с `0x92` — патч `jne` даст мусор.

Ответ: `enderman` → хэш `0x8592`.
