인디안 보호구역

[Assembly] 범용 레지스터란? - 3강 강의노트 본문

Study/Reversing 공부하는 인디안

[Assembly] 범용 레지스터란? - 3강 강의노트

Indie-An 2017. 5. 30. 18:01

register는 cpu 내에 있는 저장공간,

registry랑 헷갈리지 마셈. registry는 윈도우에서 시스템 설정값을 저장하기 위한 공간일 뿐임.


말한김에 이것도 헷갈리지마셈

프로세서는 처리장치(like cpu)

프로세스는 램에 올라간 프로그램을 말함.


ollydbg 맨날 재시작하면 귀찮으니까

재시작 하고 싶은 곳에서 우클릭하고 new origin here 를 누르면 다시 거기서 시작할 수 있음.

프로그램은 위에서 부터 아래로 쭉 순서대로 읽으면서 내려오는게 기본적임.


각 코드에 mov ecx,1 mov ebx,2 mov edx,3 해보셈. 값 바뀌죠? 참쉽죠?


reg는 레지스터의 약자임.

아래와 같이 사용함.


mov reg, value

mov reg1, reg2


mov는 값을 덮어쓰는 거임. 대입이나 덮어쓰는거나 뭔차이가 있겠냐마는 하튼 덮어쓴다고.

mov eax,1 mov eax,3 mov eax,4 하고 레지스터 바뀌는거 봐


여태까지 mov reg, value의 상황이었고 이번엔 mov reg, reg 형태를 보자


mov eax, 0

mov ebx, eax 이건  eax의 값을 ebx에 넣는건데, eax가 0이었으므로 ebx도 0이됨.


c언어로 치면 아래와 같음.

int eax = 0;

int ebx = eax;


이번엔 mov ecx,ebx 하셈


1byte = 8bit이고 8bit는 0000 0000임.

근데 0000 = 2^4가지의 숫자를 가질 수 있으므로 16진수 1개로 대체할 수 있음.

즉, 2진수 4자리 = 16진수 1자리임 

그럼 2진수 8자리는 16진수 2자리로 대체할 수 있는거임.


레지스터 창에서 수정하고싶은거 더블클릭하면 값을 임의로 변경할 수 있음.

올리디버거는 숫자를 쓸 때 16진수 값으로 들어감.

우리가 1을 써도 그게 10진수 1이 아니라 16진수 1임


하튼 레지스터끼리 mov 연산 됨.

eax 더블클릭해보셈. 열어보면 eax ax ah al 다 있음.

뭔지 궁금하니까 알아봄

intel cpu가 16비트였을 때 eax가 없고 ax가 있었음.16bit니까 2바이트임


ax는 16비트라고 했으니까, 2바이트임

1바이트씩 나눠서

0000 0000 // 0000 0000 인데

자릿수가 높은 쪽을 AH라고 불렀고 낮은 쪽을 AL이라 불렀음 (나 : high와 low인갑지?)


근데 이제는 32비트잖음. 4바이트임

0000 0000 // 0000 0000 // 0000 0000 // 0000 0000

2바이트에서 4바이트로 넓어졌으니 extended 라는 뜻을 붙여서 ax가 eax가 된거임

하튼 낮은 쪽은 아직도 al이고 높은 곳은 ah인거임.

전체적으로 보면 아래와 같음.


EAX

AX

AH                AL

0000 0000 // 0000 0000 // 0000 0000 // 0000 0000


근데 요새는 64비트잖음? rax라고 부른다고 하는데 우선 기본부터 익히자. rax는 안다룸.


우선 10진수로 1,234,567이라는 숫자가 어떻게 저장되는지 보셈.

16진수로 12 D687임.


 __ __ // 12 // D6 // 87


이렇게 저장됨. 만약 이걸 eax에 저장한다 치면은 어셈블리 명령어로 mov eax, 12D687이라고 적으면 됨.

그럼 eax에는 어떤 값이 드렁있나 12 d6 87 이고

ax에는 d687이 들어있고

ah에는 d6, al에는 87이 들어있음.


e    ax

bx

cx

dx 는 위와 같은 형태이고

ebp esp 등은 다름.


유의할 점은 레지스터 값을 넣을 때

양쪽 크기가 같아야 한다.

mov ah, ebx 혹은 mov ebx, ah 처럼 크기가 다르면 안된다는거. 참쉽죠?


eax = 32bit = 4byte

ax = 16bit = 2byte

al or ah = 8bit = 1byte


mov dh, al 하면 DH부분에 AL값을 넣은 것이기 때문에 나머지 3바이트 값은 보존이 됨.


그래서 오늘은 mov 와 register를 이용하는 것과 register의 내부 구조를 확인함.



Comments