어셈블러(Assembler) : 0과 1로 이루어진 기계어를 사람이 좀 더 쉽게 이해할 수 있도록 통역해주는, 일종의 번역기
역어셈블러(Disassembler) : 기계어로 구성된 소프트웨어를 넣으면 어셈블리 코드로 변역해준다.
# 어셈블리 언어 (Assembly Language)
기계어와 치환되는 언어
- 기계어의 종류에 따라 어셈블리 언어도 다르다. 다양한 ISA가 존재하므로 그만큼의 어셈블리 언어 종류가 있다.
> x64 어셈블리 언어
- 명령어(Opcode, Operation Code)와 피연산자(Operand)으로 구성된다.
ex) mov eax, 3 >> mov:대입 / eax에 3을
- 명령어 Opcode
데이터 이동, Data Transfer | mov, lea |
산술 연산 , Arithmetic | inc, dec, add, sub |
논리 연산 , Logical | and, or, xor, not |
비교 , Comparison | cmp, test |
분기 , Branch | jmp, je, jg |
스택 , Stack | push, pop |
프로시져 , Procedure | call. ret, leave |
시스템 콜 , System call | syscall |
* 이외에도 더 많은 명령어들이 존재한다.
그리구 이건 MIPS지만.... 2020.10.09 - [about COMPUTER/컴퓨터 시스템] - # 02. MIPS의 ISA
- 피연산자 Operand
- 상수 (immediate value)
- 레지스터 (register)
- 메모리 (memory)
- 크기 종류
- BYTE : 1byte
- WORD : 2byte *호환성을 위해 WORD자료형을 2byte로 유지
- DWORD : 4byte
- QWORD : 8byte
ex) DWORD PTR [0x8048000] : 0x8048000의 데이터를 4바이트만큼 참조
WORD PTR [rax] : rax가 가르키는 주소에서 데이터를 2바이트만큼 참조
> 명령어
+ 데이터 이동 : 어떤 값을 레지스터나 메모리에 옮긴다
- mov dst, src : src에 들어있는 값을 dst에 대입
- lea dst, src : src의 유효 주소(Effective Address, EA)를 dst에 저장
+ 산술 연산
- add dst, src : dst에 src의 값을 +
- sub dst, src: dst에서 src의 값을 -
- inc op: op의 값을 1 증가
- dec op: op의 값을 1 감소
+ 논리 연산 : 비트연산 지시
- and dst, src: dst와 src의 비트가 모두 1이면 1, 아니면 0
- or dst, src: dst와 src의 비트 중 하나라도 1이면 1, 아니면 0
- xor dst, src: dst와 src의 비트가 서로 다르면 1, 같으면 0
- 동일한 값으로 xor연산을 두번하면 원래 값으로 돌아간다.
- not op: op의 비트 전부 반전
+ 비교 연산 : 두 피연산자의 값을 비교하고 플래그 설정
- cmp op1, op2: op1과 op2를 비교
- test op1, op2: op1과 op2를 비교
+ 분기 연산 : rip을 이동시켜 실행 흐름을 바꾼다.
- jmp addr: addr로 rip를 이동
- je addr: 직전에 비교한 두 피연산자가 같으면 점프 (jump if equal)
- jg addr: 직전에 비교한 두 연산자 중 전자가 더 크면 점프 (jump if greater)
+ 스택 :
- push val : val을 스택 최상단에 쌓음
- pop reg : 스택 최상단의 값을 꺼내서 reg에 대입
+ 프로시저 : 특정 기능을 수행하는 코드 조각
- 반복되는 연산을 대체하여 코드의 크기를 줄이고
- 코드 조각에 이름을 붙여 코드의 가독성이 높아진다.
- call addr : addr에 위치한 프로시져 호출
- leave: 스택프레임 정리
- ret : return address로 반환
* call을 통해 코드부분을 호출할 때 원하는 코드 부분을 실행하고 난 뒤에는 원래 실행 흐름(순서)로 돌아와야하므로 call명령어 다음 명령어의 주소를 스택에 저장해놓고 rip를 call을 통해 호출할 코드부분으로 옮긴다.
** 스택 프레임 : 함수별로 사용할 스택의 영역을 명확히 구분해주는 것
- 스택은 함수별로 임시 값들을 저장하는 영역으로 아무런 구분없이 사용하게 되면 서로 다른 두 함수가 같은 메모리 영역을 사용할 수 있어 스택 프레임을 사용하여 영역을 구분해야한다.
+ 시스템콜 : 유저 모드에서 커널 모드의 시스템 소프트웨어에게 어떤 동작을 요청하기 위해 사용
- 커널 모드
- 운영체제가 전체 시스템을 제어하기 위해 시스템 소프트웨어에 부여하는 권한
- 유저 모드
- 시스템 콜
[ 참조 ]
본 페이지는 드림핵(dreamhack.io)의 시스템 해킹 로드맵, STAGE2를 정리한 글입니다.
'about Security > 시스템 해킹' 카테고리의 다른 글
[드림핵] Linux Memory Layout (0) | 2022.03.26 |
---|---|
[드림핵] Computer Architecture (0) | 2022.03.26 |
댓글