본문 바로가기

해킹/포너블

x86, x64 레지스터

※주의 x86은 32비트 x64는 64비트이다. 헷갈리지 않게 조심하자!(사실 블로그 주인장한테 하는 경고임 내가 제일 헷갈림)

 

레지스터란?

레지스터는 cpu 내부에 존재하는 매우 빠른 작은 기억장치이다.

x86, x64 register

 

범용 레지스터

그냥 프로그램 실행 중에 막 쓰이는 레지스터이다. 주로 사용되는 곳은 있지만 사실 gdb로 디버깅 해보면 알겠지만 그냥 막쓴다. 따라서 타 블로그에 있는 레지스터의 역할을 외우는 것은 비추천한다.

 

eax, rax: 함수의 연산결과를 저장하는 누산기의 역할로 많이 쓰인다. 이 레지스터도 범용으로 쓰이긴 하지만 특이하게 고정된 역할이 존재한다. 함수의 연산결과를 저장하기도 하고 인터럽트를 호출할 때 테이블 번호를 저장하기도 한다. 범용 레지스터 중에서는 역할을 외워 놓으면 좋은 친구이다.

 

ecx, edx, ebx, rbx, rcx, rdx, rsi, rdi, r8, r9..., r15: 그냥 간단하게 이것저것 저장해야할 때 쓰임 역할을 외울 필요는 없음

 

포인터 레지스터

이 레지스터들은 조금 다른 배경지식이 필요하다. 본 글에서 이를 전부 설명하기에는 너무 길고 논점에서 벗어나기에 다음 글에서 조금 더 자세히 다루겠다. 일단 간략하게만 소개하자면 아래와 같다.

 

esp, rsp: 현재 사용중인 스택(스택 프레임)의 가장 높은 주소를 저장한다. 

 

ebp, esp: 현재 사용중인 스택 프레임의 가장 낮은 주소를 저장한다.

 

플래그 레지스터

현재 상태를 저장하는 레지스터이다. 보통 제어문 같이 분기가 나뉘는 곳에서 플래그 레지스터를 통하여 상태를 보고 각 분기로 나뉘게 된다. 리버싱을 전문으로 하게 된다면 얘를 자세히 봐야한다. 포너블에서는 엄청 중요하게 다루어지지는 않았던것 같다. 간단하게 알아놓으면 좋을 것들만 아래에 소개하겠다.

 

CF: 연산 결과 자리올림/자리내림이 발생하였을 때 1로 set

OF: 연산 결과 용량을 초과하였을 경우 1로 set

SF: 연산 결과 음수면 1로 set

ZF: 연산 결과가 0이면 1로 set

 

세그먼트 레지스터

솔직히 얘는 아직도 어떻게 쓰이는지 잘 모르겠다... 일단 현재 대부분의 블로그에서 각 세그먼트의 위치를 가리킨다고 서술되어있다. 단언하겠다. 개구라다. 가상 메모리 주소에서 실제 물리 메모리 주소를 찾을 수 있게 해주는 레지스터라고만 알아두고 있다.

 

cs: 코드 영역의 물리 주소를 알아올 수 있다.

ss: 스택 영역의 물리 주소를 알아올 수 있다.

ds: 데이터 영역의 물리 주소를 알아올 수 있다.

es: 남는 공간 여기저기서 쓰임

fs: 남는 공간2

gs: 남는 공간3

 

eip, rip

항목을 하나 따로 뺏을 정도로 상당히 중요한 녀석이다. 다음 실행할 명령어의 주소를 가리키는 레지스터이다. 이 레지스터를 조작하면 실행할 명령어를 가로챌 수 있다. 실행할 명령어가 뒤바뀐다는 것은 상당히 위험하기에 이 레지스터를 사용자가 직접적으로 조작하는 명령어는 존재하지 않는다. 단 간접적으로 조작은 가능하다. 간접 조작을 통해서 해커는 다양한 공격 기법을 창조했다.

 

 

 

 

 

 

 

'해킹 > 포너블' 카테고리의 다른 글

스택 프레임(1)  (0) 2023.10.25
컴퓨터 구조  (0) 2023.09.13