Information Security

주소 vs 메모리 본문

System Hacking

주소 vs 메모리

leeeeye321 2018. 1. 16. 03:43

주소 vs 메모리

C언어는 포인터를 통해 메모리에 대한 직접 접근이 가능하지만,

어셈블리어는 변수를 선언해서 사용하지 않고, 메모리를 직접 사용한다.

 

주소는 메모리 상의 위치(정수)를 나타낸다.

파일에서 오프셋과 동일한 의미를 가진다.

 

메모리는 데이터가 들어있는 실제 공간이다.

 

★ C언어 코드를 어셈블리어로 변환하기

int a;

int b;

int main()

{

scanf("%d", &a);

scanf("%d", &b);

 

printf("a: %d", a);

printf("b: %d", b);

 

return 0;

}

두 변수를 입력받고 입력받은 변수를 출력하는 C언어 코드이다.

코드에서 사용할 함수는 printf, scanf 두 개이다.

 

extern printf

extern scanf

extern을 통해 C라이브러리의 함수를 사용한다.

 

segment .data

input    db    "%d", 00

scanf 함수에서 입력받을 문자열

 

output_a    db    "a: %d", 10, 00

output_b    db    "b: %d", 10, 00

printf 함수에서 출력할 문자열

 

segment .bss

a    resd    1

b    resd    1

초기화되지 않은 데이터는 bss 섹션에, 나머지는 data 섹션에 할당한다.

 

segment .text

global main

main:

 

scanf("%d", &a);

->

push a
push input
call scanf

 

scanf("%d", &b);

->

push b
push input
call scanf

a, b는 변수가 아니라 레이블(주소)이다.

C언어의 변수는 값, 주소, 크기를 가지지만 레이블은 주소만을 나타낸다.

 

printf("a: %d", a);

->

push dword [a]
push output_a
call printf

 

printf("b: %d", b);

->

push dword [b]
push output_b
call printf

함수 인자의 개수는 push의 개수와 일치한다.

a는 위치를 나타내는 주소(정수)이고, [a]는 그 위치에 있는 메모리를 나타낸다. [a]는 C언어에서 *a와 같다.

피연산자에 메모리가 오는 경우 CPU가 얼마만큼 읽을지 알 수 있게 word, byte, dword 중에 하나로 크기를 명시해줘야 한다.


전체 코드는 위와 같다.

 

※ 세그먼트(segment)

 

프로그램이 실행된다는 것은 디스크 상에 위치하는 파일(프로그램)을 메모리(RAM)으로 옮기는 것을 말한다.

옮기는 과정을 바인딩(Binding) 또는 로딩(Loading)이라고 하고, 실행된 프로그램은 프로세스라고 한다.

 

메모리는 커널(OS)이 차지하는 부분을 제외하면 세가지 영역 text, data, stack으로 나눌 수 있다.

나누어진 메모리는 세그먼트, 페이지, 섹션 등으로 불린다.

어셈블리 프로그래밍을 한다는 것은 각각의 세그먼트를 직접 지정해준다는 것이다.

 

data segment

-읽기/쓰기가 가능한 메모리 영역

-프로그램 실행에 필요한 데이터

-data segment는 다시 data, bss, heap 세 부분으로 나눌 수 있다.

-> data는 초기화된 데이터, bss는 초기화되지 않은 데이터를 할당한다.

 

text segment

-실행 권한이 있는 메모리 영역

-쓰기 불가능

-주로 실행할 명령어들이 모여있다.

 

※ 데이터의 크기

접두사: d(data segment), res(reserve)

 

이 어셈블리 코드를 nasm으로 어셈블, gcc로 링크 해주면 test 실행 파일이 생성된다.

실행해서 두 개의 수를 입력하면 입력한 수가 출력되는 것을 확인할 수 있다.

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

함수  (0) 2018.01.23
관계 연산(cmp) + 제어문  (0) 2018.01.19
레지스터(Register)와 사칙연산  (0) 2018.01.18
C언어로 만들어진 프로그램의 실행과정 이해  (0) 2018.01.12
System Hacking 실습 환경 구성  (0) 2018.01.10