ch@e
Published 2023. 3. 11. 17:32
어셈블리어 System & Reversing 필기

 

어셈블리어(assembly language) 또는 어셈블리 언어

기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어이다. 전류가 흐르고 안 흐르고로 표현되는 0과 1의 이진수 기계어는 인간의 관점에서 컴퓨터가 바로 읽을 수 있다는 점을 빼면 장점이 없는 언어이기 때문에 이를 보완하기 위해 나온 언어가 어셈블리어이다. 기계어와 명령어가 1:1로 대응되는 단어들로 구성되어 있다. 컴퓨터 구조에 따라 사용하는 기계어가 달라지며, 따라서 기계어에 대응되어 만들어지는 어셈블리어도 각각 다르게 된다. 컴퓨터와 가까운 언어(저급어)이기 때문에 컴파일을 해도 간단한 명령어로 이루어져 있어서 실행 속도가 빠르지만 배우기가 어렵고 유지보수가 힘들다는 이유로 자주 사용되지 않고 있다. 하지만 임베디드 시스템이나 커널 프로그래밍, 컴퓨터 보안 등 어셈블리어를 알아야 하고 디버깅이 불가능한 라이브 서비스를 진행하고 있는 황경에서 어느 정도 디버깅을 할 수 있게 해주게 한다. 

 

 

어셈블리어에서 자주 사용하는 명령어 (주로 intel 문법 사용으로 intel 정리)

명령어 예제 설명 분류
push push eax eax의 값을 스택에 저장 스택 조작
pop pop eax 스택 가장 상위에 있는 값을 꺼내서 eax에 저장 스택 조작
mov mov eax, ebx 메모리나 레지스터의 값을 옮길때 사용 데이터 이동
inc lnc eax eax의 값을 1증가시킨다 (++) 데이터 조작
dec dec eax eax의 값을 1감소시킨다 (--) 데이터 조작
add add eax, ebx 레지스터나 메모리의 값을 덧셈할때 쓰인다. 논리, 연산
sub sub eax, ebx 레지스터나 메모리의 값을 뺄셈할때 쓰인다. 논리, 연산
call call proc 프로시저를 호출한다. 프로시저
ret ret 호출했던 바로 다음 지점으로 이동 프로시저
cmp cmp eax, ebx 레지스터와 레지스터의 값을 비교 비교
jmp jmp proc 특정한 곳으로 분기 분기
int  int $0x80 OS에 할당된 인터럽트 영역을 system call 인터럽트
nop nop 아무 동작도 하지 않는다. (No Operation)

 

 

 

 

어셈블리어 문법

어셈블리어 문법에는 Intel 문법, AT&T 문법이 있다. 서로 호환은 불가능하며, Intel 방식은 가독성이 좋고, 윈도우 환경에서 구동한다. 반대로 AT&T 문법은 가독성이 intel 문법에 비해 가독성이 떨어지고 리눅스 환경에서 구동한다. 

 

 

 

intel 문법

라벨: <명령어> <피연산자1> <피연산자2> ;주석

 

라벨: 명령어의 집합, 명령어 또는 데이터의 주소를 나타낸다. 

           기계어로 직접 번역이 되지 않는다.

 

명령어: 위 명령어 표처럼 push, pop 등의 동작 지시

 

피연산자: 명령어의 피연산자, 레지스터, 숫자, 문자, 메모리 주소 등

 

주석: 앞에 ;문자를 붙여 주석처리

 

숫자를 그대로 사용한다. ex) 1, 2, 3, 4, 5

•대체로 간단하고 접두사나 접미사가 붙지 않는다.

•16진수에는 접두사 h, 2진수 데이터에는 접두사 b를 가진다. ex) int 80h

•목적지 오퍼랜드(연산의 대상)가 앞, 원본 오퍼랜드가 뒤로 온다. ex) instr dest, src

 

 

 

 

AT&T 문법 

라벨: <명령어> <%제1피연산자 <%제2피연산자>;주석

 

숫자 앞에 접두사 $를 붙여서 사용한다. ex) $!, $2, $3, $4, $5

•레지스터는 접두사 %를 가진다. 

 

 

 

Intel 문법  vs  AT&T

[접두사]

mov eax,1

movl #1, %eax

 

mov ebx, 0ffh

movl $0xff, %ebx

 

int 80h

int $0x80

 

 

[오퍼랜드]

instr dest, src

instr src, dest

 

mov eax, [ecx]

movl %ecx, %eax

 

 

[접미사]

mov al, bl

movl %bl, %al

 

mov ax, bx

movw %bx, %ax

 

mov eax, ebx

movw %ebx, %eax

 

mov eax, dword ptr[ebx]

movl (%ebx), %eax

 

 

 

 

 

 c언어                                                                   어셈블리어 

#include<stdio.h>
int main() {


     int a = 1;
     int b = 2;
     int c = a + b;

     printf("%d", c);
}


push ebp
mov ebp,esp
sub esp,0E4h
push ebx
push esi
push edi
lea edi,[ebp+FFFFFF1Ch]
mov ecx,39h
mov eax,0CCCCCCCCh
rep stos dword ptr es:[edi]
mov ecx,9AC003h
call 009A1316
mov dword ptr [ebp-8],1
mov dword ptr [ebp-14h],2
mov eax,dword ptr [ebp-8]
add eax,dword ptr [ebp-14h]
mov dword ptr [ebp-20h],eax
mov eax,dword ptr [ebp-20h]
push eax push 9A7D08h
call 009A10CD
add esp,8 xor eax,eax
pop edi
pop esi
pop ebx
add esp,0E4h
cmp ebp,esp
call 009A123F
mov esp,ebp
pop ebp ret

 

 

 

 

 

그 외 다양한 어셈블리어 참조:  [Assembly] 어셈블리어 명령어 총정리 (tistory.com)

 

[Assembly] 어셈블리어 명령어 총정리

명령어 Data Transfer 명령어 설명 MOV Move 데이터 이동 (전송) PUSH Push 오퍼랜드의 내용에 스택을 쌓는다. POP Pop 스택으로부터 값을 뽑아낸다. XCHG Exchange Register / memory with Register 첫번째 오퍼랜드와 두

coding-factory.tistory.com

 

'System & Reversing 필기' 카테고리의 다른 글

DLL  (0) 2023.03.12
어셈블리 핸드레이, 함수 프롤로그와 에필로그  (0) 2023.03.11
컴퓨터 메모리 구조  (0) 2023.03.11
아키텍쳐  (0) 2023.03.10
고급 언어, 저급 언어, 기계어  (0) 2023.03.10
profile

ch@e

@ch@e

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그