리버스 엔지니어링

Register (IA -32)

cdecl 2018. 3. 9. 15:48

General Purpose Registers (범용 레지스터)

: 흔히 쓰이는 레지스터 


EAX      

EBX       
ECX
EDX


ESP            - 스택의 꼭대기와 맨 아래를 가리킴

EBP


EDI            - 요놈 두 개는 주로 메모리 복사용도

ESI



이렇게 8개가 있는데, 외우기 쉽게 종류별로 묶어 놓음


위에 4개는 ABCD순, 아래는 스택 포인터순, 그리고 맨 아래는 목적지와 출발지  요렇게..


이름 앞에 E가 붙은 건 확장을 뜻하는 'Extended'라는 접두어가 붙었기 때문이다 


원래 16비트 였는데 32비트로 확장되어서 그렇다

 

그리고 한 술 더 떠서 64비트용 레지스터도 있는데, 이는 접두어 'E' 대신 'R'이 붙음 (ex: rsp, rbp) 이렇게 




Segment Register (세그먼트 레지스터)

: 메모리를 조각내어 각 조각마다 시작 주소, 범위, 접근 권한 등을 지정하여 메모리를 보호하는 용도

: 페이징 기법과 함께 가상 메모리를 실제 물리 메모리로 변경할 때 사용 ----------> (아직 무슨 말인지 모르겠다) 



CS    (Code Segment)

SS    (Stack Segment)

DS    (Data Segment)

ES    (Extra Segment)      /* 이 3개부턴 추가적인 데이터 세그먼트이다. */

FS    (Data Segment)

GS    (Data Segment)




Flag Register (플래그 레지스터)

: EFLAGS로 칭하며 32비트 크기이다. (접두사 E를 보기 바람)

: 각각의 비트마다 1 or 0의 값을 같는다 (Boolean)

: 리버싱 입문에선, 3가지 정도만 이해하고 넘어가면 된다고함 (ZF, OF, CF)



ZF    (Zero Flag)

: 연산 명령 후에 결과 값이 0이 되면 ZF가 1로 세팅된다.


OF    (Overflow Flag)

: 부호 있는 수(signed integer)의 오버플로우가 발생했을 때, 1로 세팅된다. 부호를 나타내는 비트, 즉 MSB도 변경되었을 때도 1.


CF    (Carry Flag)

: 부호 없는 수(unsigned)의 오버플로우가 발생했을 때 1로 세팅된다.




Insturction Pointer

: CPU가 처리할 명령어의 주소를 나타내는 레지스터이다. (크기 32비트) 

: 다른 레지스터와는 다르게, 직접 값을 변경할 수 없다.


EIP

: gdb로 디버깅할 때 많이 본 거. 다음 실행할 명령의 주소를 가리키고 있음.