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 |