리버싱이란?
: 프로그램의 소스구조를 역으로 파악하는 것
고급언어가 기계어로 번역되는 과정
- 전처리
: 컴파일러가 소스코드를 어셈블리어로 컴파일 하기 전에 필요한 형식으로 가공하는 과정
- 컴파일
: C로 작성된 소스코드를 어셈블리어로 번역하는 과정
- 어셈블
: 컴파일로 생성된 어셈블리어 코드를 ELF형식의 Object file로 변환하는 과정
오브젝트 파일로 변환이 되면 어셈블리코드가 기계어로 번역된다
Gcc에서 -c 옵션을 통해 목적파일로 변환이 가능
- 링크
: 여러 목적 파일들을 연결하여 바이너리로 만드는 과정. 링크를 하면 실행가능한 프로그램이 완성
- EXE파일
역분석은 이 반대 과정을 수행한다
컴퓨터 구조
- 컴퓨터가 효율적으로 작동하도록 하드웨어 및 소프트웨어의 기능을 고안하고 이들을 구성
- X86-64 및 x64의 아키텍쳐 : 레지스터
1. 범용 레지스터 : eax, ebx, ecx, edx
- 세그먼트 레지스터
- 명령어 포인터 레지스터
- 플래그 레지스터
범용 레지스터
- eax : 곱셈과 나눗셈 명령에 사용, 함수의 리턴값이 저장
- ebx : ESI나 EDI와 결합하여 인덱스에 사용
- ecx : 반복 명령어에서 카운터로 사용된다
- edx : 부호 확장 명령
- esp : stack point
- ESI : 데이터를 조작하거나, 복사시에 소스 데이터의 주소가 저장
- EDI : 복사시에 목적지의 주소가 저장
세그먼트 레지스터
- 6가지의 세그먼트 레지스터 : CS, DS, ES, FS, GS
- 각 레지스터의 크기는 16비트
명령어 포인터 레지스터
- CPU가 어느 부분의 코드를 실행하는지 가리킨다
- X64에서는 rip
플래그 레지스터
- 프로세서의 현재 상태를 저장하고 있는 레지스터
- CF : carry flag 부호 없는 수의 연산결과가 비트의 범위를 넘을 경우 설정됨
- ZF : zerro flag 연산의 결과가 0일 경우 1로 설정
- SF : sign flag 연산의 결과가 음수일 경우 설정
- OF : overflow flag 부호있는 수의 연산 결과가 비트 범위를 넘을 경우 설정됨

모든 변수들은 같은 메모리 공간을 사용한다
- AX에 E21F를 대입하면?
: AH에 E2가 AL에 1F가 저장된다
- EAX에 1234 0000을 대입하고 그 후에 AL에 12를 대입하면?
: AH에 1234, AL에 0000이 들어가고 AL에 다시 12가 들어가니 AL에는 최종적으로 0012가 저장
어셈블리어 구조

어셈블리어 명령어 정리

출처: https://aistories.tistory.com/12
*AX의 값은 얼마?

1. THIS로 점프한다
2. AX에 1을 대입
3. FUNC을 호출
4. AX에 2를 대입
5. 리턴
6. AX와 2를 비교 -> AX - 2 = 0 이므로 ZF는 1