본문으로 바로가기

어셈블리어, 주소에 접근하기

category Study/reversing 2017. 4. 4. 02:44

32비트에선 최대로 4G의 메모리를 사용할 수 있다

-> 2^32(주소의 개수) X 1BYTE(한 주소에 할당된 공간) = 4G


어셈블리어에서 주소에 접근하는 방법은 []을 사용하면 된다. EX ) [402000]


올리디버거의 좌측 하단에 있는 창이 메모리 공간에 있는 내용을 표시해준다.

이것을 보면서 실습해보자


mov [402000], al


이렇게 적게되면 자동으로 우리가 적지 않은 내용들이 입력이 된다. 이건 나중에 알아보자


이것을 실행하게 되면 AL에 있던 값이 402000에 복사됨을 알 수 있다.


이번엔 반대로 레지스터에 메모리에 들어있는 값을 넣어보자


mov cl, [402000]


여기서 주의해야할점은 mov mem, mem이 불가능하다는 것이다.

즉, 메모리에서 메모리로 직접 값을 복사할 수 없다. 그렇기 때문에 특정 레지스터에 복사한후 다시 옮길 주소에 복사해야 한다.




특정 주소에 있는 값을 임의로 바꾸어주는 방법도 있다.

주소창에서 원하는 부분을 그래그 후 키보드의 2를 눌러주면 된다.

keep size 옵션을 통해 변경 범위를 지정해줄 수도 있다.

 




이번에는 아까 자동완성된 글자에 대해서 알아보자


mov [402000], eax 라고 입력하면


mov dword ptr ds:[402000], eax 로 바뀌게 된다.


이번엔 아래와같이 입력해보자


mov [402000], ax   ->   mov word ptr ds:[402000], ax

mov [402000], al   ->   mov byte ptr ds:[402000], al


대충 느낌이 오는것 같다.


ptr = 포인터의 줄임말

ds = 데이터 세그먼트

cs = 코드세그먼트

es = 여분

ss = 스택

:

:


qword -> 8byte

dword -> 4byte

word -> 2byte

byte -> 1byte


라는 뜻을 가지고 있다.


즉 변화된 명령을 해석해보자면

 

mov dword ptr ds:[402000],eax


[402000]에 4byte크기의 eax를 복사한다고 이해할 수 있다.



그런데 왜 이런 자동완성이 되는가?


왜냐하면 주소에 어떠한 값을 지정해줄 때, 두번째 피연산자가 레지스터가 아닌 숫자일경우 그 숫자의 크기는 알려주어야 하지만 레지스터일 경우에는 크기를 알기 때문에 자동완성이 된다.




그런데 이를 실행하면 이상한 점을 알 수 있다.


eax의 값이 12345678이면


402000에서부터 78 56 34 12 로 정해진다


우선 이를 통해 첫번재 주소와 크기의 조합을 통해 여러 메모리를 사용할 수 있는 편리함이 있음을 알 수 있다.


또한 순서가 이상함을 발견할 수 있다. 이는 '리틀엔디안'이라는것 때문이다.


이 리틀엔디안에 대해서는 다음에 자세히 알아보자



(4...6)

'Study > reversing' 카테고리의 다른 글

리버싱에 대해 알아보자  (0) 2017.08.19
리턴코드 분석  (0) 2017.06.16
어셈블리어 기본명령어  (0) 2017.04.11
리틀엔디안 빅엔디안  (0) 2017.04.11
어셈블리어의 시작과 기본문법  (0) 2017.03.30