Self-Improvement

리버싱 기초 1 (메모리, 레지스터) 본문

리버싱 기초

리버싱 기초 1 (메모리, 레지스터)

JoGeun 2018. 10. 20. 14:32

*리버싱 (= 리버스 엔지니어링)
리버싱은 리버스 + 엔지니어링의 합성어인 리버스 엔지니어링의 줄임이며 이진코드로 되어 있는 실행 파일을 분석하려는 일련의 행위이며 소트트웨어를 분석하고 동작을 해명해가는 것을 리버스 엔지니어링이라 한다.

*관점
보안적 관점 
 - 소프트웨어를 개발 후 개발된 제품에 대한 평가
 - 백신업체에서 바이러스 또는 악성코드를 분석 후 백신을 만들기 위해 사용
 - 해커들이 악의적인 목적으로 분석하여 제작 하는 등

개발적 관점
 - 소프트웨어 개발시 필요한 지식을 습득하기 위해 다른 소프트웨어를 분석하는 것

*분석 방법 종류
정적 분석 : 대상 프로그램을 실행하지 않고 분석하는 방법이며 전체적으로 넒게 분석시 사용한다.

동적 분석 : 대상 프로그램을 실행하며 분석하는 방법이며 일부분을 집중적으로 분석시 사용한다.

*메모리






 1. Text(Code) : 작성된 실행코드를 비트로 변환하여 메모리에 올려놓는 공간 
 2. Data : 전역 변수 중 값이 존재하는 변수의 관한 메모리공간 
 3. BSS  : 전역 변수 중 값이 존재하지 않는 변수들을 저장 
 4. Heap : 동적메모리로 데이터가 저장되는 공간  
 5. Stack : 0xffff의 끝부분부터 순서대로 지역변수를 할당 (임시적인 공간)

*레지스터
레지스터는 CPU가 접근할 수 있는 메모리 중에서 가장 빠르게 동작하는 메모리로 CPU가 여러가지 연산등의 처리 하는 동안 임시적으로 데이터를 보관하는데 사용된다. 또한 레지스터의 경우 번지의 개념이 없고 모두 고유한 이름이 부여되어 있다.

*범용 레지스터
 일반적인 레지스터 이며 EAX, EBX, ECX, EDX 4개의 레지스터로 구성이 되며 각 32비트 크기를 갖는다.

1. EAX(Accumulator, 누산기)
모든 연산 명령에 사용되는 레지스터이며 주로 산술 연산에 사용되며 함수의 결과값을 저장한다.

2. EBX(Base Register, 베이스 레지스터)
메모리 주소를 저장하며 주소 지정을 확대하기 위한 인덱스로 사용

3. ECX(Count Register, 카운트 레지스터)
반복 명령어 사용시 반복 카운터로 사용되는 값을 저장 하며  또한 좌우 방향 시프트 비트 수 기억에 사용이 된다.

4. EDX(Data Register, 데이터 레지스터)
EAX 레지스터의 서포터로 사용이 된다. (큰수의 산술연산 등)

*세그먼트 레지스터
1. CS
(Code Segment Register)
코드영역의 시작 주소를 저장하며 이 번지에 명령어 포인터(IP) 레지스터 내의 옵션값을 더하면 실행을 위한 명령어의 번지가 된다실행될 기계 명령어가 저장된 메모리 주소 지정.

2. DS
(Data Segment Register)
프로그램의 데이터 영역의 시작 주소를 기억하며 프로그램에서 정의된 데이터상수작업 영역의 메모리 주소 지정.

3. SS
(Stack Segment Register)
주소와 데이터를 임시로 저장할 목적으로 쓰이는 스택을 메모리에 구현한 것으로 스택 포인터 레지스터의 오프셋 값을 더하면 스택 내의 현재 워드를 가리키는 주소프로그램이 임시로 저장할 필요가 있거나 사용자의 피호출 서브 루팅이 사용할 데이터와 주소 포함.

4. ES(Extra Segment Register)
지정하기 위해 본 레지스터를 사용할 때 DI 레지스터와 연관

5. FS, GS
문자 연산과 추가 메모리 지정을 위해 사용되는 여분의 레지스터

*포인터 레지스터
스택 영역을 표시하기 위한 레지스터

1. EBP(Base Pointer)
함수의 파라미터나 변수의 위치를 얻어오는데 간접적으로 사용(스택 메모리를 가리킴). 호출된 프로시저(Procedure)를 위한 스택 프레임 내의 고정 Reference point를 나타냄저장된 이전의 EBP 값을 SFP(Stack Function Flame Pointer)라고 함. SS 레지스터와 함께 사용되어 스택 내의 변수 값을 읽는 데 사용.

2. ESP(Stak Pointer)
스택(stack)의 맨 꼭대기를 가리키는데 사용,그러나 프로그램 안에서 수시로 변경되기 때문에 특정 기준 시점을 잡아 ESP값을 EBP에 저장하여 EBP를 기준으로 변수나 패러미터에 접근. SS 레지스터와 함께 사용되며스택의 가장 끝 주소를 가리킴. 

3. EIP(Instruction Pointer)
현재 수행중인 코드를 가리킴.
 다음 명령어의 오프셋(상대 위치 주소)를 저장하며 CS 레지스터와 합쳐져 다음에 수행될 명령의 주소 형성.

*명령어 포인터 레지스터
다음 실행할 코드의 주소를 담는 레지스터

1. SP(Stack Pointer) -> ESP
스택내의 현재 워드를 참조할 오프셋 값을 기억. 80386 이후의 프로세서는 확장 스택 포인터(ESP)

2. BP(Base Pointer) -> EBP
스택에 들어오고 나가는 데이터나 번지를 참조하는데 사용. 80386 이후의 프로세서는 확장 스택 포인터(ESP)

*인덱스 레지스터
문자열의 시작주소나 기타 다른 데이터들을 저장하기 위해 사용되는 레지스터

SI(Source Index)
스트링 조작에 사용, DS 레지스터와 연관 번지의 간접지정에 사용특히 스트링 명령에 있어서는 메모리 부터 레지스터로 데이터를 전송하기 위한 전송 측 번지의 지정

DI(Destination Index)
스트링 조작에 사용, ES 레지스터와 연관 번지의 간접번지에 사용특히 스트링 명령에 있어서는 레지스터로 부터 메모리에 데이터를 전송하기 위한 수신 측 번지를 지정할 때 사용
  

※인덱스 레지스터는 주로 문자열의 시작 주소를 담아서 표현하는데 사용


*플래스 레지스터
OF(Overflow Flag)
DF(Direction Flag)
SF(Sign Flag)
ZF(Zero Flag)   : 연산의 결과값이 0이 될 경우 ZF가 1이 된다.
CF(Carry Flag) : 부호 없는수의 오버플로우가 발생됬을 경우 CF가 1이 된다.
TF(Trap Flag)
PF(Parity Flag)
AF(Auxiliary Flag)
IF(Interrupt Flag)

  
※플래그 레지스터는 CPU 연산 시 발생하는 각 상황에 대한 것들로서 총 32비트로 이루어져 있으며, 이중 16비트만 사용



'리버싱 기초' 카테고리의 다른 글

함수 호출 규약  (0) 2018.11.03
MOV vs LEA  (0) 2018.10.28
리버싱 기초 4 (어셈블러 명령어)  (0) 2018.10.23
리버싱 기초 3 (어셈블러 명령어)  (0) 2018.10.23
리버싱 기초 2 (어셈블리어)  (0) 2018.10.20