본문 바로가기
Reversing

어셈블리, 레지스터 정리

by 09337 2021. 10. 11.

1. 어셈블리어

PUSH: 스택에 값을 저장

POP: 스택에서 값을 뺌

CALL: 지정된 주소의 함수 호출

INC: 값을 1 증가

DEC: 값을 1 감소

JMP: 지정된 주소로 점프

CMP: 주어진 두 값을 비교

JE: 조건 분기(같으면 점프)

JNE: 조건 분기(같지 않으면 점프)

MOV: 앞 오퍼랜드에 뒤 오퍼랜드의 값을 저장

LEA: 앞 오퍼랜드에 뒤 오퍼랜드의 주소 값을 저장

ADD: 두 개의 오퍼랜드를 더해서 앞의 오퍼랜드에 저장

SUB: 앞 오퍼랜드에서 뒤 오퍼랜드를 뺀 다음 앞의 오퍼랜드에 저장


2. 레지스터란?

: CPU 내에서 자료를 보관하는 빠른 기억 장소로, 변수와 같은 역할로 메모리에서 연산을 할 때 사용

 

32bit 기준

EAX: 사칙연산 등 산술 연산 용도로 사용한다. 함수의 반환 값을 처리할 때도 EAX 레지스터가 사용된다.

EBX: 특정 목적을 가진 것이 아니기 때문에 연산으로 사용해도 되고, 공간이 필요할 때 사용한다.

ECX: 반복문을 사용할 때 카운팅의 역할을 한다. 하지만 카운팅을 하지 않을 땐, EAX처럼 연산할 때 사용해도 무방하다.

EDX: EAX와 같은 연산으로 쓰이는데, EAX가 이미 사용 중일 때 쓰인다.

ESI, EDI: 각각 시작지 인덱스와 목적지 인덱스로, 변수로 사용된다. ESI는 문자열이나 반복 데이터 처리, 메모리를 옮기는 데 사용된다.

ESP: 스택의 최상단 주소 값을 가지고 있어, 스택의 크기를 나타낸다. 어셈블리어의 PUSH 명령어를 할 때, 값이 들어가는 만큼 메모리 공간을 늘려주어야 하기 때문에 ESP가 줄어든다.

EBP: 스택의 최하단 주소 값을 가지고 있다. 스택 프레임의 바닥만 가리켜주기 때문에, 유동적으로 변하는 ESP와는 다르게 EBP는 기준을 잡아주는 버팀목으로 고정적이라는 차이가 있다.

64bit일 때는 E가 아닌 R을 사용한다. (ex. EAX → RAX)


3. 스택 프레임이란?

: ESP가 아닌 EBP 레지스터를 사용하여 스택 내의 로컬 변수, 파라미터, 복귀 주소에 접근하는 기법

스택 프레임을 생성할 때, EBP가 베이스 포인터의 역할을 한다. PUSH 명령어로 EBP가 이전에 가지고 있던 값을 스택에 백업하고, MOV 명령어로 ESP값을 EBP로 옮긴다.

이 명령 이후부터는 EBP는 현재 ESP와 같은 값을 가지게 되고, 함수가 끝날 때까지 EBP 값이 고정된다.

그래서 스택에 저장된 함수 파라미터와 로컬 변수들은 EBP를 통해서 접근한다.

 

스택 프레임을 해제할 때는 MOV 명령어로 ESP의 원래 값을 복원시키고, POP명령어로 스택에 백업해두었던 EBP 값을 복원시킨다. 마지막으로 스택에 저장된 복귀 주소로 리턴하여 함수가 종료되는 구조다.


4. 레지스터 실습 내용 정리

4-1. 레지스터 활용 mov

1) rbp에 rsp 값을 넣는다.

2) eax에 0x1234를 넣는다.

0x1234 == 4660

3) rbx에 0x56781234를 넣는다.

0x56781234 == 1,450,709,556

4) cl에 0xab를 넣는다.

0xab == 171

5) edx에 eax 값을 넣는다. eax 값은 4660이므로, edx도 4660이 저장된다.

 

4-2. 변수 .data 영역

리틀앤디안 방식

레지스터로 표현된 값들이 메모리에 로딩된다.

 

4-3. 문자 처리

 

4-4. 시프트 연산

shl: 왼쪽으로 시프트

shr: 오른쪽으로 시프트

 

4-5. 논리 연산 xor

1) al == 0b10101010(aa)

2) bl == 0b01101100(c6)

3) 처음 출력된 al은 초기 값으로, aa

4) xor 연산을 통해 al과 bl을 연산 후 al을 출력하면 c6

5) 두 번째 xor 연산으로 al과 bl을 연산 후 다시 al을 출력하면 기존 값인 aa 출력

6) xor 연산을 2회 진행하면 처음 값으로 돌아온다는 것을 확인 가능

 

4-6. 분기분 (if)

1) eax == 10

2) ebx == 20

3) cmp 명령어로 eax와 ebx가 같은지 비교

4) 같으면 LABEL_1로 점프하여 rcx에 1을 저장 후 출력

5) 같지 않으면 rcx에 0 저장 후, rcx 출력

 

4-7. 반복문 (for, while)

1) ecx == 10

2) 반복문, str1 출력

3) .data 영역에서 str1은 test라고 알려줌

4) 반복문이 돌 때마다 ecx 값을 1씩 감소

5) 계속 1씩 감소하다가 ecx 값이 0인지 비교

6) 0이라면 끝, 0이 아니라면 다시 test 출력

'Reversing' 카테고리의 다른 글

함수, 배열 | 스택프레임  (0) 2021.10.18

댓글