오늘은 데이터를 저장하는 방식에 대해 이야기해보겠다.
크게 나누면 메모리를 이용하는 방식과 스택을 이용하는 방식이 있다.
그 중 메모리를 이용하는 방법을 알아볼 것이다.
먼저 데이터 단위이다.
* 데이터의 기본 단위
Unit bytes Letter
byte -> 1 bytes : 표현 B
word -> 2 bytes : 표현 W
double word -> 4 bytes : 표현 D
quad word -> 8 bytes : 표현 Q
ten bytes -> 10 bytes : 표현 T
paragraph -> 16 bytes
* 데이터를 저장하기 위해 사용가능한 메모리
1. 데이터 메모리 : C에서는 전역변수 개념
1) 초기화된 데이터 메모리 영역 :.data
-> 지난 시간까지 사용했던 영역이다.
-> 중간에 type이 db라고 써있는 것에 대해 설명하자면 data 영역에서는 앞에 d를 붙여줘야한다.
그 뒤에 나오는 것은 데이터 단위로 b는 byte로 1 바이트를 나타낸다.
2) 비초기화된 데이터 메모리 영역 : .bss
중간에 type에 앞쪽에 res를 적어주고 그 뒤에는 데이터 타입을 적어준다.
ex) resb
어셈블리 기본 명령어 구조(인텔기반)
- 명령어( pushfd, nop, ret, ... ) 피연산자가 없는 경우도 있다. 단일명령어형태
- 명령어 피연산자( pop esp, jmp addr, ...)
- 명령어 피연산자1, 피연산자2 ( mov ebx, 2 ...)
- 명령어 피연산자1, 피연산자2, 피연산자3 ( mul, ...)
* mov 명령어
mov : 데이터 이동
mov dst, src
- dst에 올수 있는 것은 메모리와 레지스터 외에 다른 값이 올 수 없다.
- src : 메모리, 레지스트리, 일반 값 전부 다 올 수 있다.
이것들을 이용해 실습하면서 확인해보겠다.
먼저 data 영역에 데이터를 저장하고 출력해보겠다.
(어셈블 코드)
이 코드를 실행하면 numbers에 있는 값들이 출력될까?
실행해보면
(실행결과)
우리가 저장한 값은 전혀 아니라는 것을 확인 할 수 있다.
이 값은 numbers의 주소 값이다.
기본적으로 전달할때 어셈블리언어에서는 주소를 전달한다.
그렇다면 data영역에 numbers 에 우리가 1,2,3,4,5 를 저장했는데 이 값을 출력하려면 어떻게 해야할까?
(출력 코드)
이런식으로 [ ] 브라켓에 담아주면된다.
이렇게 표현을 하면 C언어에서 포인터 같은 역할을 하게된다.
주소값이 아닌 그 주소에 있는 데이터 값을 가져온다.
위 코드를 실행하면 1이 출력이 될것이고
그렇다면 그 다음 값인 2를 출력하려면?
(2 출력 코드)
DWORD가 4바이트이므로 4바이트+ 시켜준 주소값으로 브라켓으로 값을 가져오면 된다.
(실행모습)
2가 출력되는 것을 확인 할 수 있다.
DWORD 써준이유?
numbers 라고 우리가 주소값을 전달해주는데 얼마나 가져오라는 말이 없다.
즉 이 말을 안써주면 어디까지 우리가 가져와야하는지 모르니까 DWORD처럼 가져올 단위를 적어줘야한다.
레지스트리에서 안쓴 이유는 레지스트리 이름 자체에 크기를 뜻하기 때문이다.
이번엔 bss 영역에 초기화 되지 않은 변수들에다가 값을 저장하고 그 값을 출력해보겠다.
(bss 코드)
mov 명령어를 통해 number의 위치에 데이터를 10을 저장한다.
그 후 number 위치의 값을 가져와 출력한다.
(실행 결과)
실행 결과 우리가 10을 너어주었는데
10이 잘 출력된 것을 확인 할 수 있었다.
'Hacking > System Hacking' 카테고리의 다른 글
System Hacking - jmp (분기문) (0) | 2017.04.18 |
---|---|
System Hacking - 어셈블리어(사칙연산) (0) | 2017.04.14 |
System Hacking - 레지스터 (0) | 2017.04.12 |
System Hacking - 어셈블리언어, 시스템콜 (0) | 2017.04.11 |
System Hacking - Compile (0) | 2017.04.08 |