-
x86-64 아키텍처: 레지스터dream hack/system hacking 2022. 9. 25. 19:53
레지스터
레지스터는 cpu가 데이터를 빠르게 저장하고 사용할 떄 이용하는 보관소이다. 산술 연산에 필요한 데이터를 저장하거나 주소를 저장하고 참조하는 등 다양한 용도로 사용됩니다. x64 아키텍쳐에는 범용레지스터(General Register), 세그먼트 레지스터(Segment Register), 명령어 포인터 레지스터(Instruction Pointer Register,IP), 플레그 레지스터(Flag register)가 존재한다.
범용 레지스터
범용레지스터는 주용도는 있으나, 그 외의 다양한 용도로 사용될 수 있는 레지스터입니다. x86-64에서 각각의 범용레지스터는 8바이트를 저장할 수 있다.
자주쓰이는 레지스터들의 주용도는 아래와 같다.
이름 주용도 rax(aumulator register) 함수의 반환 값 rbx(base reg) x64에서는 주된 용도 없음 rcx (counter regi) 반복문의 반복 횟수, 각종 연산의 시행 횟수 rdx (data reg) x64에서는 주된 용도 없음 rsi(source index) 데이터를 옮길 떄 원본을 가리키는 포인터 rdi(destination index) 데이터를 옮길 때 목적지를 가리키는 포인터 rsp(stack pointer) 사용중인 스택의 위치를 가리키는 포인터 rbp(stack base pointer) 스택의 바닥을 가리키는 포인터 이 외에도 x64에서는 r8,r9,...,r15까지의 범용레지스터가 더 존재합니다.
세그먼트 레지스터
세그먼트 레지스터의 종류로는 cs, ss, ds, es, fs, gs 총 6가지가 있다. 각 레지스터의 크기는 16비트다. 과거에는 제한된 메모리에서 16비트를 구현하기위해 사용되었지만 현대에서는 cs, ds, ss 레지스터는 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용되고 나머지 레지스터는 운영체제 별로 용도를 결정하도록 제작된 세그먼트 레지스터이다
명령어 포인터 레지스터
프로그램은 일련의 기계어 코드들로 이루어져 있습니다. 이 중에서 cpu가 어느 부분의 코드를 실행할지 가리키는게 명령어 포인터 레지스터 의 역할이다. x64아키텍처의 명령어 레지스터는 rip이며 크기는 8바이트이다.
플래그 레지스터
플래그 레지스터는 프로세스의 현재 상태를 저장하고 있는 레지스터입니다. x64에서는 RFLAGS라고 불리는 64비트 크기의 플래그 레지스터가 존재하며 과거 16비트 플래그 레지스터가 확장된 것 입니다. 레지스터는 자신을 구성하는 여러 비트들로 현재 cpu의 상태를 표현합니다. 주로 사용하는 플래그는 아래 표와 같습니다.
플래그 의미 CF(Carry Flag) 부호 없는 수의 연산 결과가 비트의 범위를 넘을 경우 설정 됩니다. ZF(Zero Flag) 연산의 결과가 0일경우 설정 됩니다. SF(Sign Flag) 연산의 결과가 음수일 경우 설정 됩니다. OF(Overflow Flag) 부호 있는 수의 연산 결과가 비트 범위를 넘을 경우 설정 됩니다. 아래의 그림은 플래그의 전체 입니다
저장해서 보면 안보이는 글씨가 보입니다. 레지스터 호환
x86-64아키텍처는 IA-32의 64비트 확장 아키택처이며 호환이 가능합니다. IA-32에서 cpu의 레지스터들은 32비트 크기를 가지며 각각 eax, ebx, ecx, edx, esi, edi, esp, ebp였습니다. 호환성을 위해 이 레지스터들은 x86-64에서도 그대로 사용이 가능합니다.
eax보다 하위 16비트 ax, ax보다 하위 8비트 상위8비트 AH와 AL로 나뉜다.
'dream hack > system hacking' 카테고리의 다른 글
리눅스 메모리 구성 (0) 2022.09.25 pwngdb-2 (0) 2022.08.16 pwngdb-1 (0) 2022.08.16 Tool: gdb-1 (0) 2022.08.15 GCC이용해서 컴파일 하기 (0) 2022.08.15