컴퓨터보안 및 해킹

해킹 튜토리얼 [시스템 해킹] - stack&register & memory 에 관하여

JayJeon 2021. 4. 6. 21:02

Stack이 무엇인가와 Stack의 작동원리를 설명하는데 중점을 두겠다. (Linux 기반)

 

레지스터와 메모리의 구조를 파악하고 이해하는 것은 시스템의 기본이다.

오늘은 레지스터와 메모리가 어떻게 쓰이고, 어떤 구조를 통해 해킹에 활용되는지 알아보면서 

메모리에서 '스택'이 의미하는게 무엇인지 궁극적으로 알아보면서 마치려고 한다.

 

메모리(RAM) 과 레지스터

 

여기서 이야기하는 메모리는 RAM 이라고 생각하면 편하다. CPU에서 현재 실행중인 프로그램에 필요한 명령어와 데이터를 보유하고 있는 공간, 기억창치이다. 레지스터는 비슷하지만 확연한 차이는 갖는다. CPU가 처리중인 피연산자 혹은 명령어를 가지고 있는 공간이다. 위의 말에서도 보이듯, 메모리가 레지스터보다 저장할 수 있는 공간은 크지만, 처리하는 속도의 경우는 레지스터가 빠를 수 밖에 없다.

 

정리하자면,

 

1. 레지스터가 CPU가 현재 처리 하고 있는 데이터를 보유하는 반면 메모리는 처리에 필요한 데이터를 보유

2. 레지스터는 (32bit, 64bit) 의 메모리 용량을 메모리는 GB~TB 정도의 용량을 보유

3. 프로세서는 메모리 보다 빠르게 레지스터에 접근이 가능하다.

4. 레지스터는 누적레지스터, 프로그램 카운터, 명령어 레지스터, 주소 레지스터 등이 있다. 반면 메모리는 RAM (즉, 컴퓨터의 주 메모리 이다)

 

여기까지 읽고서는 이제 메모리와 레지스터가 둘다, '무언가를 저장하는 공간' 임을 이해하셨을 것 같습니다. 

 

 

한국외국어대학교 이윤석 교수님 Computer Architecture03 자료

이 자료를 통해서 레지스터와 메모리에 대해서 자세하게 알아보려고 합니다. 둘다 같은 메모리이긴 하지만, 하는 역할에 있어서 큰 차이점을 같습니다. 레지스터는 CPU칩 내부에 존재하며 직접적으로 CPU의 연산에 관여하는 데이터를 갖고 있습니다. 그래서 직접적인 데이터 입출력 값을 저장하는 역할을 하죠. 반면에 RAM은 CPU의 레지스터의 저장 공간과는 별도로 데이터 저장 공간을 주소로 지정하여 해당 주소의 데이터를 읽고 쓰는 방식을 취하고 있습니다.

 

 

메모리 구조에서의 Stack영역

메모리 구조에서의 스택은 프로그램에서 함수가 호출될 때 변수들이 저장되는 영역이다. 함수가 호출될 때, 메인 프로그램에서 가지고 있는 변수들이 함수로 넘어갈 수 있게 도와주는 변수들과, 함수자체에서 사용되는 지역변수들이 저장되는 공간이라고 이해하면 된다. CPU가 실행하는 각각의 함수들이 갖게 되는 스택을 스택 프레임이라고 부른다.  그 프레임에 베이스가 되는 주소를 가르키는 포인터가 Base pointer 이다. 

 

스택에 사용되는 레지스터 중 꼭 기억해야하는 것들 3가지가 있다.

 

sp : stack pointer (스택 포인터)

bp : base pointer (베이스 포인터)

ip : instruction pointer (현재 실행시키고 있는 명령어의 포인터)

 

$sp의 의경우 현재 스택의 top을 가르키고, $bp의 경우 스택에 bottom을 가르킨다. 본래의 포인터의 의미와 같게 스택의 첫 주소를 $bp가 가르키고, 바닥에서 top으로 데이터가 쌓인다. 여기서 조금 헷갈리는 개념이 나오게 되는데, 메모리(RAM)의 바닥에서 top으로 스택의 저장이 이루어진다. RAM에 기존 데이터들의 저장방식과는 다르게 스택만 아래에서 위로 데이터가 쌓인다고 생각하면 된다.

 

 

[Calling Convention]

한국외국어대학교 이윤석 교수님 Computer Architecture04 자료

 

Wargame 사이트 시스템해킹 첫번째 강의 참고