I’d like to paste a guide to becoming a full stack reverse engineer by one of my favorite reverse engineers, Cody “Daeken” Brocious:
1) Read: Reversing by Eldad Eilam
2) Learn Assembly (atleast one architecture)
2a) Do: write some C, compile it, disassemble, hand-decompile to C.
2b) Have a friend write and compile some C, then disassemble and hand-decompile it and have friend check your work
3) Do: Pick a game. Reverse-engineer its archive format and write an unpacker
4) Do: Reverse-engineer the 3d model format for a game
5) Read: The Dragon Book (Compilers by Aho et al)
7) Do: Write an assembler
8) Do: Write a compiler from some language down to assembly
9) Read: Reverse Compilation Techniques by Cifuentes
10) Do: Write a decompiler for CIL and/or Dalvik bytecode
11) Do: Write a decompiler for ARM (doesn’t have to be ARM, but it’s consistent and relatively sane)
12) Read: The osdev wiki, until your eyes can’t focus anymore
13) Do: Write a toy kernel
14a) Do: Write it again, with slightly less suck
14b) Do: Port your kernel to a different platform
15) Do: Pick a well-known platform and write an interpreting emulator
15a) Do: Add a recompiler
16) Do: Pick a slightly-unknown platform
16a) Read: Everything you can find about it.
16b) Do: Begin writing an emulator.
16c) Read: All the assembly you can find, for bits that aren’t known.
17) Keep Learning & Practicing.