Samba의 개발과정

darehanl의 이미지

"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가 작성된 방법입니다.

댓글

keizie의 이미지

의도된 시행착오 끝에 나왔군요.

7339989b62a014c4ce6e31b3540bc7b5f06455024f22753f6235c935e8e5의 이미지

글이 아주 재미있군요. 비유도 적절하고 ;)

gogoonee의 이미지

아... 설명 참 제대로 하네요..
이렇게 설명할 수 있다는건 정말 제대로 알고 있다는 뜻이겠죠..
자신감이 느껴집니다.

kwon37xi의 이미지

Samba - 인내와 끈기의 결정체군요.

http://kwon37xi.egloos.com

lacovnk의 이미지

음.. Samba는 MS의 제지를 받은 적이 없나요?

어떻게 보면 리버스 엔지니어링을 통한 대체물 구현이라고 볼 수도 있을 것 같은데, 궁금해지네요.

비슷한 예로, MSN 프로토콜을 분석해서 사용하는 것 자체는 제지를 받은 적이 없는 것인가요? 예전에 다른 클라이언트는 사용할 수 없도록 프로토콜에 변화를 줬던 것 같은데 말입니다.

dormael의 이미지

전에 회사에서 메신저 에이전트 서비스를 했었는데 특별한 제지는 없었습니다.
나중에 중간에 이상한 업체가 나타나서 자기네가 에이전트 마스터 CP 비슷한걸 MS에서 땄으니 같이 해야 한다고 했습니다.
결국 그 회사나 저희 회사나 일이 흐지부지 되고 저희도 이런저런 이유로 사업을 접었는데 그때까지 별일 없었습니다.
규모가 그리 크지 않아서 그랬을 가능성도 배제할 수 없지요.

아무튼 저희가 구현한 프로토콜이 좀 예전 버전이었고 차후 버전은 몇가지 기능 추가에 관련된 것들이 있었는데 대체적으로 오래된 프로토콜로도 문제없이 돌았습니다. 새로운 기능을 붙이는건 불가능 했지만요. 초기에는 문자열 기반으로만 프로토콜이 되어 있었는데 뒤로 가니까 그게 아니더군요.

이 얘기의 결론은, 자기네 서비스에 큰 지장이 없거나 MS 수준에서 돈다발 같아 보이지 않으면 별루 신경 안쓰는게 아닌가?
이겁니다. 말이 너무 어렵네요.

물론 의사결정 단계도 엄청 길거라 생각합니다. 아마 지금까지 계속 했으면 태클 걸렸을 가능성은 있습니다.

-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.

마잇의 이미지

samba가 이정도면 wine은 엄청나겠네요.

웨이터 무지하게 필요할듯
--
마잇


--
마잇

wish의 이미지

정말 존경스럽네요. 한편으로는 스펙 공개가 없어서 이 생고생을 해야 된다니... 독점 소프트웨어보다 독점 프로토콜이 훨씬 무서운 것 같습니다

young의 이미지

비유가 참 재밌네요.

# ./Go_Go_GO!!!!

# ./Go_Go_GO!!!!

violino의 이미지

프랑스 카페 기법이라고 하는군요.
불어가 가장 어려운 언어라고들 하니 그런 비유를 하는가보죠?
예전에 회사에서 동일한 방법으로 프로토콜 구현을 한 기억이 나네요.
sniffer 쓰면서 단순 막노동을 몇달간 했었지요.
그땐 TCP/IP도 아니고 Ethernet 단의 프로토콜이어서
분석하는게 장난이 아니었습니다.
암튼, 삼바 개발자들의 고충을 조금이나마 이해할 것 같습니다.

litdream의 이미지

욕을 배우기 위해, 지나가는 웨이터의 눈을 찌른후, 웨이터가 뱉어내는 말을 돌아나오면서 받아적는다는 상상을 하니, 웃음이 나옵니다.

삽질의 대마왕...

삽질의 대마왕...

sheep의 이미지

참 재밌는 글이네요...

삼바가 이렇게서 탄생했군요...

--------
From Buenos Aires, Argentina
No sere feliz pero tengo computadora.... jaja
닥치고 Ubuntu!!!!!
To Serve My Lord Jesus
blog: http://sheep.tistory.com (블로그 주소 바꼈습니다)

--------
From Buenos Aires, Argentina
No sere feliz pero tengo computadora.... jaja
닥치고 Ubuntu!!!!!
To Serve My Lord Jesus
blog: http://sehoonpark.com.ar
http://me2day.net/sheep

익명사용자의 이미지

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

꼭 시험기간만 되면 Wow한판 더하고 싶다죠 ㅡㅡ;; 스릴이 좋은건가..

BSK의 이미지

끈기, 인내 or 또는 윗분처럼 재미있어서일까요! 암튼 멋지네요.

/* ....맑은 정신, 건강한 육체, 넓은 가슴으로 세상과 타협하자. */

Scarecrow의 이미지

딴소리지만 프랑스 카페 기법이라는거 정말로 어학에 효과가 있을 것 같습니다.

정식으로 일본어를 배운적이 단 한번도 없으며,
히나카나인지 가타카나인지 뭐가 흘림이고 궁서인지도 잘모르고 읽지도 못하는 저에게

이런 경험이 있습니다.

데쓰노트를 보고 있었는데 상황은 L이 자기가 L이라고 고백하는 타이밍!!
음 저기서 "와타시와 에르데쓰"라고 하겠군
이라고 생각했는데 정말 그렇게 대사를 해버리더군요. -_-"

munhoney의 이미지

멋진 기법이네요 삼바의 탄생 배경을 알게 해준 당신.

최고잉~~~

---------------------------------
http://blog.naver.com/munhoney
---------------------------------

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.