보안에 관심이 많으시군요.
결론부터 말씀드리면 바이너리 리버스엔지니어링은 어셈블리가 기본입니다. 기초적인 수준의 리버싱을 하실 줄 안다고 하시니 어느정도 어셈블리를 보셨을 것이라 기대됩니다.
어셈블리 명령어는 자주 사용되는 것이 많지 않습니다. 전문가라도 잘 알고 있는 어셈블리 명령어는 100개도 안됩니다. 다만 어셈블리 명령어가 단순 명령어 하나로 의미하는 바가 크지 않습니다. 여러줄의 어셈블리 명령어가 조합되어야 하나의 기능이 됩니다.
중요한 것은 리버싱이라는 말 자체가 의미하는 바 대로 어셈블리 코드 자체를 이해하는 것보다는 원래의 코드(컴파일 이전)의 코드로 얼마나 정확히 복원하느냐 입니다. 컴파일러를 잘 생각해보면, 컴파일러는 고수준 언어의 코드를 특정 어셈블리 코드 세트로 변환을 시킵니다. 즉, 변수선언, for문, if문, 함수호출 등 고수준 프로그래밍 언어의 기능들이 특정한 어셈블리 코드로 변환됩니다. 그리고 컴파일러마다 그 패턴이 동일합니다.(대부분의 컴파일러가 거의 비슷합니다.) 이 패턴만 알고 있다면 역으로 어셈블리 코드세트의 패턴을 보고 변수선언인지, 함수호출인지, for문인지 뭘 하는 것인지 쉽게 유추할 수 있습니다. 잘 하는 리버서는 이 패턴을 아주 다양하게 알고 있는 것에 불과 합니다.
다시 한번 결론을 말씀드리자만 리버싱은 어셈블리 언어에 익숙해야 합니다. 하지만 어셈블리 언어 자체가 중요한 것은 아니고 어셈블리 코드로 변환되기 전에 어떤 코드로 부터 나왔는 지 파악하는 것이 중요합니다. 즉, 고수준의 언어에서 어떤 식으로 프로그래밍을 하는 지 먼저 이해해야 이것이 어떤 어셈블리 코드세트로 변환되는 지 패턴을 알 수 있기 때문에 고수준의 언어를 먼저 잘 익히시고, 이것들이 어셈블리 코드로 어떻게 컴파일 되는 지 연구해보시기를 추천드립니다.