[Stage 4] 어셈블리어
#어셈블리어 #어셈블러 #역어셈블러
- 어셈블리 언어(Assembly Language) : 컴퓨터 세계에서 통용되는 기계어의 난해한 점을 개선하기 위해 고안된 기계어보다 이해하기 쉬운 언어.
- 어셈블러(Assembler) : 일종의 통역사로, 개발자가 어셈블리어로 코드를 작성하면 컴퓨터가 이해할 수 있는 기계어로 번역해주는 프로그램.
- 역어셈블러(Disassembler) : 기계어를 어셈블리어로 번역해주는 프로그램.
- x86-64 어셈블리어 문법 구조
> 구성요소 : 명령어(Operation Code)-동사에 해당, 피연산자(Operand)-목적어에 해당
- 인텔의 x64 주요 명령어
> 데이터 이동 : MOV, LEA
> 산술 연산 : INC, DEC, ADD, SUB
> 논리 연산 : AND, OR, XOR, NOT
> 비교 : CMP, TEST
> 분기 : JMP, JE, JG
> 스택 : PUSH, POP
> 프로시저 : CALL, RET, LEAVE
> 시스템 콜 : SYSCALL
- 피연산자
> 피연산자의 종류 : 상수, 레지스터, 메모리
> 크기 지정자 : TYPE PTR
*type의 종류 : BYTE(1바이트), WORD(2바이트), DWORD(4바이트), QWORD(8바이트)
[Stage 4] 명령 코드
#데이터이동 #산술연산 #논리연산 #비교 #분기 #스택 #프로시저
- 데이터 이동 명령어 : 어떤 값을 레지스터나 메모리에 옮기도록 지시
MOV dst, src : src에 있는 값을 dst에 대입
LEA dst, src : src의 유효 주소를 dst에 저장
- 산술 연산 명령어 : 덧셈, 뺄셈, 곱셈, 나눗셈 연산을 지시
ADD dst, src : dst에 src 값을 더함
SUB dst, src : dst에서 src 값을 뺌
INC op : op의 값을 1 증가시킴
DEC op : op의 값을 1 감소시킴
- 논리 연산 명령어 : and, or, xor, neg 등의 비트 연산
AND dst, src : dst와 src의 비트가 모두 1이면 1, 아니면 0
OR dst, src : dst와 src의 비트 중 하나라도 1이면 1, 아니면 0
XOR dst, src : dst와 src의 비트가 서로 다르면 1, 같으면 0
NOT op : op의 비트 모두 반전
- 비교 명령어 : 두 피연산자의 값을 비교하고 플래그 설정(연산 결과를 op1에 대입하지 않음)
CMP op1, op2 : op1과 op2를 비교. 두 피연산자의 값을 빼서 결과가 0이면(두 값이 같으면) ZF 플래그 설정.
TEST op1, op2 : op1과 op2를 비교. 두 피연산자에 AND 비트 연산 하여 결과가 0이면 ZF 플래그 설정.
- 분기 명령어 : RIP를 이동시켜 실행 흐름을 바꿈
JMP addr : addr로 RIP를 이동
JE addr : 직전에 비교한 두 피연산자 같으면 addr로 RIP를 이동(jump if equal)
JG addr : 직전에 비교한 두 피연산자 중 전자가 크면 addr로 RIP를 이동
- 스택 명령어 : 스택을 조작할 수 있음
PUSH val : val을 스택 최상단에 쌓음
POP reg : 스택 최상단의 값을 꺼내서 reg에 대입
- 프로시저 명령어 : 프로시저의 호출과 반환
*프로시저란? 특정 기능을 수행하는 코드 조각
CALL addr : addr에 위치한 프로시저 호출
LEAVE : 스택 프레임 정리
RET : return address로 반환
'드림핵' 카테고리의 다른 글
[드림핵 워게임] rev-basic-0 (1) | 2023.11.21 |
---|---|
[드림핵 Reverse Engineering] Stage 5 (0) | 2023.11.14 |
[드림핵 Reverse Engineering] Stage 3 (0) | 2023.09.20 |
[드림핵 Reverse Engineering] Stage 1,2 (0) | 2023.09.14 |
[드림핵 워게임] Apache htaccess (0) | 2023.09.01 |