Newms's Basic Assembly for Reverse Engineering #3


6. 데이터 단위

 Bit - 가장 작은 데이터 단위이다. 0과 1로 이루어져 있으며 2진수의 근간을 이룬다.

 Nibble - 4개의 비트가 모여 Nibble을 이루며 1개의 Nibble이 16진수로 표현된 수 1자리를 표현 할 수 있다.

 Byte - 8개의 비트가 모여 Byte를 이룬다. 1Byte는 영어 한 문자를 표현 할 수 있으며 8비트 레지스터(AH,AL,BH,BL,DH...)를 표현할때 사용할 수 있다.

 Word - 16개의 비트가 모여 Word를 이룬다. 1Word는 16비트 레지스터(AX,BX,IP,ES...)를 표현할때 사용할 수 있다.

 DWord - 32개의 비트가 모여 DWord를 이룬다. 1DWord는 32비트 레지스터(EAX,EBX,EIP,EES...)를 표현할때 사용할 수 있다.

 QWord - 64개의 비트가 모여 QWord를 이룬다. 1QWord는 주로 EAX:EDX를 표현할때 사용하지만 자주 사용되지 않으므로 64비트라는것만 기억해두도록 하자.



7. 실제 주소 계산

 아래의 경우를 생각해보자.

 MOV EAX, [00000030]

 이 명령의 뜻은 데이터 세그먼트에 해당하는 주소의 값을 EAX에 대입하라는 말인데 주소

가 단지 00000030h를 뜻할까?

주소를 계산할때는 이런식으로 계산하지 않는다.

 전에 EDS라는게 있었다.

세그먼트 레지스터들은 각각 프로그램을 위한 데이터세그먼트의 주소를 저장하고 있는곳인

데, 특히 EDS(데이터 세그먼트)는 데이터를 저장하고 있는 주소의 처음 위치를 알려준다.

 EDS가 00001030h라고 할때 실제 주소 계산은 EDS*10h+Offset으로 한다.

즉, EDS*10h+Offset = (00001030h)*(10h)+(00000030h) = (00010330)h가 된다.

실제로는 10330h에서 값을 가져오는 것이다.

여기서 실제 주소를 유효 주소(Effective Address)라고 한다.

하지만, MOV EAX, DWORD PTR DS:[00000030]

같은 경우에는 00000030h가 유효주소를 뜻하고 바로 값을 가지고 오게 된다.

리버스 엔지니어링시에 후자를 더 많이 보게되므로 그렇게 어려워 하지는 말자

몇가지 세그먼트에 대한 옵셋값을 써두자면

CODE SEGMENT(ECS)는 EIP가 Offset역할을 한다.
STACK SEGMENT(ESS)는 ESP가 Offset역할을 한다.


8. 쉬프트 연산

 간단하다. 자리를 옴겨주면 된다.

가령 101110이라는 2진수가 있다. 이 숫자를 왼쪽으로 쉬프트연산 시키면

1011100이 되는것이다. 한자리씩 왼쪽으로 이동하면 된다. 반대로 오른쪽으로

쉬프트 연산을 하게 되면 10111이 된다. 신기한점은 쉬프트 연산을 할때

십진수로 표현해보면 보통 2배가 되있거나, 반이 되있거나 한다는 점이다.

101110 = 46(Dec), 1011100 = 92(Dec), 10111 = 23(Dec)이다.

처음의 연산자와 연결해보면 왼쪽쉬프트는 SHL, 오른쪽쉬프트는 SHR이다.

* 오른쪽쉬프트 연산을 시행할때 1이 있든 0이 있든 그냥 없어져버린다.

 

** 이 글의 저작권은 모두 저자에게 있습니다.
   수정, 배포시 저작권을 표시해주시기 바랍니다.
** 오타, 잘못된 내용이 있으면 적극적으로 알려주시기 바랍니다 :)
** 질문사항 또한 적극적으로 받겠습니다.

Copyright (c) NEWMS 2007 All right Reserved.
크리에이티브 커먼즈 라이선스
Creative Commons License
Write your message and submit
« PREV : 1 : ... 25 : 26 : 27 : 28 : 29 : 30 : 31 : 32 : 33 : ... 35 : NEXT »