일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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++
- pwn.college
- 알고리즘
- radare2
- C언어
- 시스템프로그래밍
- 리눅스
- px4
- 취약점
- 시스템 프로그래밍
- 시그널
- 어셈블리어
- 시스템해킹
- 시스템
- wargame
- css
- Pwnable.kr
- 커널
- pwncollege
- 리눅스 커널
- 워게임
- 리눅스커널
- write up
- 리버싱
- kernel
- Leviathan
- 드론
- 컴퓨터구조
- 프로그래밍
- Bandit
- Today
- Total
Computer Security
#10 x86 구조 (어셈블리 프로그램의 구성) 본문
메모리 모델
-작성되는 프로그램의 코드와 데이터의 크기를 나타내기 위해 사용되며, 사용자는 프로그램 코드와 데이터의 크기에
해당하는 메모리 모델을 어셈블러에게 알려줘야 한다.
-어셈블러에게 세그먼트를 사용하는 방법, 목적 코드를 위한 충분한 공간을 제공하는 방법, 최적의 실행 속도를 보장하기 위한 방법 등을 알려준다.
-메모리 모델에는 Tiny, Small, Medium, Compact, Large, Huge, Flat 등이 있다.
-Tiny는 주로 .com 프로그램에 대해 사용된다.
-Flat은 32비트 보호모드에서 사용되는 메모리 모델이다.
.MODEL 메모리모델
SMALL : -한 세그먼트에 저장할 수 있는 코드
-한 세그먼트에 저장할 수 있는 데이터
MEDIUM : -한 세그먼트 이상에 저장할 수 있는 코드
-한 세그먼트에 저장할 수 있는 데이터
COMPACT : -한 세그먼트에 저장할 수 이쓴ㄴ 코드
-한 세그먼트 이상에 저장할 수 있는 데이터
LARGE : -한 세그먼트 이상에 저장할 수 있는 코드와 데이터
-64KB 이하의 배열
HUGE : -한 세그먼트 이상에 저장할 수 있는 코드와 데이터
-64KB 이상이 되는 배열
.com 과 .exe
-둘의 중요한 차이: 프로그램의 크게, 세그먼트, 초기화
-.com 프로그램이 다소 기본적으로 제약이 많았던 초기 마이크로컴퓨터 시대에 뿌리를 두고있다.
-.com 프로그램은 명령어와 데이터 모두에 대해서 한 개의 세그먼트를 사용한다. 따라서 프로그램의 크기는
PSP(Program Segment Prefix)를 포함하여 최대 64KB로 크기가 제한된다.(메모리 모델로 tiny를 사용한다.)
-.com 프로그램은 PSP, 스텍, 데이터, 코드 세그먼트를 한 개의 코드 세그먼트로 결합한다. 따라서 .exe보다 단순한 구조를 가지고 있다.
-.exe 프로그램은 여러 개의 세그먼트를 가질 수 있다. .exe는 코드와 데이터, 스택을 서로 다른 세그먼트에 유지한다.
32비트 확장
80386(1985)
-최초의 IA-32 계열 프로세서
-32비트 레지스터와 32비트 데이터 버스, 32비트 주소 버스
-세그먼트:오프셋 주소 대신 32비트 선형 주소 사용
다양한 구동 모드 제공
-실제 주소 모드: 8086에서 사용하는 방식. 싱글 태스크, 20비트 주소를 사용
-보호모드: 멀티태스킹, 각 프로세스에는(물리 메모리 크기와 관계없이) 4GB의 선형 주소 공간 부여(가상메모리), 프로세스가 다른 프로세스의 코드와 데이터를 침범하는 것을 방지(메모리 보호)
-가상-8086모드: 보호모드 환경에서 DOS 프로그램과 같은 실제 주소 모드 소프트웨어를 실행할 수 있는 모드
확장된 레지스터
-레지스터가 32비트로 확장됨에 따라 기존의 레지스터 앞에 Extended라는 의미의 E를 붙여 EAX, EBX, ECX, EDX라는 이름으로 접근 가능하게 되었다.
간접 주소지정방식 확장
-8086에서는 간접 주소지정을 위해 베이스 레지스터 BX, BP와 인덱스 레지스터 SI와DI를 사용할 수 있었다.
-80386부터는 범용 레지스터 EAX, EBX, ECX, EDX 모두를 간접 주소지정을 위해 사용할 수 있다.
-배율 인자(scale factor)를 사용하여 오프셋을 계산하는 방법을 제공
-OFFSET VALUE = BASE + INDEX * SCALE FACTOR + DISPLACEMENT
data
array D DWORD 100h, 200h, 300h, 400h
code
MOV ESI, 3
MOV EAX, arrayD[ESI*4]
'컴퓨터구조&어셈블리어' 카테고리의 다른 글
#12 컴퓨터의 데이터표현 2 (0) | 2022.05.26 |
---|---|
#11 컴퓨터의 데이터 표현 (0) | 2022.05.25 |
#9 x86구조 (주소지정방식) (0) | 2022.05.21 |
#8 x86 구조 (레지스터 구조) (0) | 2022.05.20 |
#7 x86의 구조 (역사) (0) | 2022.05.19 |