2021. 11. 23. 22:10ㆍdreamhack[드림핵]/Reverse Engineering
Instruction Format
Instuction Format
명령어를 구성하는 두 개의 큰 요소인 명령 코드(Opcode)와 피연산자(Operand)에 대해 공부하자
Opcode (Operation Code)
명령 코드(Opcode, Operation Code)는 명령어에서 어떤 동작을 할지 나타내는 부분 산술 연산, 자료 제어 등
다양한 명령어 코드가 있다.
Opcode(Operation Code)
기계 코드(Machine Code) 또는 명령 코드(Opcode)
바이너리로 구성되어 있으며 CPU가 실제로 수행할 작업을 숫자로 나타냄
어셈블리 코드(Assembly Code)
- 숫자로 이뤄져 있는 명령어 코드는 사람이 구분하고 이해하기 쉽지 않다. 그래서 이것이 어떤 의미를 갖는지 알아보기 쉽도록 문자로 작성된(Mnemonic) 코드이다. 명령 코드와 1:1 대응된다. 또한 피연산자를 알아보기 쉽다.
명령 코드와 피연산자를 묶어 하나의 명령어(Instruction)가 됨
- CPU의 동작을 그대로 옮긴 것이라 매우 직관적이고 매우 단순하여 고차원적인 전체 흐름을 파악하기 어렵다.
Operand
명령 코드가 작업을 수행할 대상을 피연산자(Operand)라고 한다.
Intel 방식의 어셈블리를 읽을 때에는 명령 코드에 따라 연산한 결과를 왼쪽 피연산자에 저장된다고 이해하는 것이 일반적이다. 피연산자를 어떻게 지정해 줄 것인지는 그 값을 사용할 방식에 따라 다양하다
Operand Types
주어진 명령 코드의 피연산자로는 상수, 레지스터, 혹은 레지스터가 가리키고 있는 메모리의 어떤 주소가 올 수 있다.
상수값(Immediate)
피연산자로 사용되는 값이 상수인 경우
아래의 예시를 보면 mov 명령어의 피연산자 중 하나로 0xbeef가 사용됨
레지스터
피연산자로 사용되는 값이 레지스터인 경우
아래의 예시를 보면, mov 명령어의 결과로 rbx에 들어가는 값이 rcx에 들어가게 됨
Addressing Modes
피연산자로 사용되는 값이 레지스터에 저장된 메모리 주소를 참조한 값인 경우
- [reg]
아래의 첫 번째 예시를 보면, mov 명령어의 결과로 rax에 들어있는 값을 rcx 레지스터가 참조하는 주소의 메모리에
저장 두 번째 예시에서 사용된 byte ptr은 Pointer Directive라고 하며, 앞서 공부한 Data Size가 실제 어셈블리 코드가 사용된 케이스 즉, rax 레지스터가 저장하고 있는 값 중 하위 8bit, 즉 1byte만 rxc가 참조하는 주소에 저장
레지스터의 값이 메모리의 주소로 바로 쓰이기도 하는 반면, 레지스터에 들어있는 값에서 특정 오프셋(offset)만큼 떨어진 주소 값을 참조하기도 한다.
- [reg+d]
레지스터에 들어있는 값을 주소의 기준으로 하여 d만큼 떨어진 오프셋을 실제로 참조한 다음 피연산자로 쓴다.
아래의 세 번째 예시를 보면, rax레지스터에 들어있는 값을 저장할 때 rbp의 값을 참조한 메모리 주소에 바로 넣는
것이 아니라, 그 메모리 주소로부터 -0x1C 떨어진 곳을 계산하여 넣는다. 여기서도 등장하는 Pointer Directive를
고려하면, DWORD에 해당하는 사이즈인 하위 4byte만 넣는 것을 알 수 있다.
- [reg1+reg2]
한 레지스터에 들어있는 값과 다른 레지스터에 들어있는 값을 더한 결과를 참조할 메모리 주소로 사용하는 경우
- [reg1 + reg2*i+d]
아래 예시중 네 번째를 보면 rdi레지스터에 담긴 주소를 기준으로, rcx레지스터의 값을 단위로 하여 4 단위 떨어진
곳에 다시 offset 3만큼 더한 주소를 실제로 참조하고 있다. 여기에 1byte 사이즈의 값인 0xff가 저장됨
reg2에 해당하는 레지스터에 담긴 값은 대게 자료형이나 구조체의 크기인 경우가 많다.
지금까지 명령어를 이루는 명령 코드와 피연산자에 대해서 공부했다. 이제 어셈블리 코드를 이해하기 위해 각종 명령 코드에 대해 종류별로 알아보자
'dreamhack[드림핵] > Reverse Engineering' 카테고리의 다른 글
6일차 (x64dbg 사용법) (0) | 2021.11.26 |
---|---|
5일차 (Hello World 어셈블리 분석) (0) | 2021.11.25 |
4일차 (0) | 2021.11.24 |
2일차 (0) | 2021.11.22 |
1일차 (0) | 2021.11.21 |