Safari를 열고 싶으면 하단의 독바에 있는 사파리를 클릭하면 되고,

메모장을 열고 싶으면 메모장을 클릭하면 된다. 

하지만 터미널에서 작업을 하고 있는 개발자라면 마우스를 따로 사용하기가 귀찮을수 있는데,

리눅스 우분투와는 달리 맥 터미널에서는 응용 프로그램을 실행하려면 다음과 같이 복잡한 과정을 거쳐야 한다.


$ open /Applications/Safari.app/


리눅스 우분투에서는 safari라고 하는 응용 프로그램이 있으면 단순히 쉘 커맨드에 'safari'라고 입력해주면 된다.



리눅스 우분투에서 손쉽게 하던 응용프로그램 실행을 맥에서도 하고 싶다면? 어떻게 해야 할까?


리눅스 우분투에서는 어떻게 저렇게 간단하게 프로그램 실행이 가능했는지부터 생각해보아야 할 것이다.

기본적으로 우분투에서의 터미널은 bash 쉘을 사용하는데, bash쉘이 기본적으로 사용하는 명령어들이

/usr/bin/ 폴더에 존재하게 된다. 즉, /usr/bin 폴더 아래에 있는 모든 실행 파일들 (혹은 쉘 스크립트)은

어느 경로에서든지 바로 사용이 가능한 것이다.


이 원리를 알았으니 어떻게 하면 될까? 

맥에서는 응용 프로그램이 ~~~.app 과 같은 확장자를 가지고 있고, /Applications/ 폴더 아래에 있는데, 이들을 함부로 

위에 있는 경로로 옮기면 될까? 이후 앱 실행에 있어서 문제가 발생할 여지도 있고, 

spotlight 서비스에서 응용 프로그램을 찾는 등의 과정을 굳이 방해하고 싶지 않을 것이다.


그렇다면 해결책은 무엇인가?

shell script를 만들어 위에 있는 명령어를 손쉽게 해결해주도록 만들 것이다.

shell script를 다음과 같이 작성해보자. 파일 이름은 'safari'라고 작성하자.

#!/bin/bash

open /Applications/Safari.app/

만든 쉘 스크립트 파일을 '실행'하려면 실행권한을 주어야 한다. 

아래와 같은 명령어를 통해 실행권한을 주도록 한다.

$ sudo chmod +x safari

그 후에 만들어진 쉘 스크립트 파일을 /usr/bin폴더로 옮기도록 하자.

$ sudo mv safari /usr/bin/


이로써 작업은 끝났다! 앞으로 여러분은 어디서든지 'safari'라고 명령어를 치기만 하면 바로 safari앱을 실행할 수 있다.




| 메모리 브레이크포인트


메모리 브레이크포인트(Memory Breakpoint)는 사실 브레이크포인트가 아니다. 디버거가 메모리 브레이크포인트를 설정하면 해당 메모리 영역이나 페이지에 대한 접근 권한이 변경된다. 메모리 페이지는 운영체제가 처리하는 가장 작은 단위의 메모리 크기다. 메모리 페이지가 할당되면 그곳에 대한 접근 권한이 부여된다. 메모리 페이지에 부여되는 접근 권한은 다음과 같다.



- 페이지 실행(Page Execution) 이 권한이 할당된 메모리 페이지는 실행시킬 수 있다. 하지만 이 메모리 페이지에서 데이터를 읽거나 쓰려고 하면 접근 위반 예외가 발생한다.


- 페이지 읽기(Page Read) 프로세스는 이 권한이 할당된 메모리의 내용을 읽을 수 있따. 하지만 데이터를 쓰거나 실행시키려고 하면 접근 위반 예외가 발생한다.


- 페이지 쓰기(Page Write) 이 접근 권한은 프로세스가 해당 메모리 페이지에 데이터를 쓰는 것만 허용한다.


- 보호 페이지(Guard Page) 이 권한이 할당된 페이지에 대해 어떤 종류의 접근이라도 발생하면 예외를 발생시킨다. 예외를 발생시킨 이후에는 페이지의 원래 상태로 복귀된다.



대부분의 운영체제는 이와 같은 접근 권한들을 지원한다. 예를 들어 메모리상에는 읽고 쓰는 것이 가능한 메모리 페이지가 있을 수 있고 읽고 실행하는 것이 가능한 또 따른 메모리 페이지가 있을 수 있다. 또한 각 운영체제는 특정 메모리 페이지의 접근 권한을 질의하거나 접근 권한을 원하는 대로 변경시킬 수 있는 내장 함수를 제공한다. 



메모리의 접근 권한 중에서 우리의 관심사는 바로 보호 페이지(Guard Page) 권한이다. 이 접근 권한은 스택에서 힙을 분리해내거나 특정 메모리 영역이 어떤 범위 이상으로 커지는지 확인하는데 유용하다. 또한 특정 메모리 영역에 대한 접근이 발생할 때 프로세스를 중지시키고자 할 때 매우 유용하게 사용된다. 


예를 들어 네트워크 서버 어플리케이션을 리버스 엔지니어링할 때 어플리케이션에 전달된 패킷의 페이로드가 저장되는 메모리 영역에 메모리 브레이크포인트를 설정할 수 있다. 이렇게 하면 브레이크포인트를 설정한 메모리에 대한 접근이 발생했을 때 CPU가 보호 페이지 디버그 예외를 발생시키기 때문에 어플리케이션이 전달된 패킷의 내용을 언제, 어떻게 사용하는지 판단할 수 있게 된다. 그리고 해당 메모리 페이지에 접근하는 명령을 조사해 어플리케이션이 패킷의 내용으로 어떤 작업을 수행하는 것인지 알아낼 수 있다. 메모리 브레이크포인트는 실행되는 어떤 코드도 변경하지 않기 때문에 소프트 브레이크포인트가 갖고 있는 코드 변경으로 인한 제약을 극복할 수 있다.





+ Recent posts