티스토리 뷰
오늘은 어셈블리어 명령어 중 많이 쓰이는 MOV, 산술 연산, JMP, CMP, 조건 분기, PUSH, POP, CALL, RET 명령어에 대해서 쉽게 배워보는 시간을 가져보겠습니다.
MOV 명령어
MOV 명령어는 데이터를 저장하거나 레지스터 간 이동을 수행합니다. 이 레지스터는 CPU 내부에 존재하는 메모리 공간으로, 데이터를 저장하거나 처리할 때 사용됩니다. MOV 명령어는 MOV 명령어 뒤에 저장하고자 하는 데이터와 대상 레지스터를 입력하는 것으로 사용할 수 있습니다.
위 코드는 5라는 값을 갖는 AX 레지스터를 생성합니다. 즉 AX 레지스터에 5라는 값을 저장하는 역할을 합니다.
산술 연산 명령어
CPU에서는 수학적 연산을 처리할 수 있는 명령어가 포함되어 있습니다. ADD, SUB, MUL, DIV 명령어는 각각 덧셈, 뺄셈, 곱셈, 나눗셈을 수행하며, 산술 연산이 필요한 CPU 작업에서 활용됩니다.
위 코드는 먼저 5라는 값을 갖는 AX 레지스터를 생성합니다. 그다음에 ADD 명령어로 AX 레지스터에 10을 더하여 AX 값은 15가 됩니다.
JMP 명령어
JMP 명령어는 무조건 점프하는 명령어입니다. CPU가 해당 부분으로 정확히 점프하여 원하는 명령어를 실행할 수 있습니다.
위 코드는 JMP 명령어를 사용해 LOOP_START 라벨로 점프합니다. CPU가 LOOP_START 라벨에서 실행하는 명령어로 이동하게 됩니다.
CMP 명령어
CMP 명령어는 비교 연산을 수행하는 명령어입니다. 해당 명령어는 CPU가 두 개의 레지스터나 메모리 위치에 저장된 값을 비교하고, 두 값이 같은지 또는 서로 다른지를 판단합니다.
위 코드는 먼저 AX 레지스터에 10을 저장하고 BX 레지스터에 20을 저장합니다. 그 후에 CMP 명령어를 통해 AX 레지스터와 BX 레지스터를 비교합니다. 만약 AX 레지스터의 값이 BX 레지스터의 값보다 작을 경우 CPU는 JLE 명령어를 통해 다음 명령어로 이동합니다.
조건 분기 명령어
JZ, JNZ, JE, JNE, JL, JLE, JG, JGE 명령어는 조건 분기 명령어로, 비교 연산 결과에 따라 다음 명령어를 수행할지를 결정합니다. 예를 들어, JZ는 CMP 명령어로 두 값이 같은 경우에만 JZ 이후의 명령어를 수행합니다.
위 코드는 먼저 AX 레지스터에 10, BX 레지스터에 20이 저장됩니다. CMP 명령어를 통해 AX레지스터와 BX 레지스터의 값을 비교하고 만약 AX 값이 BX의 값보다 크면 CPU는 PRINT_AX 라벨로 점프하게 됩니다. PRINT_AX 라벨에서는 AX를 출력합니다. 그리고 JMP 명령어를 통해 END 라벨로 이동하게 됩니다.
PUSH, POP 명령어
명령어 PUSH, POP 명령어는 스택(stack)에 데이터를 저장하거나 꺼내오는 명령어입니다. 스택은 경량화된 메모리 구조 중 하나로, 데이터의 저장 및 처리를 용이하게 할 수 있습니다.
위 코드는 PUSH 명령어로 AX 레지스터의 값을 스택에 저장합니다. 그리고 POP 명령어로 스택에 저장된 값을 BX 레지스터로 가져옵니다.
CALL 명령어
CALL 명령어는 서브루틴(subroutine)을 호출하는 명령어입니다. 서브루틴은 CPU 안에서 동작하는 프로그램 단위로, 여러 번 호출될 수 있고 회귀적인 구조를 가질 수 있습니다.
위 코드는 CALL 명령어로 SUBROUTINE을 호출합니다. SUBROUTINE에서는 CX 레지스터에 10이 저장되고 RET 명령어를 사용해 CALL 이후의 다음 명령어로 이동합니다.
RET 명령어
RET 명령어는 서브루틴에서 반환하는 명령어입니다. CALL 명령어로 호출된 서브루틴에서 RET 명령어를 만나면 임시로 할당된 스택 메모리를 반환하고, CALL 명령어가 위치한 다음 명령어로 이동합니다.
위 코드에서 RET 명령어는 서브루틴인 SUBROUTINE에서 실행됩니다. RET 명령어는 서브루틴이 종료되고 호출한 위치로 다시 돌아가게 됩니다. 즉 위 코드에서 CALL 명령어로 SUBROUTINE을 호출하고 SUBROUTINE에서 RET 명령어를 실행하면 CALL 이후에 있던 코드로 돌아가서 실행이 이어지게 됩니다.
'Reversing' 카테고리의 다른 글
[리버싱] 피카츄배구를 분석해보고 내 마음대로 제어하기! (0) | 2019.01.07 |
---|---|
[리버싱] 리버스 엔지니어링을 공부하는 이유는 무엇인가? (0) | 2019.01.07 |
[리버싱] 어셈블리어 난독화 프로그램을 만들어보자! [x86] (8) (0) | 2019.01.07 |
[리버싱] 지뢰찾기 게임을 리버싱 해보자! (1) | 2019.01.04 |
[리버싱] 어셈블리어 inc, cmp, test, dec, jcc, call, jmp 명령어를 알아보자! [x86] (7) (0) | 2019.01.03 |
- Total
- Today
- Yesterday
- vim
- 리눅스
- Sub
- nasm
- 사이버공격
- 터미널
- mov
- 치트엔진
- 리버스 엔지니어링
- system call
- 명령어
- 어셈블리어
- 어셈블리
- linux
- reversing
- 어셈블러
- call
- jmp
- 우분투
- instruction
- 리눅스 시스템 콜
- 논리연산
- cmp
- 해킹
- gdb
- add
- Push
- 리버싱
- ubuntu
- 스택
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |