General-Purpose register
여러가지 목적이나 용도로 사용하는 레지스터
- 프로그래머가 자유롭게 조작 할 수 있음
- 일종의 변수라고 생각할 수 있음
- 인텔의 공식 문서에 따르면 32비트의 시스템의 경우 8개가 존재
- 인텔의 공식 문서에 따르면 64비트의 시스템의 경우 16개가 존재
- 용도나 목적이 정해져있지 않음 (그렇지만 일반적으로 어떠할 때 사용한다는 것은 존재함)
* RAX, RBX, RCX, RDX 2byte 중 상위 1byte에 접근할 수 있음
[ 범용 레지스터의 용도/목적 ] 실질적으로 정해져있는 것은 아니지만 주로 사용함
EAX : 피연산자와 연산 결과의 저장소
EBX : data segment 안의 데이터를 가리키는 포인터
ECX : 문자열 처리나 루프를 위한 카운터
EDX : I/O 포인터
ESI : data segment내의 어느 데이터를 가리키는 포인터 / 문자열 처리에서 src를 가리킴
EDI : data segment내의 어느 데이터를 가리키는 포인터 / 문자열 처리에서 dst를 가리킴
ESP : stack segment의 맨 꼭대기를 가리키는 포인터
EBP : stack의 한 데이터를 가리키는 포인터 (현재 스택 포인터의 베이스 주소 등)
Segment register
한 바이너리(실행 파일)의 base 주소를 가리키는 역할을 하는 레지스터
프로그램이 실행되면 비어있는 메모리 아무 곳에나 각각의 레지스터를 빈 공간 아무곳에나 놓는다.
모든 세그먼트는 흩어지게 되며, 우리가 살펴볼 때는 가상 메모리라는 개념을 사용하기에 이를 인지하지 못한다.
흩어진 세그먼트의 base를 저장해야, 해당 바이너리의 메모리를 사용할 수 있는데 이 base를 저장해주는 곳이 Segment register이다
Segment Register와 Memory sapce (page의 크기)
32비트 프로그램을 가정하자
32비트 프로그램이라는 뜻은 한번에 처리할 수 있는 명령어의 크기가 32비트이자, 메모리 공간을 표현할 수 있는 크기가 최대 32비트
이 32비트에 맞춰 page 크기를 계산한다.
즉, 한 page는 \(2^{32}\)가 됨
Program status and control register (FLAG register)
플래그 레지스터는 플래그를 설정하는 명령어들이 실행 된 이후, 어떤 값을 확인할 수 있도록 해줌
중요한 것은 4가지가 있다
- CF(Carrry Flag) : 연산을 수행하면서 carry 혹은 borrow 가 발생하면 1이 됨
- ZF(Zero Flag) : 결과가 zero (보통 xor 연산 혹은 if와 같은 조건문)
- SF(Sign Flag) : 음수일 때 설정됨 - 연산 결과의 최상위 비트 값과 같음
- OF(Overflow flag) : 오버플로우가 발생한 경우
CF vs OF
OF는 "부호의 반전이 있을 때" 설정된다고 생각하면 간단하다
mov al, 0xff
add al, 1
자리 올림이 발생하고 0이 된다
> CF, ZF가 설정됨
1바이트 공간을 초과하니 overflow라고 생각할 수 있지만, 부호 반전이 없기 때문에 OF는 설정되지 않는다
mov al, 0x7f
add al, 1
0x7f(127) -> 0x80(-128)이 된다
> SF, OF가 설정됨
부호 반전이 일어나기 때문에 OF가 설정되지만, 자리 올림/빌림이 발생하지 않아 CF가 설정되지 않음
Instruction Pointer
다음에 실행할 명령어 주소를 저장하는 레지스터
x86에서는 EIP, x64에서는 RIP를 사용함
* 시스템 해킹의 주요 목표는 명령 포인터를 조작하는 것
'CS > Computer Architecture' 카테고리의 다른 글
[Assembly] 데이터 이동 (0) | 2024.09.20 |
---|---|
Static Link vs Dynamic Link (0) | 2024.09.05 |
함수의 프롤로그 & 에필로그 (0) | 2024.08.22 |
[Assembly] Intel vs AT&T (2) | 2024.08.14 |
Hardware Architecture - Single Processor (2) | 2024.07.01 |