whois

레지스터 본문

Hacking/Reverse Engineering

레지스터

HongJun Choi 2018. 1. 3. 23:37

레지스터란 "CPU가 사용하는 변수"이다.


· EAX

"가장 많이 쓰는 변수로써, 산술 계산을 할 때 사용하고 리턴값을 전달한다."


[그림 1] EAX 레지스터 내부


16비트 시절에는 EAX가 아닌 AX 레지스터를 사용하였지만, 32비트로 넘어오면서 Extended 즉, 확장된 EAX 레지스터를 사용한다.

EAX 레지스터의 내부 구조는 그림 1과 같다. AX는 AH와 AL을 가진다.

구체적으로, 높은 주소인 AH와 낮은 주소인 AL 8비트씩 모여 16비트인 AX가 된다.


[그림 2] 레지스터 개념 테스트 코드


그림 2와 같이 테스트 코드를 만들어 레지스터 개념을 잡아볼까 한다.


① 0x12345678이라는 16진수 값을 eax에 넣는다.

② 0x12340000이라는 16진수 값을 edx에 넣는다.

③ ax 값(0x00005678) 값을 dx에 넣는다.(실행 후 edx는 0x12345678이라는 값을 가지게 된다.)

④ eax(0x12345678) 값에서 edx(0x12345678) 값을 뺀다.



결과적으로 eax는 0이 된다.


여기서 몇 가지 주의 사항은 있다.

1. 오퍼랜드(피연산자)의 크기는 동일하게 맞추어야 한다.(32비트면 32비트끼리)

2. ebx 레지스터를 사용하게 되면 프로그램이 동작하면서 값이 바뀌니 다른 레지스터를 사용하여 테스트 해본다.


· EDX

"EAX와 역할은 같지만, 리턴 값의 용도로는 사용되지 않는다."


· ECX

"루프문을 수행할 때 카운팅하는 역할을 수행한다."


· EBX

"공간이나 레지스터가 부족할 때 적당한 용도로 컴파일러가 만들어서 사용한다."


· ESI, EDI

"문자열이나 각종 반복 데이터를 처리 또는 메모리를 옮기는데 사용한다."


[그림 3] CopyMemory function(memcpy)


memcpy 함수를 사용할 경우 그림 3과 같이 첫 번째 인자로 도착지인 EDI, 두 번째 인자로 출발지인 ESI 레지스터를 사용하게 된다.


· EBP

"스택 프레임의 시작 지점 주소를 담고 있다."


· ESP

"스택 프레임의 마지막 지점 주소를 담고 있다."


[그림 4] 어셈블리로 덧셈 기능 구현


[그림 5] 그림 4의 결과 값


그림 4의 코드를 통해 어셈블리로 덧셈 기능을 구현할 수 있다. 컴파일 하게 되면 그림 5와 같이 덧셈이 잘 되는 것을 볼 수 있다. 그림 4의 코드를 가져온 이유는 어셈블리로 해당 기능을 구현하려 한다면 많은 라인의 코드를 작성해야 한다는 것이 첫 번째 이유이고, 두 번째는 __declspec(naked) 함수 때문이다.


· __declspec(naked)

"naked를 사용해 함수 안에서 부수적인 코드를 전혀 사용하지 않으며, 어떤 자체적인 코드도 생성하지 않는 것을 정의"

'Hacking > Reverse Engineering' 카테고리의 다른 글

함수 호출  (0) 2018.01.04
스택(Stack)  (0) 2018.01.04
필수 어셈블리 명령어  (0) 2018.01.04
어셈블리  (0) 2018.01.03
리버스 엔지니어링 개요  (0) 2017.12.27
Comments