Be myself :: Be myself (39 Page)

달력

112018  이전 다음

  •  
  •  
  •  
  •  
  • 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
  • 29
  • 30
  •  

기본 레지스터

Reversing 2014.05.04 01:48

 

개요

8086내부에서 사용하는 대표적인 레지스터들을 알아볼 것이다.

 

상세 분석

지금부터 대표적으로 사용되는 레지스터들을 알아 볼 텐데, 사실 여기에 정리한 내용은 대략적으로 익히고 디버그나 리버싱, 취약점분석 등 필요할때 마다 검색이나 서적을 통해 참조하다 보면 자연스럽게 익혀질 것이므로 억지로 외우려거나 할 필요는 없다고 생각한다. 32bit 시스템 기준이다. 

 

 

 

EAX- accumulator register라고 해서 산술,논리 연산의 중심이 되는 레지스터이다. 또 하나 중요한 역할을 하는데, 셸코드 작성시 시스템콜 번호를 넘기는 역할을 하기도 한다. 

EBX- 간접 번지 지정시 사용되는 레지스터이다. 베이스 레지스터로 주로 사용된다. 쉽게 말하자면 이 값을 참조해서 원하고자 하는 값을 참조하는 방식이다. 

ECX- counter register로 for문이나 while문 같은 루프문에서 반복수행하고자 하는 횟수를 지정할때 주로 사용된다. 

EDX - 곱셈이나 나눗셈 등의 보조 어큐뮬레이터로 사용되기도 한다. 

 

위의 4가지 레지스터에 대한 설명은 일반적인 쓰임이 그렇다는 것이지, 반드시 위의 용도로만 쓰이는 것은 아니다. 레지스터는 단지 값을 저장하는 메모리일 뿐이라는 사실을 기억하기 바란다. 

 

ESP(스택포인터)와 EBP(베이스 포인터)같은 경우는 스택프레임이 만들어 지는 과정을 다음에 살펴보면서 더 자세히 알아 보겠다. 간단히 설명하자면, EBP같은 경우, 지역변수의 참조를 위해 사용되고, ESP같은 경우 스택프레임의 제일 위의 주소값을 나타낸다. 

 

ESI, EDI - 연산이나 간접 번지 지정에 사용된다. 그밖에 주로 문자열 전송이나 비교 등을 하는 문자열관련 명령에서 SI는 source(대상)가 되는 문자열을, DI는 destination(목표)가 되는 문자열의 번지를 표시한다. 

 

이 외에는

EIP- 다음에 실행할 명령어 번지를 가리키는데, CS세그먼트 레지스터와 한 쌍이 되어 실행 번지가 만들어진다. 예를들어 0x0001[0x0003] 이라는 간접주소가 있으면 0x00010은 CS세그먼트에, 0x0003은 EIP에 저장되어 두 값을 더하여 실제 물리주소값을 나타 낸다. 

 

 

참고 URL 및 도서

-그림 seednote.tistory.com

 

'Reversing' 카테고리의 다른 글

인라인 패치  (0) 2014.05.11
Upack 분석중 정리  (0) 2014.05.10
UPX압축 디버깅  (0) 2014.05.09
IAT와 EAT  (0) 2014.05.08
PE구조  (0) 2014.05.08
기본 레지스터  (0) 2014.05.04
Posted by flack3r

 

  1. 1. 개요

지금부터 전반적인 OS커널에 대한 이야기를 할 것이다. 이론중심이 될 것이고 관련 소스나 실습을 원하시는 분들은 따로 자료를 참조하시기 바란다. MBR부터 시작하자.

 

  1. 2. MBR이란?

 

MBR이란 무엇일까? 컴퓨터가 처음에 부팅을 시작하면 각종 하드웨어들에 대한 체크들을 한다. 잘 작동하는지부터 시작해 마더보드 상태 체크, 각 장치가 잘 연결되어 있는지 등 이것저것 확인한다. 제일 마지막으로 사용자가 부팅영역으로 사용할 영역이라 정해놓은 디스크의 512바이트의 프로그램을 램으로 읽어 들여 실행하게 된다.

 

뭔가 이상하지 않은가? 겨우 512바이트의 프로그램만 로딩해선 OS라 부를만한 기능(멀티 테스킹, 파일 시스템관리, 네트워크 등)을 수행할 수 없을 것 같다. 해법은 초기 512바이트의 프로그램에서 OS커널 프로그램을 로드시키는 방법이다. 그래서, MBR영역은 초기 첫 매듭을 매는 역할을 한다. 따라서 이를 부트스트랩이라 부르기도 한다. 왜 부트스트랩인가? 부츠를 신을 때 밑에서 쭉 지퍼를 올리는 것을 연상하기 바란다… 마음에 안드는가? 필자도 부트스트랩이란 용어가 직관적이지 않아 마음에 들지는 않지만 별수 없다. ㅠㅠ

 

지금까지의 내용을 정리 하자면, MBR영역이 OS가 메모리에 로드되는 첫 단추이다. 이 MBR영역의 511바이트와 512바이트엔 0x55 0xaa 라는 값이 입력되어야 한다. 왜냐하면 BIOS가 마지막 512바이트를 로드 할 때 이 부분을 보고 이 프로그램이 MBR인지 아닌지를 판단하기 때문이다. 이상의 과정을 그림으로 확인하겠다. 1번 과정은 디스크의 MBR영역으로, BIOS가 프로그램을 읽어 들인다. 그 다음 2번에서 MBR에서 읽은 영역을 실행시켜 다음 프로그램을 3, 4번에서 램으로 가져오는 과정이다.


'컴퓨터구조&OS > OS' 카테고리의 다른 글

5. 보호  (0) 2014.05.05
4. Task switching  (0) 2014.05.05
3. 인터럽트 처리  (0) 2014.05.05
2. Protected 모드로의 전환  (0) 2014.05.05
메모리 구조  (0) 2014.05.04
1.OS의 시작  (0) 2014.05.04
Posted by flack3r