본문 바로가기

System Hacking

3일차] 각 메모리 공간의 데이터 표현 + 레지스터

C 언어의 문자표현

- 문자 : '(작은 따옴표)

- 문자열 : " (큰 따옴표)

- c언어에서는 엄격하게 구별한다.

 

NASM의 문자표현

- 문자 'hello, World!!!', 10, 00

      - 문자나 문자열 모두 '(작은 따옴표)으로 표현한다.

- 즉, 'hello, world!!!'는 문자열 10은 \n 00은 null을 의미한다.

- C언어로 표현하자면 "Hello, World!!!\n"; 와 같은 의미이다.

- 변수라는 개념이 존재하지 않는다.

 

 

NASM의 숫자표현

# 위에서 부터, 10진수, 16진수, 8진수, 2진수의 표현방식을 확인할 수 있다. 지금 이 nasm 문서는 2.대 major이기 때문에 실습하고 있는 환경에서 지원하지 않는 것도 있다.

 

[ data segment에서 데이터를 표현 (initialized data segment) ]

- 레이블(msg) : <white space> 크기(db) <white space> 초기값 형태

- 레이블은 변수 이름이 아니다.

- 변수의 개념과는 다른 개념이며 주소의 또 다른 표현이라고 보면 된다.

 

# 여기서는 일단 printf 호출하기 전에 인자로 주소값을 받기때문에 msg(주소값)을 푸쉬해주고 있다고 알고 있자. main도 마찬가지로 레이블이고 main은 시작 명령어의 주소를 의미한다.  entry point(진입점)라고 불린다. 함수의 인자만큼 push를 해준다.

 

[ bss segment에서의 데이터 표현 ]

- 레이블: (white space> 단위 <white spce> 크기

 

- int a;

- char str[1024];   --> 

 

[ text segment에서 명령어 표현 ]

- 레이블 :

명령어

명령어        

...

 

위의 예제를 보면 c언어로 printf(%s %s\n", "hello,", "world!!!");를 어셈블리로 표현한것이다. 각각 msg1 ,msg2, msg3의 주소값을 printf 함수 호출 전에 푸쉬하고 있는 것을 알 수 있는데 여기서 중요한 것은 인자값의 순서가 반대로 들어간다.

 

 

[문제]

(0)_(0)(0)_(0)
(=^.^=)(*^.^*)
(_m_m_)(_m_m_)  ---->> 이모티콘들을 출력하는어셈블리 프로그램

 

or 

 

 

기본 데이터의 단위 (32bit 기준)

 

단위                   크기         C 정의                                           NASM(문자)

 

byte                   1              char                                             b

word                  2              short                                            w

double word        4              int, long(32bit), float, pointer(32bit)     d

quad word           8              long long, double                            q

 

 

 

 

 

[ CPU가 사용하는 데이터 저장소 ]

 

1. 메모리

 

2. 레지스터(register)

- CPU가 사용하는 고속의 기억 소자

- 특별한 용도를 위해서 사용하는 저장공간

- CPU당 한개의 레지스터만 제공

- 레지스터를 새로 생성, 수정, 삭제 등을 할 수 없다.

https://software.intel.com/sites/default/files/managed/a4/60/253665-sdm-vol-1.pdf --->인텔의 레지스터(첨부1)

https://software.intel.com/sites/default/files/managed/a4/60/325383-sdm-vol-2abcd.pdf  ---> 명령어(첨부2)

 

1). 범용 레지스터

- EAX(Extended Accumulator Register) : Accumulator for operands and results data

- EBX(Extentded Base Register) : Pointer to data in the DS segment

- ECX(Extentded Counter Register) : Counter for string and loop operation

- EDX(Extentded Date Register) : I/O pointer

* Accumulator, Base, Counter, Data Register 다방면에서 사용되지만 각 역할을 잘 알아야 한다.

 

2). 포인터 레지스터

- ESI( Extended Source Index)

- EDI(             Dst.            ) --->ESI , EDI 출발과 도착점을 이용해 복사OR반복

- ESP(            Stack Pointer)

- EBP(            Base  Pointer)

- EIP(       Instruction Poiner) ---> 다음에 실행할 명령어를 저장 이것을 바꿔준다면 비정상적인 프로그램을 만들 수 있다.

 

3). 상태 레지스터

http://kimhyun2017.tistory.com/124   //설명 참고.

 

4). 세그먼트 레지스터

skip

'System Hacking' 카테고리의 다른 글

5일차] 연산자 (사칙연산)  (0) 2018.05.15
4일차] 명령어(mov, lea)  (0) 2018.05.14
2일차] 어셈블리 확인하기  (0) 2018.05.10
1일차] 환경 구축 및 컴파일 과정  (1) 2018.05.09
14~15일차]PAM개념  (1) 2018.04.30