안녕들 하시죠 !
오늘은 어플리케이션 디버깅을 위해 기본적으로 알아야할 IA-32 ( Intel Architecture 32 비트 )의 레지스터에 대해 공부해보겠습니다.
레지스터 또한 바이트 오더링 처럼 학교다닐때 컴퓨터 구조 시간에 공부했던것 같은데... 다 까먹었습니다.
CPU 레지스터란 ?
레지스터란 CPU 내부에 존재하는 다목적 저장공간 입니다.
우리가 일반적으로 저장공간( 메모리 )라고 얘기하는 RAM( Random Access Memory )와는 조금 성격이 다른데요.
CPU가 RAM에 있는 데이터를 엑세스하기 위해서는 물리적으로 먼 길을 돌아가야 합니다.
하지만 레지스터는 CPU와 한 몸이기 떄문에 고속으로 데이터를 처리할 수 있습니다.
IA-32는 지원하는 기능도 무척 많고 그만큼 레지스터의 수도 많다고합니다.
어플리케이션 디버깅의 초급 단계에서는 앞으로 가장 많이 보게될 Basic Program execution register에 대해 알아두어야 한다고 합니다.
Basic Program execution registers
ㆍ x87 FPU registers
ㆍ MMX registers
ㆍ XMM registers
ㆍ Control registers
ㆍ Memory management registers
ㆍ Debug registers
ㆍ Memory type range registers
ㆍ Machine specific registers
ㆍ Machine check registers
등등 더 많은 레지스터들이 존재한다고합니다.
또 Basic Program execution registers는 다시 4개의 그룹으로 나눌 수 있다고 합니다.
ㆍ General Purpose Registers ( 32비트 8개 )
ㆍ Segment Registers ( 16비트 6개 )
ㆍ Program Status and Control Register ( 32비트 1개 )
ㆍ Instruction Pointer ( 32비트 1개 )
이후 뒷부분까지 쭉 읽어봤는데요... 레지스터 4개의 그룹을 한번에 다 이해하기는 너무 어려웠습니다.
저자께서는 처음에는 일단 General Purpose Registers 8개와 각각의 쓰임새 정도만 알아두어도 되고, 디버깅을 많이 하다 보면 저절로 쓰임새를
알게 될 것이라고 하시니 오늘은 General Purpose Registers 에 대해서만 공부해보겠습니다.
범용 레지스터 ( General Purpose Registers )
범용 레지스터는 범용으로 막 쓰는 레지스터 입니다.
IA-32에서 각각의 범용 레지스터들은 32비트( 4바이트 )씩 8개가 있는데요.
보통은 상수( 연산 처리, 연산 결과 ), 주소 ( 번지지정, 복귀주소 ) 등 작은 데이터의 임시 저장 공간 입니다.
위에 있는 이미지는 Intel 홈페이지에서 무료 배포중인 IA-32 메뉴얼에서 발췌 했습니다.
4670장이나 되는 방대한 양인데요.
우리가 찾는 범용 레지스터는 p73~74에 있으니 아래 링크를 참고해보시면 좋을 것 같습니다.
8개의 범용 레지스터가 있고 각 레지드터들은 16비트 하위 호환을 위하여 몇 개의 구획으로 나뉘어집니다.
가장 위에있는 EAX로 봤을때 ( 1byte = 8bit )
32비트 ( 0 ~ 31 )를 전부 다 사용하고 싶을때는 EAX를,
16비트 ( 0 ~ 15 )만 사용하고 싶을때는 AX를,
AX는 다시 상위 8비트 AH와 하위 8비트 AL로 나뉘어집니다.
이해 되시죠 ?
자, 이제 8개를 4개씩 나누어 알아보려고 합니다.
레지스터 이름 앞에 붙은 E ( Extended )는 예전 16비트 시절부터 존재하던 레지스터들의 크기를 확장시켰다는 뜻입니다.
아래 4개의 레지스터들은 주로 산술연산 ( ADD, SUB, XOR, OR 등 ) 명령어에서 상수나 변수 값의 저장 용도로 많이 사용됩니다.
ㆍ EAX ( Accumulator Register ) : 산술, 논리 연산을 할때 사용되며 함수의 리턴 값을 저장.
ㆍ EBX ( Base Register ) : 메모리 주소를 저장.
ㆍ ECX ( Count Register ) : 우리가 흔히 아는 반복문에서 카운트로 사용.
ㆍ EDX ( Data register ) : 보통 EAX와 함께 연동해서 사용하며, 큰수의 복잡한 연산 과 부호 확장 명령에 사용.
아래 4개의 레지스터들은 주로 메모리 주소를 저장하는 용도로 많이 사용됩니다.
ㆍ EBP ( Base Pointer Register ) : Stack의 시작 주소 저장.
ㆍ ESP ( Stack Pointer Register ) : Stack의 끝지점 주소가 저장. push pop 에 따라 4byte씩 값이 변한다.
ㆍ ESI ( Source Index Register ) : 데이터를 조작하거나 복사할 때 데이터의 주소 저장.
ㆍ EDI ( Destination Index Register ) : 데이터를 복사할 때 목적지의 주소 저장.
낯설은 용어들이 많이나와 혼란스럽지만 자주 봐서 눈에 익혀야 할 것 같습니다.
오늘은 여기까지 입니다 감사합니다 !
참고서적 이승원 「리버싱 핵심원리」 인사이트(2018) p53~58
'보안 > Reversing' 카테고리의 다른 글
[1-2]① StackFrame (0) | 2018.11.18 |
---|---|
abex' crackme #1 (0) | 2018.10.27 |
바이트 오더링 / 빅 엔디언, 리틀 엔디언 (0) | 2018.10.24 |
문자열 패치 두번째 《 다른 메모리 영역에 새로운 문자열을 생성하여 전달 》 (0) | 2018.10.22 |
문자열 패치 첫번째 《 문자열 버퍼를 직접 수정 》 (0) | 2018.10.22 |