README
Max Mirkin
Cybersecurity director in Toronto. I run security programs and still build the tools they depend on.
My resume is locked behind this crackme. check_key is a small ARM routine running on an emulated Cortex-M0 right in your browser. Reverse it, find the key, and the resume unlocks.
Not here to debug? Skip straight to the resume.
How to play
- Type any guess as the key and press Enter. It will be denied.
- Press s to step through the code and watch the registers change.
- Work out what
check_keywants, then run that key.
Hints
Level 1 of 3: Warm-up
check_key() looks at your key one byte at a time. Find out what each byte must be.
No hints used yet. Each one gives a little more away.
CPU Cortex-M0
Code level1.elf · .text 0x08000000–0x0800005c
- 08000000; void _start(void)
- 08000000_start:
- 080000004801ldrr0, ; [pc, #4] @ 0x08000008
- 08000002f000 f80bbl
- 08000006df00svc#0; exit(r0)
- 0800000820000000.word; 0x20000000
- 0800000c; size_t strlen(const char *s)
- 0800000cstrlen: ; XREF: check_key+0x4↓
- 0800000c0001movsr1, r0
- 0800000eloc_0800000e: ; XREF: strlen+0x8↓
- 0800000e780aldrbr2, [r1]
- 080000103101addsr1, #1
- 080000122a00cmpr2, #0
- 08000014d1fbbne
- 080000161a08subsr0, r1, r0
- 080000183801subsr0, #1
- 0800001a4770bxlr; return
- 0800001c; int check_key(const char *key)
- 0800001ccheck_key: ; XREF: _start+0x2↑
- 0800001cb510push{r4, lr}
- 0800001e0004movsr4, r0
- 08000020f7ff fff4bl
- 080000242807cmpr0, #7
- 08000026d117bne
- 0800002878e0ldrbr0, [r4, #3]
- 0800002a2874cmpr0, #0x74
- 0800002cd114bne
- 0800002e7820ldrbr0, [r4]
- 080000302868cmpr0, #0x68
- 08000032d111bne
- 0800003479a0ldrbr0, [r4, #6]
- 080000363830subsr0, #0x30
- 080000382802cmpr0, #2
- 0800003ad10dbne
- 0800003c7860ldrbr0, [r4, #1]
- 0800003e2875cmpr0, #0x75
- 08000040d10abne
- 080000427960ldrbr0, [r4, #5]
- 080000442872cmpr0, #0x72
- 08000046d107bne
- 0800004878a0ldrbr0, [r4, #2]
- 0800004a286ecmpr0, #0x6e
- 0800004cd104bne
- 0800004e7920ldrbr0, [r4, #4]
- 080000502865cmpr0, #0x65
- 08000052d101bne
- 080000542001movsr0, #1
- 08000056bd10pop{r4, pc}; return
- 08000058loc_08000058: ; XREF: check_key+0xa↑, check_key+0x10↑, …
- 080000582000movsr0, #0
- 0800005abd10pop{r4, pc}; return
Registers
- r0
- r1
- r2
- r3
- r4
- r5
- r6
- r7
- r8
- r9
- r10
- r11
- r12
- sp
- lr
- pc
Flags:N=0Z=0C=0V=0
Stack sp = 0x20001000
- empty
Dump
2000000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00................
2000001000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00................
2000002000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00................
2000003000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00................
2000004000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00................
2000005000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00................
2000006000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00................
2000007000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00................