농소

레지스터, INTEL 명령어 본문

Security/System Hacking

레지스터, INTEL 명령어

농소 2018. 1. 16. 02:50

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