일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- node.js ec2
- Apache Benchmark
- html tag
- SMS sandbox
- 이것이 자바다
- HTML
- PostgreSQL CAST
- Foreign Key (외래 키)
- filezilla
- COALESCE함수
- aws sdk v3
- sns 샌드박스 종료
- HTML 태그
- 스트레스툴
- sms 샌드박스
- 자바
- Primary key(기본 키)
- npm 글로벌 설치 삭제 했는데 실행됨
- sms 휴대폰 인증
- EC2
- sql 데이터 추가
- sql 데이터 삽입
- node.js ec2 배포
- AWS SDK for JavaScript v3
- npm 전역 설치 삭제
- node.js
- Java
- node.js ec2 ip접속
- Apache ab
- ab 벤치마크
- Today
- Total
망각에 재주 있는 나를 위해 기록하는 곳.
[리버싱] 어셈블리 기초 정리 본문
표현방식
어셈블리어는 정해진 표준이 없다.
대표적으로 AT&T와 Intel 문법이 있다.
둘의 공통점은 Opcode와 Operand(Operand1, Operand2)로 표현한다.
Opcode는 명령어이다. Operand는 인자값(피연산자)이다.
AT&T와 Intel의 차이가 있다.
Intel은 Operand2가 source Operand고, Operand1이 destination Operand이다. 즉 Operand2를 Operand1에 더하는 것이다.
AT&T는 그 반대로 Operand1이 source Operand고, Operand2가 destination Operand이다. 즉 Operand1을 Operand2에 더하는 것이다.
외에도 둘이 조금씩 표현에 차이가 있다.
- 숫자
Intel: 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 (우리가 알고 있는 숫자 그대로 표기)
AT&T: $1, $2, $3, $4, $5, $6, $7, $8, $9, $0 (숫자에 $가 붙은 형태)
- 레지스터
Intel: rax, rbx, rcx, rdx (레지스터 이름 그대로 사용)
AT&T: %rax, %rbx, %rcx, %rdx (앞에 %가 붙은 형태)
- 메모리 주소
Intel: [EAX]
AT&T: (EAX)
- offset
Intel: [EAX + 4]
AT&T: 4(EAX)
Opcode
PUSH
POP
MOV
LEA
ADD
SUB
INC
DEC
CMP
CALL
RET
NOP
레지스터
EAX(Extended Accumulator Register)
EBX(Extended Base Register)
ECX(Extended Counter Register)
EDX(Extended Data Register)
ESI(Extended Source Index)
EDI(Extended Destination Index)
ESP(Ectended Stack Pointer)
EBP(Extended Base Pointer)
여기서 하나 알아두면 좋을 것이
위에 레지스터는 모두 E가 붙어있다. E를 떼고 보면 AX, DX, CX 등 레지스터는 16bit 크기의 레지스터이다. 이후 32bit로 발전하면서 앞에 E(Extended)가 붙게 된것이다. 또 후에 64bit로 발전됨에 따라 앞에 R이 붙게 된다.
고로 앞에 어떤 글자가 붙었는지에따라 몇bit 크기의 레지스터인지 구분할 수 있다.
'리버싱' 카테고리의 다른 글
[리버싱] IAT (0) | 2022.05.03 |
---|---|
[리버싱] 섹션 헤더, 섹션 데이터 (0) | 2022.05.03 |