바이트 오더링(Byte Ordering)

- 바이트 오더링 : 데이터의 저장하는 방식을 말함.

CPU 벤더사에 따라 바이트 단위로 데이터를 받아들이고 메모리에 적재하는 방식이 다르다고 함.

방식에는 대표적으로 2가지가 있는데 '빅 엔디언' 방식과 '리틀 엔디언' 방식임


빅 엔디언 : 네트워크 프로토콜에 사용

리틀 엔디언 : 인텔 x86 CPU 사용(window계열 리버서들이 리틀 엔디언에 대해서 알아야하는 이유)


핵심 : 리틀 엔디언은 역순으로 적재함

[엔디언 위키 바로가기]


리틀 엔디언 확인


다음의 코드를 통해서 리틀 엔디언의 개념을 알아보자!



LittleEndian.exe


LittleEndian.exe를 x32dbg를 통해서 open 해서 디버깅을 시작할 예정이다.


어제 해봤던 것처럼 F9를 눌르면 EntryPoint에서 부터 디버깅을 시작하면 된다.


시작!!



지난 시간 복습겸 main함수를 찾아보도록 한다 F8을 꾹 눌르면



401000을 호출하는 부분에서 MessageBox가 뜨게된다. 그렇다면 call함수 내부로 들어가보자 [Ctrl+F2]로 프로그램을 다시시작하고... 

[Ctrl+G]를통해 401000주소로 이동한다.

그랬더니


[짝짝짝! 여기가 main()의 내부이다. 소스코드의 byte, word, dword 가 보인다]


Goto를 이용해 byte의 주소인 413780의 헥사 덤프로 진입해보자.



[변수 b,w,dw의 값들이 '리틀 엔디언' 방식으로 저장되어 있는거 보인다 보여!]



CPU 범용 레지스터(EAX,EBX,ECX,EDX,EBP,ESI,EDI,ESP)

- 이 부분은 각각 레지스터의 용도와 쓰임새 부분을 짚고 넘어가야 될 것 같아서 정리해서 남겨두었다!


[CPU 범용 레지스터 정리]


이 후에 다른 레지스터들에 대해서도 간략히 알아보자!


세그먼트 레지스터

- 'Segment'는 메모리의 영역에 주소,범위 혹은 접근 권한 등을 부여해서 메모리를 보호하는 기법이다. 


세그먼트는 페이징 기법과 함께 가상 메모리를 실제 물리 메모리로 변경할때 사용되는데 이 세그먼트 메모리는 SDT라는 곳에 기술 되어있고, 


SDT의 index를 가지고 있는것이 '세그먼트 레지스터' 라고 할 수 있겠따 (어렵당;)


2바이트(16bit) 크기의 6개의 레지스터로 구분되어 있다.(CS, SS, DS, ES, FS, GS)


CS 코드 세그먼트, SS 스택 세그먼트, DS 데이터 세그먼트 이정도만 숙지하고 넘어가자!


플래그 레지스터

- 플래그 레지스터의 이름은 EFLAGS이며 32비트의 크기입니다.


여기에서는 깊게 이해하지말고 3가지 플래그만 알아두고 넘어가도록 합시다



[ZF : Zero Flag, OF : Overflow Flag, CF : Carry Flag 각각의 플래그들은 참일때 1로 셋팅 됩니다!]





'Reversing' 카테고리의 다른 글

PE File(1)  (0) 2019.04.02
리버싱 5  (0) 2019.04.02
리버싱 4  (0) 2019.03.29
리버싱 3 Stackframe  (0) 2019.03.28
리버싱 1  (1) 2019.03.26

+ Recent posts