본문 바로가기
System_Security

02. 레지스트 개념

by Jnamelight 2017. 7. 15.

레지스트


어셈블러에서는 레지스터, 메모리를 이용한다!


더 자세하게 알기 위해서는 컴퓨터 CPU 의 구조에대해서 알아야한다 ( 레지스터 )

과연 어떤 레지스터가 사용되고 어떤식으로 사용되는지 공부해보자.




General-purpose registers. These eight registers are available for storing operands and pointers. 

Segment registers. These registers hold up to six segment selectors. 

EFLAGS (program status and control) register. The EFLAGS register report on the status of the program being executed       and     allows limited (application-program level) control of the processor. 

EIP (instruction pointer) register. The EIP register contains a 32-bit pointer to the next instruction to be executed.


일단 위와같이 크게 4가지로 나뉜다.


각각 범용 레지스터, 세그먼트레지스터 , 플레그 레지스터, Instruction 포인터 레지스터 으로 나뉜다.



가장 많이 사용되는 것은 범용 레지스터이다!


EAX — Accumulator for operands and results data

// 연산된 결과나, 연산을 위한 레지스터


EBX — Pointer to data in the DS segment

// 주소, 데이터세그먼트 주소 등을 표현


ECX — Counter for string and loop operations

// 횟수를 위한 레지스터 

EDX — I/O pointer

// 데이터 ( 입력 출력을 위한 포인터 ) 레지스터



하지만 정확하게 이런식으로 사용되지 않는다.

단지 암묵적 약속(?) 으로 이런식으로 사용하자~ 라는 메뉴얼


그래서 범용 레지스터 들이다.


따라서 용도를 파악하기 힘들다, 분석을 잘해야지 어떤 용도로 사용되는지 

알수가 있다!



범용 레지스터


EAX ( Extended Accumlator Register )

EBX ( Extended Base Register )

ECX ( Extended Counter Register )

EDX ( Extended Data Register )



포인터 레지스터


ESI ( Extended Source Index )

EDI ( Extended Dstination Index )

ESP ( Extended Stack Pointer  )

EBP ( Extended Base Pointer )

EIP ( Extended Instruction Pointer )



!! 주소를 다루는 레지스터들...



플래그 레지스터




!! 프로세스의 상태 정보를 저장하는 역할.




자 여기까지 레지스터의 종류를 알아보았다

그럼이제 레지스트를 사용할수 있는 명령어에 대해서 공부해보자.

가장 많이 사용되는 명령어는 Mov 명령어이다!


여기서 확인해 볼 수 있는 특징은


 - mov dst, src


dst : reg/mem

src : reg/mem/imm


!! dst, src 둘다 mem 올수가 없다!!!




예제


int num ;

int main(){

 num = 10;

 printf("num is : %d\n", num);    

}


위의 C로된 코드를 어셈블리로 코드를 작성해서 실행파일을 만들어보자!


순서대로 각각 필요한것 부터 생각해보면!


일단 세그먼트에 들어가야 하는 것들 부터 하나씩 생각해야 된다.


자 우리가 이용하는 세그먼트는 세가지이다


.data , .bss , .text




자 일단 위의 C 코드를 해석한되로 코드를 짜보았다.


각각의 세그먼트를 설명하면


.data : 출력할 문자열의 데이터를 넣어주었다

.bss : 초기화되지 않은 데이터 선언 ( 쉽게 변수만 선언 )

.text : 코드부분 ( 즉 코드가 실행되는 실질적인 부분 )


 여기서 main 을 보면 push 를 두번 해주었는대


이유는 printf 에서 인자가 두가지이 때문에 두번 넣어주었다!


하지만 에러가 난다... 이유는!



num 은 단지 주소의 값을 가지고 있을뿐


즉 전에 했던것은 주소의값에 또 값을 넣었기 떄문에 에러가 났다.


그러니 주소값을 메모리로 사용하기 위해서는 위와같이


포인터 형식으로 사용해주어야한다!!



그리고 또 중요한것!!


메모리를 만들어 주었지만 크기를 지정해주지 않았다.


위의 .bss 에서 resd 라고 크기를 지정해주었지만 코드 부분에서 다시 지정해주어야 하는

이유는 바로 num 은 시작주소 만을 가지고 있을 뿐이기 때문!!


즉 끝을 모른다....


그러니 크기를 다시 지정!


* 또 extern pritnf 해주어야한다! ( C 라이브러리 사용 하기 때문 )




완성된 코드이다


각각의 역할을 정확히 이해하고 코드를 짜야된다..


즉 분석을 잘하기 위해서는 방금과 같은 연습이 많이 필요하다고 한다!


열심히 연습해야겠다..!



컴파일을 완성시키면 위와같이 실행!





'System_Security' 카테고리의 다른 글

06. 프로세스 메모리 구조  (0) 2017.07.26
05. 분기문,반복문  (0) 2017.07.24
04. 비트연산자 & 형변환  (0) 2017.07.20
03. 어셈블리 사칙연산  (0) 2017.07.19
01. 프로그램의 개념  (0) 2017.07.14

댓글