보안/리버스 엔지니어링 2

[리버스 엔지니어링] x86 Assembly(2)

이 포스트에서는 운영체제의 핵심 자료구조인 스택, C언어의 함수에 대응하는 프로시저와 관련된 명령어를 소개하겠다.여러 레지스터가 별도의 설명없이 들어갈 것이기 때문에 이 포스트에서 사용하는 레지스터를 간단하게 정리해보았다.레지스터이름역할ripInstruction Pointer다음 실행할 명령어 주소raxAccumulator Register계산, 함수 리턴값 등 범용 사용rspStack Pointer스택 최상단 위치rbpBase Pointer함수 스택 프레임 기준점이 레지스터들을 잘 기억해두자 1. 스택들어가기 전에 간략하게 스택이 뭔지 설명하고 가겠다. 쉽게 말해서 나중에 넣은게 먼저 나오는 구조의 자료 저장소이다.push는 스택에 데이터를 넣는 것이고 pop은 스택에서 데이터를 꺼내는 것이다. 밑에서 ..

[리버스 엔지니어링] x86 Assembly(1)

1. Disassembler Disassembler를 이해하기 위해서는 먼저 assembler를 이해해야한다. 이는 밑에 사진으로 설명을 대체한다. 리버스 엔지니어링에서는 어셈블러에 역발상을 더해 역어셈블러(Disassembler)를 개발했다. 이는 어셈블러와 반대로 기계어를 어셈블리 언어로 번역한다. 대표적인 CPU 아키텍처의 명령어 집합 구조(Instruction Set Architecture, ISA)인 x86-64를 비롯하여 대중적으로 많이 사용되는 아키텍처들은 인터넷에서 역어셈블러를 구하기 매우 쉽다. 여러 ISA가 있지만 우리는 x86-64을 다룰 예정이다. 2. x86-64  x86-64 == x64 라고 생각해도 괜찮다. 우선 명령어 구조부터 살펴보겠다. 이 구조는 기본적으로 명령어(ope..