쉽게 이해하는 컴퓨터 프로그램 실행 원리

오서영·2022년 3월 23일
0

해당 시리즈에서는 책 "리버싱 입문(조성문 지음/프리렉 출판사)"를 공부하며 배운 내용을 정리한다.

"책 [리버싱 입문] 공부" 시리즈를 들어가기에 앞서

해당 시리즈는 개인적으로 책 "리버싱 입문(조성문 지음/프리렉 출판사)"를 공부하며 배운 내용을 정리하는 용도로 작성되었다.

단순히 책의 내용을 정리하고 베껴 쓰는 것을 지양한다. 대신 공부하며 닥쳤던 어려움들과 해결 과정, 책의 내용을 이해하기 위해 나름대로 가공한 내용들 위주로 작성한다.

그렇기에 책의 전반적인 내용을 다루지 않으며, 개인적으로 공부하며 적는 것이기에 틀린 내용이 있을 수 있다는 점을 미리 고지한다.

컴퓨터 프로그램 실행 원리

컴퓨터 프로그램의 실행 원리를 먼저 살펴보자. 컴퓨터에 대한 이해 없이 보안을 깊이 있게 공부하고자 하는 건 어불성설이기 때문이다.

사용자가 C나 파이썬 등의 고급 언어를 사용해 코드를 작성하면 컴파일러는 이를 컴퓨터가 이해할 수 있는 언어인 기계어로 바꾼다. 이때 기계어가 PE(Portable Executable)파일로 만들어진다.

사용자가 코드를 작성한 이유가 무엇인가? 바로 프로그램으로 원하는 동작을 구현하기 위함이다. 이렇게 직접적으로 프로그램을 실행하는 것이 바로 CPU의 제어장치연산장치이다.

문제는 우리가 컴퓨터로 오직 하나의 프로그램만을 실행하는 게 아니라는 점이다. 우리는 컴퓨터로 카카오톡을 하기도 하고, 영화를 보기도 하고, 인터넷도 사용하고, 문서 작업도 한다. 이 모든 처리를 동시에 실행하기 위해 CPU는 레지스터라는 것을 가진다.

레지스터는 쉽게 생각해 만인의 연인이다. 모두가 레지스터를 원하는데, 정작 레지스터는 하나다.

컴퓨터 프로그램들은 모두 본인의 데이터를 레지스터에 올리기를 원한다. 왜냐하면 그래야 본인들이 실행될 수 있기 때문이다. 하지만 레지스터는 하나이기 때문에, 컴퓨터 프로그램들은 사이좋게 번갈아가며 이를 사용한다. 즉, 문서 작성 프로그램을 실행하다가 잠시 멈추고 인터넷 프로그램에게 자리를 양보해주는 식이다.

그런데, 이렇게 하다보면 문서 작성 작업들이 사라지지 않고 보관되어 있다가 다시 레지스터를 받았을 때 이어갈 수 있도록 하는 보관함이 필요하게 된다. 그래서 레지스터는 잠시 메모리에 이 데이터를 복사해둔다. 이를 컨텍스트 스위칭이라 부른다.

메모리는 하드디스크로부터 PE 파일의 정보를 받아 저장한다.
여기서 의문이 하나 생긴다.
레지스터도 프로그램을 실행하는 데 필요한 데이터를 저장하는데, 굳이 레지스터를 만들 필요가 있었을까?

그 이유는 레지스터는 제어장치와 연산장치가 바로바로 데이터를 가져다 쓰기 위함이다.

제어장치와 연산장치가 프로그램을 실행하기 위해 메모리로부터 데이터를 받아와야 한다. 그런데 메모리는 다른 방에 있어서, 데이터를 가져오는 데 시간이 많이 걸리고 귀찮다. 그래서 레지스터라는 친구를 고용해서 필요한 데이터의 메모리 내용을 그대로 복사하라고 시킨다. 그러면 레지스터는 제어장치와 연산장치와 같은 방에 있기 때문에, 메모리까지 찾아가는 수고를 할 필요가 없어진다.

여기까지 컴퓨터 프로그램의 동작 방식을 살펴보았다.
해당 시리즈 다음 글에서는 abex crackme의 첫 번째 예제를 공부하며 배운 개념 2가지를 다룬다.

profile
개발과 보안에 관심 있는 대학생입니다😎

0개의 댓글