일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 워게임
- C++
- 시그널
- 컴퓨터구조
- css
- 시스템해킹
- 드론
- 리눅스
- Pwnable.kr
- Bandit
- radare2
- px4
- 어셈블리어
- 취약점
- 시스템 프로그래밍
- C언어
- 알고리즘
- 프로그래밍
- kernel
- pwn.college
- 리눅스 커널
- 리버싱
- Leviathan
- write up
- 커널
- 시스템
- pwncollege
- 시스템프로그래밍
- 리눅스커널
- wargame
- Today
- Total
Computer Security
#12 컴퓨터의 데이터표현 2 본문
프로그램 기본 구조
.MODEL SMALL
-메모리 모델을 정의한다. Small의 경우 데이터 세그먼트와 코드 세그먼트가 각각 하나씩 존재하는데, 대부분의 실습용으로 충분하다.
.DATA, .CODE
-데이터 세그먼트와 코드 세그먼트를 나타내는 어셈블리어 지시어
.PROC
-프로시저의 시작을 나타내는 지시어. RPOC 앞에는 프로시저의 이름이 들어간다.
.ENDP
-프로시저의 끝을 나타내는 지시어. ENDP 앞에 프로시저의 이름이 들어간다.
.END
-전체 프로그램의 끝을 나타내는 지시어
-END 다음에 들어가는 인수는 옵션이지만, 대부분의 경우 프로그램의 시작지점이 되는 첫 번째 프로시저의 이름(ex. main) 이 들어간다.
프로그램 실행의 종료
-INT(interupt) 21H(0x21) 는 AH로 수행할 인터럽트 서비스 루틴(ISR)을 지정(어떤 루틴을 실행할지 function code를 지정한다.) 하여 호출하는 명령이다. ISR은 일반적으로 OS에서 제공한다.
OS는 응용 프로그래머가 직접 구현하기 까다로운 입출력이나 각종 시스템과 연관된 루틴들을 제공한다.
-AH의 값이 0x4C일 때는 프로그램의 종료를 요청하며, AL의 값이 프로그램의 반환 코드로 이용된다.
-일반적으로 정상종료를 나타낼 때 0을 사용한다.
AX 반으로 쪼개서 AH, AL 나누는데 AH는 function코드, AL은 반환코드로 쓰인다.
MOV AH, 4CH ; 처리 종료 요청
MOV AL, retcode ; 반환 코드 설정
INT 21H ; ISR 호출
ex) (대부분의 어셈블러들은 대소문자 구분하지않는다.)
.model small ; 메모리 모델 정의
.stack 100h ; 스택 영역을 바이트 단위로 할당
.data ; 데이터 세그먼트
;변수 정의
.code ; 코드 세그먼트
main proc
;main 프로시저의 코드 작성
;...
; 프로그램 종료
mov ax, 4c00h
int 21h
main endp
; 다른 프로시저 정의
end main
식별자 규칙
-식별자(identifier)는 프로그램에서 참조할 항목을 표현하기 위해 사용하는 이름이다.
-식별자는 이름(name)과 레이블(label) 두 가지 유형으로 구분된다.
이름(name) : COUNTER과 같이 데이터 항목의 주소를 참조한다.
COUNTER DB 0
레이블(label): 다음 문장의 MAIN과 B30처럼 명령어, 프로시저, 또는 세그먼트의 주소를 참조한다.
MAIN PROC FAR
B30: ADD BL, 25
데이터 정의 지시어
정의 바이트크기 구형 신형
바이트 1 DB BYTE
워드 2 DW WORD
이중워드 4 DD DWORD
삼중워드 6 DF FWORD
사중워드 8 DQ QWORD
10바이트 10 DT TBYTE
정수 상수와 기수법
-정수 데이터를 기술할 때는 십진수 상수 외에도 이진수나 팔진수, 십육진수도 사용 가능하며, 이들 숫자의 진법을 구분하기 위해 MASM은 기수 지정자(redix specifier)를 제공한다. 기수 지정자는 숫자 상수뒤에 접미사 형태로 붙는다.
이진수: b/y (y는 MASM 6.0부터 도입)
ex) 10101100b , 110110y
팔진수: o/q
ex) 42o, 42q
십진수:d/t(십진수 상수의 경우 기수 지정자는 옵션, t는 MASM 6.0부터 도입)
ex) 100, 123d, 456t
십육진수:h
ex)10h, 0abh
-십육진수 상수의 경우 맨 앞이 알파벳인경우 십육진수 숫자가 아니라 식별자로 인식될 수 있기 때문에 A~F로 시작하는 상수의 경우 그 앞에 0을 붙이도록 한다.
ex) ABH -> 0ABH
배열
-배열은 메모리 공간상에 연속적으로 배치된 데이터들의 집합이다.
-어셈블리어에서 배열은 데이터들을 콤마(,)로 구분하여 나타낸다.
ex)
.data
arr1 db 21h, 22h, 23h, 24h, 25h
arr2 dw 1260h, 8589h
문자와 문자열
-문자나 문자열은 따옴표(' 또는 ") 기호를 사용한다. 큰 따옴표("")와 작은 따옴표('') 모두 사용할 수 있다.
-따옴표 안에 들어가는 문자들은 어셈블러에 의해 ASCII 코드 값으로 변환되어 프로그램에 저장된다.
-ASCII 코드는 한 문자당 1바이트 크기를 가지므로, 바이트 배열로 표현할 수 있다.
ex)
.data
str1 db 'Hellow, World!'
-> 48 65 6C 6F 2C 20 57 6F 72 6C 64 ...
반복 카운트: DUP
-DUP를 이용하면 단순 반복되는 상수들을 쉽게 기술가능하다.
[이름] Dn 반복_카운트 DUP(수식)
ex)
.data
arr1 db 3 dup(10h) ; 10h 를 3개 반복
arr2 db 3 dup(5 dup(0abh)) ; abh를 15개 반복
초기화되지 않은 변수
-물음표(?) 기호를 이용하면 해당 메모리 영역을 초기화하지 않은 상태로 둘 수있다.
var1 db ?
var2 db 10 dup(?)
위와 같이 DUP에 ? 기호를 사용할 수도 있다.
기호 상수
등호 지시어: 이름에 수식 값을 배정한다. 등호 기호(=) 는 같은 이름에 여러번 사용할 수 있다.
EQU 지시어: 동치 지시어로, 단 한 번만 사용 가능하다. 예를 들어, 어셈블러는 FACTOR라는 심볼을 12로 변환한다.
ex) (재정의 불가)
FACTOR equ 12
;FACTOR equ 22; 해당 문장은 오류를 발생시킨다.
TEXTEQU 지시어: MASM 6.0은 텍스트 데이터를 재정의하기 위해서 TEXTEQU지시어를 도입했다.
이름 TEXTEQU <텍스트>
ex)
PROMPT_MSG TEXTEQU <'add, Change, or Delete?'>
USER_PROMT DB PROMPT_MSG
-> USER_PROMT DB 'add, Change, or Delete?'
PROMPT_MSG 가 TEXTEQU를 거치면, 'add, Change, or Delete?' 로 변환된다.
INT 명령어
-소프트웨어 인터럽트. BIOS나 DOS에 있는 인터럽트 서비스 루틴(ISR)을 호출한다.
-INT 다음에는 인터럽트의 종류를 나타내느 숫자 값을 기술한다.
ex) INT 10h 는 비디오 서비스, INT 16h는 키보드 서비스, INT 21h는 MS-DOS 서비스를 호출한다.
INT 21H
-DOS에서 제공하는 서비스 루틴을 호출한다.
-운영체제는 입출력, 파일 처리, 메모리 관리 등 프로그래머가 직접 구현하기 까다로운 저수준 영역의 루틴들을 제공한다.
-DOS에서 제공하는 ISR의 종류도 다양하므로, 이를 지정하기 위해서 AH 레지스터 값을 이용한다.
ex) 그 값으로 4CH를 지정할 경우, 실행 중인 프로세를 종료하는 서비스 루틴을 호출한다.
MOV 명령어
-데이터 전송 명령어다. MOV dest, src 형태로 쓴다.
ex) AH 레지스터에 4CH 값을 적재하기 위해서는 다음과 같이 코드를 작성한다.
MOV AH, 4CH
LEA 명령어
-Load Effective Address: 유효 주소 적재
-메모리 변수의 오프셋 주소를 레지스터에 적재(load)하는 명령어다.
-LEA dest, src 형태로 쓴다.
ex) 문자열 str1의 시작 주소를 DX에 적재하려면 다음과 같이 코드를 작성한다.
LEA DX, str1
데이터 세그먼트 레지스터 DS의 초기화
-데이터 세그먼트를 사용하려면, 프로그램 시작 부분에 데이터 세그먼트의 시작주소를 나타내는 레지스터인 DS의 값을 초기화 하는 코드를 넣어야 한다.
-데이터 세그먼트의 주소를 나타내는 특수 기호로 @data가 있다.
DS 초기화 코드
MOV AX, @data
MOV DS, AX
'컴퓨터구조&어셈블리어' 카테고리의 다른 글
#14 산술 및 논리 연산 명령어2 (0) | 2022.05.28 |
---|---|
#13 산술 및 논리 연산 명령어1 (0) | 2022.05.27 |
#11 컴퓨터의 데이터 표현 (0) | 2022.05.25 |
#10 x86 구조 (어셈블리 프로그램의 구성) (0) | 2022.05.22 |
#9 x86구조 (주소지정방식) (0) | 2022.05.21 |