티스토리 뷰

개발/Network

[펌] Samba의 개발과정

Jaeyeon Baek 2017.06.02 18:28

원문 링크 : https://kldp.org/node/75861

이 글은 darehanl님이 작성하신 글인데 너무 주옥같은 내용이라 퍼왔습니다. 가급적이면 KLDP에 원문으로 읽어주시고, 필요하면 댓글은 그쪽에 달아주세요. 원문에 대한 예의입니다. :-)  

그럴거면 왜 퍼왔냐는 질문은 댓츠노노! kldp에 혹여라도 천재지변이 생길까봐요?




"How Samba was written"을 번역해보았습니다. 프로토콜을 역공학하는 기법들을 소개하는 글이며, 라이선스는 Creative Commons Attribution-Share Alike 2.0이고, 다행히 Tridgell님의 허락을 얻을 수 있었습니다.

번역 이유는... 1 기말고사 공부하기 싫어서, 2 글이 재미있어서, 어떤게 정달일까요?;;;;

Samba의 개발과정
---------------------

글쓴이: Andrew Tridgell
2003년 8월

원문: <http://samba.org/ftp/tridge/misc/french_cafe.txt>

옮긴이: 박선재
2006년 12월

---------------------

첫번째 방법:
---------

우선, CIFS/SMB 프로토콜에 관한 공개 문서가 몇 가지 있습니다. 비록 내용이 충분치 않고 정확하지도 않지만, 첫 발을 내디딜 때는 상당히 유용합니다. 가장 중요하다고 할 수 있는 문서는 아마 1997년에 나온 draft-leach-cifs-v1-spec-02.txt일 겁니다. 이 문서는 SNIA에서 공개한 프로토콜 명세 문서며 마이크로소프트에서 주로 작성한 문서입니다(필자를 포함한 몇 사람의 의견도 상당 부분 들어있지만). 이 문서는 IETF 초안 문서로서 수명이 다했고 마이크로소프트에서도 CIFS을 IETF 표준으로 받아들이려고 한 노력을 중단하기는 했지만, 인터넷 검색 엔진으로 찾으려고 노력만 한다면 여전히 구할 수 있는 문서입니다.

CIFS/SMB 프로토콜 부분부분에 관한 공개 명세도 많이 있습니다. 필자가 현재 알고 있는 명세 문서들은 http://samba.org/ftp/samba/specs/에 정리해두었습니다.

두번째 방법:
---------

필자는 이 방법을 "프랑스 카페 기법"이라고 부릅니다. 프랑스어를 배우고는 싶은데, 공부할 수 있는 책도, 수강할 수 있는 수업도 없다고 상상해봅시다. 그렇다면 프랑스행 비행기를 타고 카페에 앉아서 주변 대화를 듣기로 할 수도 있지요. 주변 손님들이 웨이터한테 무슨 말을 하며 어떤 음식을 받는지 확인하면서 메모를 해둘 수 있습니다. 이렇게 하면 "빵"이라든지 "커피" 등의 단어를 배울 수 있게 됩니다.

마이크로소프트가 프로토콜을 확장했을 경우 이에 대해 알기 위해서는 Samba에서도 이 방법을 사용합니다. 네트워크 스니퍼를 사용하여 마이크로소프트의 클라이언트와 서버 간의 대화를 듣고 각 질의마다 어떤 내용을 보냈는지를 관찰하다보면, "파일 크기"나 "datestamp"에 해당하는 "단어"들을 배울 수 있습니다.

"프랑스 카페 기법"의 한계로는 다른 손님들이 사용하는 단어들만 배울 수 있다는 점이 있습니다. 그 외 다른 단어를 배우려면 어떻게 해야 할까요? 예를 들어 프랑스어로 욕을 하고 싶다면? 카페에서 뭔가를 주문한 다음, 웨이터가 주문을 받으러 올 때 발을 밟던지 눈을 찔러보는 방법을 생각해볼 수 있습니다. 그리고 카페에서 쫓겨나는 동안 그 웨이터가 사용한 단어들을 메모해서 정리하시면 됩니다.

"오류 패킷"은 네트워크 프로토콜의 욕에 해당합니다. Samba를 개발할 때 오류 상황에 대처하는 방법을 알아야 합니다. 이 방법을 알기 위해서 Samba에서는 없는 파일에 접근한다든지 크기가 너무 작은 버퍼를 사용한다든지, 소유자가 아님에도 파일에 접근해본다든지 하는 프로그램을 작성합니다. 그리고 나서 각 상황에 따른 오류 코드를 확인해서 메모를 합니다.

세번째 방법:
--------

세번째 방법은 앞에서 언급한 "욕 배우는 기법"을 크게 확장한 기법입니다. 이 기법은 "프로토콜 스캐너"라는 프로그램을 사용합니다. 프로토콜 스캐너는 프로토콜 내 한 영역에서 사용할 수 있는 "단어"를 전부 사용해보고 그 반응을 통해 프로토콜에 관한 정보를 자동으로 얻는데 사용하는 프로그램입니다. 프랑스 카페 기법과 같지만 이번에는 웨이터가 무척 인내심이 있는 경우죠.

예를 들어, 프로토콜 내에 서버가 수행할 작업을 지정해주는 16비트 "명령어"가 있을 수 있습니다. 사용할 수 있는 명령어는 총 6만 4천가지이므로, 하나씩 전부 시도해보고 그 결과가 "지원 안 됨"이 아닌 오류 코드인 경우를 모두 기억해둡니다. 그 다음에는 각 명령어가 사용하는 보조 데이터의 크기가 얼마나 되는지를 확인해야 하므로, 프로그램은 먼저 빈 데이터 1바이트를 보내보고, 이어서 2바이트, 3바이트를 보내 서버의 반응이 언제 달라지는지를 확인합니다. 서버의 반응이 달라질 경우 보조 데이터의 크기를 찾았을 가능성이 상당히 높습니다. 그 다음 이번에는 서버가 또 다른 반응을 보일 때까지 파일 이름이라든지 디렉토리 이름 등의 비어있지 않은 데이터를 보내봅니다. 수많은 시도 끝에 프로그램은 드디어 오류가 아닌 메시지를 받게 됩니다. 서버가 요청을 받아들인 거지요! 드디어 새로운 "프랑스어" 문구를 찾은 겁니다.

서버가 요청을 받아들이게 되면 이제 이 요청이 실제로는 무엇을 하는지 알아내야 합니다. 사용할 수 있는 명령인지는 이제 알겠지만, 무슨 명령일까요? 이를 알기 위해서는 새 명령을 보낸 다음, 전에 파악해두었던 명령들을 사용하여 서버의 파일 정보를 잔뜩 얻어옵니다. 날짜가 바뀌었을까요, 아니면 파일 이름이 바뀌었을까요? 결국에는 그 명령이 무슨 명령인지를 파악하게 됩니다.

네번째 방법:
--------

여기에 정리할 만한 마지막 기법으로는 "차이 기법"이라는 것이 있습니다. 이 기법은 서로 다른 명령어 간의 상호작용에 관해 파악하고자 할 때 사용합니다. 다시 (이제는 끝도 없이 확장해버린) 프랑스 카페에 관한 비유를 사용하자면, 케이크 대신에 비스킷과 함께 커피를 마시고자 할 경우에는 사용해야 하는 단어가 다른 지를 파악하려고 하는 것과 같습니다. 그 과정은 다음과 같습니다.

새로 익힌 프랑스어에 관한 지식을 이용하여 가상 웨이터를 만듭니다. 이 프로그램은 실제 프랑스 웨이터처럼 행동하도록 되어 있습니다. 그 다음 실제 웨이터와 가상 웨이터에게 갖가지 프랑스어 문구를 보내는 프로그램을 작성합니다. 이 프로그램은 두 웨이터의 반응들을 살펴보고 그 차이점을 확인하는 프로그램입니다. 그리고 이 과정을 잘 메모해둡니다.

두 웨이터의 반응이 다를 경우 메모해둔 내용을 살펴보고 이번에는 문구 하나를 뺀 다음 같은 문구들을 다시 보내봅니다. 이번에는 웨이터들의 반응이 서로 같나요? 만약 같다면 방금 뺀 문구가 두 웨이터 간의 차이에 중요한 영향을 끼쳤다는 것을 알 수 있습니다. 하지만 문구 하나를 뺐어도 여전히 다르다면 아닙니다. 이 방법을 통해 두 웨이터의 반응을 서로 다르게 하는 문구의 순열을 최소한으로 줄일 수 있습니다.

일단 이 순열을 얻었으면 이를 잘 째려본 다음 앞에서 언급했던 기법들을 사용해 가상 웨이터에 뭐가 문제인지를 파악합니다. 그래서 문제를 해결했으면 가상 웨이터가 실제 웨이터와 같은 반응을 보일 때까지 이 기법을 계속 사용합니다.

이제 위에서 정리한 기법들(과 굳이 정리하지 않은 것들)을 12년 간 사용한다고 생각해봅시다. 바로 이것이 Samba가 작성된 방법입니다.


댓글
댓글쓰기 폼