농소
레지스터, INTEL 명령어 본문
1. 주소 Vs 메모리
c언어 -> 메모리에 직접 접근하여 사용함
자바, 파이썬, .. -> 메모리에 직접 접근(x)
- 포인터: 메모리에 대한 직접 접근이 가능
- 어셈블리: 변수를 선언해서 사용하지 않는다. / **메모리를 직접 사용을 함. 앞으로 계속 메모리 직접 사용
ex) segment .data , segment .text ..등 메모리를 직접 씀
1). 주소
- 메모리상의 위치
- 파일 오프셋과 동일한 의미 (메모리에서는 주소 파일에서는 오프셋이라고 부름)
- 정수
2). 메모리
- 데이터가 들어있는 실제 메모리
< nasm 문서 참고자료 >
[ ] = 해당위치상의 메모리(값)를 나타냄
< 주소와 메모리의 구분 hello.asm >
< 연산 사이즈를 지정 안해줬을때 발생하는 에러 >
string 같은경우 00(=NULL)으로 사이즈를 가늠할 수 있지만
숫자같은경우 크기를 가늠할 수 없으므로 항상 앞에 사이즈를 지정해 주어야 한다.
실습.1 c언어를 어셈블리 형태로 변환해보기
c언어
int a; // bss segment
int b;
int main()
{
scanf("%d", &a); // 주소 푸쉬 문자열 푸쉬 콜 scanf
scanf("%d", &b);
printf("a: %d\n", a );
printf("b: %d\n", b ); // extern scanf 메모리 푸쉬 문자열푸쉬 콜 printf
return 0;
}
< 어셈블리 코드로 작성한 코드 >
< 결과 값 >
INTEL IA32 Architecture
인텔이 지원하는 명령어 push,call등 // ARM, MIPS 등 cpu마다 지원하는 명령어가 다르다.
- register
- instruction set
1. Register - (사전적인 의미 = 컴터의 프로세서 내에서 자료를 보관하는 아주 빠른 기억장소)
- 아주 빠른 기억장소
- cpu가 사용하는 고속의 기억 장치
- (cpu에가장 가까이에있음) cpu칩내부에 존재
- 종류별로 존재
- 용도별로 여러개의 레지스터가 존재
입출력 속도
레지스터 >> 메모리(주 기억 장치) >> 보조 기억 장치(디스크, usb, ...)
레지스터 종류
1). 범용 레지스터: EAX, EBX, ECX, EDX
2). 포인터 레지스터: ESI, EDI, EBP, ESP, EIP
3). 플래그 레지스터: EFLAGS
4). 세그먼트 레지스터: CS, DS, SS, ES, ...
1) 범용 레지스터
EAX( Extended Accumulator Register ) 확장된 AX, 64bit면 RAX (REX E A X) 주로 연산용도로 쓰임
EBX( Base )
ECX( Counter ) 루프, 반복문 등
EDX( Data )
EBX,EDX - 보조적인 의미에 사용
앞에 E가 붙은 레지스터는 메모리 크기는 32bit 이다.
segment regiter = 16bit
EAX 32bit 전체 사용
AX 16bit 사용 (하위 8비트 사용 AL), (상위8비트 사용 AH)
2) 포인터 레지스터
- ESI, EDI, EBP, ESP, EIP 값들이 전부다 주소로 인식
ESI( Extended Source Index ) - 문자열 복사에 사용
EDI( Dst. ) - 문자열 복사에 사용
EBP( Base Pointer )
ESP( Stack )
EIP( Instruction )
3) 플래그 레지스터
- 플래그정보를 가지고있는것
- 프로세스에 대한 상태정보 32bit로 표현, 나타낸다.
4) 세그먼트 레지스터
- 각 세그먼트의 실제위치에 대한 정보를 가지고있음
앞으로 어셈블리 프로그래밍을 할때
데이터에 값을 저장할 때 2가지 방식으로 저장하면 된다.
1. 메모리에 저장(segment)
2. 레지스터에 저장(EAX, EBX, ...)
어셈블 코드로 예를들면
< 값을 저장하는 두가지 방법 >
2. - instruction set 명령어
1). 데이터 복사 : MOV
- int a = 10 // 10을 a에다가 복사해라
- ** 두 피연산자 모두 메모리가 올 수 없다.!!
- 상수는 항상 두번째 오퍼렌드에 와야함
< inter IA-32 메뉴얼 mov부분 >
문서 예) [MOV r/m8,r8 ] (1번째인자 8bit 레지스터나 메모리가 올수있다 , 2번째인자 8bit 레지스터만 올수있다 )
즉, 두 피연산자가 모두 메모리일 수 없다.
Move r8 to r/m8 두번째 피연산자가 첫번째 피연산자로 move한다.
이해를 돕기 위해 어셈블 코드로 설명하자면
< MOV 연산자 TEST >
< 두개의 피연산자가 모두 메모리이면 오류발생 >
실습. 입력값 서로 바꾸어 보기
#> ./io
10
20
a: 10
b: 20
#> ./io
10
20
a: 20
b: 10
'Security > System Hacking' 카테고리의 다른 글
asm 형변환, 관계연산, 제어문 (0) | 2018.01.18 |
---|---|
어셈블리 사칙연산(ADD, SUB, MUL, IMUL, DIV, IDIV), 비트연산, 논리연산 (0) | 2018.01.17 |
3. ELF파일 구조, nasm 데이터표현 (0) | 2018.01.13 |
2. 컴파일 과정, ELF 실행파일 (0) | 2018.01.12 |
1. linux 실습환경 설정 (0) | 2018.01.11 |