반응형

오늘은 네트워크를 공부해볼 것이다.

유명 오픈소스 IDSSuricata(수리카타)에 대해 공부해보자.


1. Snort? Suricata?

본 주제에 들어가기 전에 Snort부터 이야기를 해보려고 한다.

Snort(스노트)는 sourcefile사에서 만든 오픈소스 IDS(Intrusion Detection System)

실시간 트래픽을 분석하거나 패킷 로깅 용도로 오랫동안 사랑 받아왔다.

또, 그동안의 수많은 개발자들에 의한 rule을 제공받을 수 있고 다양한 OS를 지원한다.

그러나 Snort에도 단점이 존재했는데, 그건 바로 단일-스레드 처리방식이었다.

시간이 지날 수록 처리해야 할 트래픽은 늘어가지만

단일-스레드 방식으로 이 모든 데이터를 처리하기엔 한계가 있었다.

 

그래서 해당 단점을 보완하고자, Suricata가 등장한다.

Suricata(수리카타) 역시 오픈소스 IDS(Intrusion Detection System)이다.

Snort를 발전시킨 만큼, Snort 룰이 호환되어 사용 가능하다.

무엇보다 멀티 코어와 멀티-스레드 처리방식으로 데이터를 처리할 수 있어서

현재도 많은 사랑을 받고있다.

뿐만 아니라 하드웨어(GPU) 가속 역시 지원하기 때문에 큰 기업에서도 많이 사용한다.

 

아래는 Snort와 Suricata에 대한 비교 사진이다.

출저 :  http://wiki.aanval.com/wiki/Snort_vs_Suricata



2. Suricata - 설치

리눅스Suricata를 설치해보자.

 

기존엔 복잡한 방법으로 설치하였으나 최근엔 쉽게 설치가 가능하다.

우선 본인은 기존에 설치되어 있는 OS인 Kali linux 5.3.0버전에서 진행하였다(참고로 Kali에서 실습하는건 추천하지 않는다).

 

1. (sudo)apt-get install suricata 명령어로 설치(본인은 이미 설치가 되어있음)

 

2. suricata 명령어로 실행 확인



3. Suricata - rule 생성

80 포트(HTTP)와 443 포트(HTTPS)를 사용하는 두가지 사이트에 대한 필터링 룰을 생성해보겠다.

1. suri.rules 파일을 생성한다.

2. 해당 파일에 문법에 맞게 rule을 작성한다. > 문법은 https://suricata.readthedocs.io/en/suricata-4.1.4/rules/intro.html 참고

alert tcp any any -> any 80 (msg:"80site.com Access"; content:"GET /"; content:"Host: "; content:"80site.com"; sid:10001; rev:1;)
alert tcp any any -> any 443 (msg:"443site.com Access"; flow:to_server,established; tls_sni; content:"443site.com"; sid:10002; rev:1;)



4. Suricata - 실행

rules 파일까지 작성이 끝났다.

이제 Suricata를 실행시켜보자.

 

1. suricata -s suri.rules -i eth0 명령어로 인터페이스와 파일을 인자로 넣어 실행한다.

2. 해당 사이트에 접속한다(본인은 80포트는 교수님 사이트, 443포트는 얼굴책 사이트를 지정하였다)

 

3. 로그파일을 확인한다. > /var/log/suricata/fast.log에 룰 정책에 의한 접속 로그들이 저장된다.

4. 위와 같이 조건대로 log가 저장된 것을 확인 가능하다.


여기까지 suricata를 실습해보았다.

오픈소스로 사용하기 아까울 정도로 잘 만들어논 프로그램 같다.

Suricata를 올바르게 사용한다면 기업 입장에선 비용을 많이 절감할 수 있어보인다.

 

이후 편에서 문법부터 상세한 설명을 포함하여 포스팅해볼 예정이다.

반응형

반응형

드디어 PE(Portable Executable) 파일 포맷 포스팅을 하고자한다.

내용이 길것으로 예상되나 중요한 파트이므로 천천히 짚고 넘어가자.


1. PE 포맷?

PE 포맷이란 Portable Executable 약자로 윈도우 운영체제에서 사용되는 실행 가능한 파일 형태를 말한다. 

아래서 설명할 PE 파일은 말그대로 PE 포맷 구조를 가지는 파일이다.

 

대표적인 포맷인 만큼 다양한 분석툴에서 PE파일을 분석할 수 있다.

PE Viewer가 대표적이며 본 포스팅에선 개념 이해를 위해 HxD를 이용해 설명하도록 하겠다.

 

 

2. PE 파일 종류

PE 포맷을 가진다고 무조건 실행하는 계열의 확장자만 해당되는 것이 아니다.

다음과 같은 다양한 파일 포맷이 PE 구조를 가진다. 대표적으로 .exe와 .dll이 존재한다.

  • 실행 계열 : EXE, SCR
  • 드라이버 계열 : SYS, VXD
  • 라이브러리 계열 : DLL, OCX, CPL, DRV
  • 오브젝트 파일 계열 : OBJ


3. PE 파일 구조

PE 파일은 다음과 같이 구성되어있다.

  • Header + Section

Header란 실행 파일의 성격과 특징을 나타내며(프로그램 구동 정보 등등),

Section은 구체적이고 세부적인 기능을 나타낸다(코드, 전역변수 등등) .

 

위 구조를 그림으로 좀더 자세히 표현하자면 아래와 같다.

 

각 영역에 대해 살펴보자.

 

 

4. PE 파일 구조 - DOS 영역

MS에서 DOS 파일에 대한 하위 호환성을 고려하여 PE 파일 포맷을 만들었다.

DOS 영역의 두가지 영역을 살펴보자.

 

1) DOS Header

이제부터 몇몇 영역을 아래와 같이 소스코드로 나타낼 건데, 이는 MS에서 제공하는 winnt.h에서 가져온 내용이다.

typedef struct _IMAGE_DOS_HEADER {
    WORD   e_magic;                     // Magic number > DOS Signature : 4D5A("MZ")
    WORD   e_cblp;              
    WORD   e_cp;                     
    WORD   e_crlc;                    
    WORD   e_cparhdr;             
    WORD   e_minalloc;               
    WORD   e_maxalloc;          
    WORD   e_ss;               
    WORD   e_sp;                     
    WORD   e_csum;                   
    WORD   e_ip;                     
    WORD   e_cs;                    
    WORD   e_lfarlc;            
    WORD   e_ovno;                   
    WORD   e_res[4];                
    WORD   e_oemid;                  
    WORD   e_oeminfo;                  
    WORD   e_res2[10];                 
    LONG   e_lfanew;                    // Offset of NT Header
  } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

DOS Header 영역으로 중요한 정보는 두가지다.

첫번째 e_magic 값과 e_lfanew 값이다.

  • e_magic : DOS Signature 값으로 0x4D5A("MZ")라는 값을 가진다.
  • e_lfanew : NT Header의 오프셋 주소를 가진다. DOS Stub 영역을 점프하는 역할을 한다.

2) DOS Stub

에러메세지를 출력하는 부분이다.

가변적인 영역으로 옵션에 의해 존재여부를 결정한다.

없어도 파일은 잘 실행된다.

 

 

5. PE 파일 구조 - NT Header 영역

NT Header 영역은 3가지 영역이 존재한다.

 

1) PE File Signature

NT Header 시작부분에 위치하며 PE File Signature 값으로 0x5045("PE")라는 값을 가진다.

 

2) PE File Header(IMAGE_FILE_HEADER)

typedef struct _IMAGE_FILE_HEADER {
    WORD    Machine;
    WORD    NumberOfSections;
    DWORD   TimeDateStamp;
    DWORD   PointerToSymbolTable;
    DWORD   NumberOfSymbols;
    WORD    SizeOfOptionalHeader;
    WORD    Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

 이 부분에서 중요한 정보는 Machine, NumberOfSections, SizeOfOptionalHeader, Characteristics로 4가지 이다.

  • Machine : CPU별로 고유한 값을 가진다. 0x014C는 IA-32, 0x0200은 IA-64와 같은 값을 가지고 있다.
  • NumberOfSections : 섹션의 갯수를 나타내며, 1개 이상의 값을 가진다.
    *만약 정의된 섹션수 > 실제 섹션 : error

    *만약 정의된 섹션수 < 실제 섹션 : 정의된 섹션수만큼 인식
  • SizeOfOptionalHeader : 마지막 멤버 Optional Header32 구조체의 크기를 나타낸다.
  • Characteristics : 파일의 속성을 나타낸다. 실행 가능한 파일인지, dll 파일인지와 같은 정보 등을 나타낸다.

3) PE File Optional Header(IMAGE_OPTIONAL_HEADER)

typedef struct _IMAGE_DATA_DIRECTORY {
    DWORD   VirtualAddress;
    DWORD   Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
 
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES    16
 
typedef struct _IMAGE_OPTIONAL_HEADER {
    WORD    Magic;
    BYTE    MajorLinkerVersion;
    BYTE    MinorLinkerVersion;
    DWORD   SizeOfCode;
    DWORD   SizeOfInitializedData;
    DWORD   SizeOfUninitializedData;
    DWORD   AddressOfEntryPoint;
    DWORD   BaseOfCode;
    DWORD   BaseOfData;
    DWORD   ImageBase;
    DWORD   SectionAlignment;
    DWORD   FileAlignment;
    WORD    MajorOperatingSystemVersion;
    WORD    MinorOperatingSystemVersion;
    WORD    MajorImageVersion;
    WORD    MinorImageVersion;
    WORD    MajorSubsystemVersion;
    WORD    MinorSubsystemVersion;
    DWORD   Win32VersionValue;
    DWORD   SizeOfImage;
    DWORD   SizeOfHeaders;
    DWORD   CheckSum;
    WORD    Subsystem;
    WORD    DllCharacteristics;
    DWORD   SizeOfStackReserve;
    DWORD   SizeOfStackCommit;
    DWORD   SizeOfHeapReserve;
    DWORD   SizeOfHeapCommit;
    DWORD   LoaderFlags;
    DWORD   NumberOfRvaAndSizes;
    IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

PE Header 중 가장 크기가 큰 구조체다.

실행에 필수적인 값들이 존재하므로 잘못 값들이 세팅되면 프로그램이 실행되지 않는다.

모두 중요하지만 특히 중요한 정보들에 한하여 설명하겠다.

  • Magic : IMAGE_OPTIONAL_HEADER32이면 10Bh, IMAGE_OPTIONAL_HEADER64면 20Bh
  • AddressOfEntryPoint : EP(Entry Point)의 RVA(Relative Virtual Address)값을 가짐
  • ImageBase : 프로세스 가상 메모리(32bit) : 0 - FFFFFFFFh, 로딩(매핑)된는 시작 주소를 나타냄
  • SectionAlignment, FileAlignment : PE 파일은 섹션으로 나뉨, SectionAlignment는 메모리에서 섹션 최소단위, FileAlignment는 파일에서 섹션의 최소단위 나타냄
  • SizeOfImage : PE 파일 메모리 로딩 시 가상 메모리에서 PE Image가 차지하는 크기
  • SizeOfHeader : PE Header 전체 크기
  • Subsystem : 1이면 Driver 파일(sys, vxd), 2면 GUI 파일, 3이면 CUI 파일
  • NumberOfRvaAndSizes : 마지막 멤머 DataDirectory 배열 크기
  • DataDirectory : IMAGE_DATA_DIRECTORY 구조체의 배열


6. PE 파일 구조 - Section Header 영역

Section Header 영역은 Section에 대한 구성 정보를 담고 있다.

#define IMAGE_SIZEOF_SHORT_NAME              8

typedef struct _IMAGE_SECTION_HEADER {
    BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];
    union {
            DWORD   PhysicalAddress;
            DWORD   VirtualSize;
    } Misc;
    DWORD   VirtualAddress;
    DWORD   SizeOfRawData;
    DWORD   PointerToRawData;
    DWORD   PointerToRelocations;
    DWORD   PointerToLinenumbers;
    WORD    NumberOfRelocations;
    WORD    NumberOfLinenumbers;
    DWORD   Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

5가지 정보에 대해 설명하겠다.

  • VirtualSize : 메모리에서 섹션이 차지하는 크기
  • VirtualAddress : 메모리에서 섹션 시작 주소(RVA), SectionAlignment에 맞춰 결정
  • SizeOfRawData : 파일에서 섹션이 차지하는 크기
  • PointerToRawData : 파일에서 섹션 시작 위치, FileAlignment에 맞춰 결정
  • Characteristics : 섹션의 속성

*RVA는 메모리에서 주소를 나타내며, RAW는 파일에서의 주소를 나타낸다.

*RVA를 RAW로 공식을 적용하여 계산할 수 있다.

  • RAW = RVA - VirtualAddress + PointerToRawData
  • 만약 RVA가 101400h, VirtualAddress가 101000h, PointerToRawData가 100000h이면 RAW 값은 100400h

7. PE 파일 구조 - Section 영역

Section 영역은 PE 파일의 실제 데이터를 담고 있다.
대표적인 몇몇 영역을 설명하겠다.

  • .text : 실행코드, 형식 제한 없음, 읽기 권한 지님, 리틀엔디안
  • .data : 초기화된 각종 변수, 형식 제한 없음, 읽기/쓰기 권한 지님
  • .rdata : 읽기 전용
  • .idata : import 섹션으로 DLL/함수 정보
  • .edata : export 섹션으로 - 본인함수 정보
  • .rsrc : 리소스, 비실행, 읽기 권한 지님, 파일 버전이나 아이콘 등 기타 데이터 정보
    ...

이외에도 다양한 영역이 존재한다. 여기까지 이론을 마치고 실습을 해보겠다.



8. notepad.exe 분석

HxD를 통해 위와 같은 구조로 notepad.exe를 분석할 수 있다.

NT Header의 PE File Header 부분까지 살펴보자.

1. DOS Header의 DOS Signature 값인 4D 5A를 확인할 수 있음

2. NT Header Offset을 나타내는 lfanew 값인 F8 00 00 00를 확인하여 F8 주소로 점프

3. 50 45라는 NT Header 시작부분인 PE File Signature를 볼 수 있음

4. NT File Header 부분 Magic값인 64 86를 통해 AMD64 CPU체제 확인 가능

5. 이어서 NumberOfSections이 07 00을 통해 7개의 섹션을 가진 것 확인

6. SizeOfOptionalHeader을 통해 IMAGE_OPTIONAL_HEADER32가 F0의 크기를 가진 것 확인

7. Charateristics값인 22 00을 통해 실행가능파일부터 다양한 정보 확인가능

 

각 헥스값에 대한 의미는 추가적인 검색을 통해 의미를 파악할 수 있으며

위와 같이 분석을 진행해 나가면 된다.

물론 실전에선 PE Viewer와 같은 전용 분석툴을 통해 분석하면

쉽게 구조를 파싱하여 확인 가능하므로 참고하자.

 


 

여기까지 PE 공부를 마친다. 다음시간엔 OLE 구조를 공부해보겠다.

반응형

반응형

어느덧 수료를 한지 한달이 되어간다.

작년 이맘때 지원서를 쓰고 있었는데 9기 모집공고를 보고있자니 마음이 새롭다.

오늘은 BoB 8기 보안제품개발트랙 수료 후기를 올리고자한다.

경연단계(TOP30)까지 운이 좋게 진출하게 되어 다양한 이야기를 풀 수 있을 것같다.


1. 공통교육

"이런 분야도 있구나"

 이번 8기에선 공통교육을 통해 200명의 교육생들이 모든 트랙의 수업을 듣고, 2주뒤 시험을 통해 트랙을 선택하는 형식으로 진행되었다. 이번에 처음에 시도되었다고 들었는데, 솔직히 본인은 너무 좋았다.

 포렌식, 보안 컨설팅 트랙과 같이 잘 모르고있던 분야에 대한 정보를 많이 얻게되었고, 매력도 느끼게 되었다.다양한 분야에 계시는 멘토님들에게 교육을 받는다는 것은 정말 소중한 경험이었다. 물론 본인은 보안제품개발트랙으로 지원하여 선택도 보안제품개발트랙으로 하였지만, 가끔 지원트랙과 다른 트랙으로 가는 인원도 몇몇 존재하였다.

그만큼 다양한 분야에 대한 매력을 맛볼 수 있는 기간이었다.



2. 1차 교육

"이런 기술도 있구나"

 1차 교육기간엔 각 트랙에 대한 교육을 받게 된다. 참고로 이 2달동안 주말이 없다.

주 7일동안 교육이 진행되며, 많은 수업과 과제로 보통 교육생들은 이 기간에 하나둘 자신을 내려놓기 시작한다.

본인도 역시 4일은 센터에서 자고 거의 살다싶이했다. 물론 그만큼 배운것은 많다. 1차 교육기간엔 정말 다양한 정보들을 많이 접한 것같다. 네트워크 프로그래밍, 화이트박스암호, AI 등 여러 분야에 대한 지식을 얻었다.

 이뿐 아니라 개발, 프로젝트 방법론부터 협업에 필요한 기술들까지 배웠다. 이외에도 정말 많은 수업이 있지만 하나하나 말하기엔 너무 길다. 일단 이 기간에 느낀건 한 분야에 대해서 0부터 10까지 알려주는 것이 아니라, 다양한 분야에 대해서 맛보기처럼 알려주고 본인이 이 중에 맛있는 것을 직접 찾아 공부해나가라는 느낌이었다. 그래서 BoB 교육을 들으면 성장하는 것이라기보단 교육받은 주제에 대해 직접 공부를 하고 주변 교육생들과 이야기를 하는 과정에서 성장해나가는 것이라 느꼈다.

'아직도 난 화이트박스 암호 수업이 끝나고 2시간동안 토론을 하던 우리 보안제품개발트랙 친구들을 잊지못한다.'



3. 2차 프로젝트

"모든 고통을 느껴라!"

 드디어 2차 프로젝트 기간이다. 4달간 프로젝트를 진행하며 아주 많은 경험을 할 수 있게 된다.

1차 교육기간부터 프로젝트를 위해 미리 팀구성을 하는 팀도 있는데 부질없다고 생각한다.

사실 본인 팀이 그랬는데 7월부터 팀구성부터 주제선정까지 끝내놓았으나 막상 팀빌딩날에 담당 멘토님을 구하지 못해 팀이 해체될뻔했고, 주제를 계속해서 바꿔가며 새벽 3시에야 팀이 만들어지게 되었다.

 

 본인은 팀에서 PM(Project Manager)을 맡게 되었으며 주제는 클라우드 관련 주제였다. 하지만 구체화되지 않아 사실상 미정인 상태와 같았다(그래서 팀명도 '미정이'었다). 다른 팀들이 1달동안 프로젝트를 진행할때, 우리 팀은 1달동안 주제선정을 했다.

고통을 겪던 와중 한 팀원이 '데이터 조각 자동 분류 모델 설계 및 모듈 개발'이란 좋은 주제를 던져주었고, 모든 팀원들의 관심 분야가 포함된 주제였기 때문에 해당 주제로 프로젝트를 진행하게 되었다. 이후 팀이름은 '미정이'에서 '확정이'로 바뀌게 되었고, 모든 팀원은 그동안 한을 풀듯이 엄청난 속도로 프로젝트를 진행해 나갔다. 팀원 중 아무도 AI를 공부해본 경험이 없었으나 팀원 모두 책과 논문을 통해 딥러닝, CNN에 대한 공부를 밤을 새어가며 진행했다.

 결국 우린 프로젝트 목표인 데이터 조각 자동 분류 모델 설계 및 모듈 개발을 마쳤고, 운이 좋게 공모전 수상과 논문 구두발표와 같은 소중한 경험도 하게되었다.

 

 그런데 이렇게 산전수전 다겪어도 다른팀 이야기를 들어보면 우린 팀이 겪은 고통은 아무것도 아니더라. 2차 프로젝트는 이러한 기간이다. 이글에 모두 담지못할 정도로 다양한 일이 일어나며 그만큼 느끼는 것이 많은 기간이다. 개인적으로 이 2차 프로젝트 기간이 BoB의 꽃이라 생각한다. 본인도 프로젝트 관리, 협업, 대화, 기술과 같이 여러 방면에 있어서 배운 것이 많았다.



4. 경연단계

"끝난줄알았지?"

 2차 프로젝트 기간이 끝나면 경연단계 진출자들이 발표나고 이들은 TOP10 선별과정에 들어가게된다.

본인은 많이 부족하다고 생각하였으나 운이 좋게 TOP30에 진출하게 되었다. 덕분에 수료시험을 보지않게 되었고 질높은 수업을 들을 수 있게 되었다(TOP30이 아니여도 3차 교육은 들을 수 있다).

경연단계에선 1차 교육보다 심화된 수업을 진행하며 과제가 더 어려워지고 다양해지게 된다. 본인도 여기까지 온거 더 열심히하자는 마음으로 과제를 열심히 수행하려고 노력했던 것같다.

 경연단계에선 공통된 주제로 각자 개인 프로젝트를 진행하게 된다. 올해 주제는 리버스 오델로를 두는 AI를 개발하는 것이었다. GUI, 다양한 알고리즘 그리고 네트워크에 대해 공부를 진행하며 해당 프로젝트를 완성나가고 각 교육생은 자신이 만든 알고리즘으로 서로 대결한다. 여기서 이긴 횟수는 경연단계 점수에 반영되게 된다.

 이외에도 HWP 악성코드를 탐지하는 백신을 개발하는 과제부터 다양한 과제를 만나게 되는데 과제 하나하나 주옥같아 열심히 수행했다. 덕분에 이 기간엔 전공지식에 대한 정보를 많이 쌓을 수 있었던 것같다.

 

 이렇게 경연단계가 끝나면 1, 2, 3차 교육 점수를 계산하여 TOP10을 선정하게 된다. 참고로 본인은 TOP10 진출에는 실패했다. 지나고보니 정말 아쉽다ㅎㅎ,,



5. 수료

"코로나..."

 위와 같은 9개월을 견디고 본인은 마침내 수료생 타이틀을 얻게되었다.

근데 수료식이 취소되었다. 그렇다... 코로나 때문이다...

정말 아쉽고 아쉬웠지만 집으로 날아온 수료증과 메달을 보며 아쉬움을 달랬다.



6. 후기

"정말 힘들었고, 그만큼 정말 보람있었다."

 정신적으로나 신체적으로나 정말 쉽지않았던 9개월이었다.

그래도 그만큼 스스로 성장을 할 수 있었고,

보안에 대한 지식도 하루하루 다르게 쌓여가는것을 느낄 수 있던 시간이었다.

이뿐 아니라 다양한 사람들과 동거동락하며 좋은 관계를 만들어나갈 수 있는 소중한 시간이었다.

모두들 이 좋은 경험을 꼭 누려봤으면 좋겠다.


 이렇게 본인의 BoB 여정은 끝나게 되었다!

BoB는 끝났지만 같이 동거동락하며 공부했던 친구들과 여전히 연락을 하며 지낸다.

서로 궁금한 것을 물어보고 혹은 좋은 기회를 제공해주기도 한다. 이렇게 쌓인 네트워크는 어떠한 지식보다 소중하다고 생각한다.

다른 BoB 수료생들 역시 그렇게 느낄것이라 생각한다.

이처럼 독자분들 중에 혹시 BoB 지원생이 있다면 꼭 합격해서 본인과 같이 위에서 설명한 많은 것들을 얻어가셨으면 좋겠다.

반응형
반응형

데이터베이스를 사용하다보면 여러 테이블이 나눠진 상황에서 2개 이상의 테이블을 조합하여 원하는 결과를 도출해야되는 경우가 있다. 이를 위해서 JOIN을 사용할 수 있는데 MYSQL의 JOIN에 대해 자세히 들여다보자.


JOIN을 실습하기 위해 Mysql과 PhpMyAdmin을 이용해 다음과 같이 테이블을 구성하였다.

 

TABLE A - test_information

문제이름(Mission) 출제자(Maker)
국어문제 김선생
영어문제 이선생
수학문제 조선생
과학문제 구선생
일본어문제 나가사끼선생

TABLE B - test_result

문제이름(Mission) 푼인원수(Solver)
국어문제 30
영어문제 25
수학문제 16
과학문제 10
중국어문제 3

한테이블엔 문제이름과 출제자가 적혀있고, 나머지 한테이블엔 문제이름과 푼 인원수가 적혀있다.

본인은 두 테이블에 들어있는 정보를 이용하여 하나의 출력결과를 만들어 내고 싶다.

이를 위해 JOIN을 하나씩 사용해보자.

 

0. (INNER) JOIN

> 두개 이상의 관련 키가 존재하는 테이블에서 컬럼값을 비교하여 조건에 맞는 행을 검색

> 입력 예제

SELECT test_information.Maker, test_result.Solver : 출제자와 푼 사람수를 출력

FROM test_information : 테이블 A 기준(문제이름, 출제자)

INNER JOIN test_result : 테이블 B로 JOIN(문제이름, 푼 사람수)

ON test_information.Mission = test_result.Mission : 조건은 A의 문제이름과 B의 문제이름이 같은 행만

 

> 결과

 

1. OUTER JOIN

> LEFT 또는 RIGHT, FULL OUTER JOIN이 존재하며, 두 테이블에서 지정된 쪽인 LEFT 또는 RIGHT 방향의 모든 결과를 보여준 후 반대쪽에 대해는 매칭값이 없어도 표시

1-1. LEFT OUTER JOIN

> JOIN문의 LEFT에 있는 테이블 결과를 모두 가져온 후 RIGHT에 있는 테이블 데이터를 매칭하여 매칭되는 데이터가 없을땐 NULL을 표시

> 입력 예제

SELECT test_information.Maker, test_result.Solver : 출제자와 푼 사람수를 출력

FROM test_information : 테이블 A 기준(문제이름, 출제자)

LEFT JOIN test_result : 테이블 B로 LEFT JOIN(문제이름, 푼 사람수)

ON test_information.Mission = test_result.Mission : 조건은 A의 문제이름과 B의 문제이름이 같은 행만

 

> 결과 : A엔 나가사끼선생(일본어문제)이 있지만,  B엔 일본어문제가 존재하지않는다. 그래도 NULL로 넣어 출력한다.

1-2. RIGHT OUTER JOIN

> JOIN문의 RIGHT에 있는 테이블 결과를 모두 가져온 후 LEFT에 있는 테이블 데이터를 매칭하여 매칭되는 데이터가 없을땐 NULL을 표시

> 입력 예제

SELECT test_information.Maker, test_result.Solver : 출제자와 푼 사람수를 출력

FROM test_information : 테이블 A 기준(문제이름, 출제자)

RIGHT JOIN test_result : 테이블 B로 RIGHT JOIN(문제이름, 푼 사람수)

ON test_information.Mission = test_result.Mission : 조건은 A의 문제이름과 B의 문제이름이 같은 행만

 

> 결과 : B엔 3명(중국어문제) 행이 있지만, A엔 중국어문제가 존재하지않는다. 그래도 NULL로 넣어 출력한다.

2. CARTESIAN(CROSS) JOIN

> 연관 테이블(두개 이상)에서 가능한 모든 조합을 찾음

> 입력 예제

SELECT test_information.Maker, test_result.Solver : 출제자와 푼 사람수를 출력

FROM test_information : 테이블 A 기준(문제이름, 출제자)

CROSS JOIN test_result : 테이블 B로 CROSS JOIN(문제이름, 푼 사람수)

 

> 결과 : 출제자와 푼 사람의 수의 모든 조합 경우의 수를 보여준다 행의 갯수는 A x B개이다.

3. SELF JOIN

> 자기 자신과 JOIN

> 입력 예제

SELECT info1.Mission, info2.Maker : 문제이름과 출제자를 출력

FROM test_information info1 : 테이블 A 기준(문제이름, 출제자)

JOIN test_information info2 : 테이블 A로 JOIN(본인에게)

ON info1.Mission = info2.Mission : 문제 이름이 같은경우

 

> 결과 : 당연히 같은 테이블에서 문제이름끼리 비교하면 모두 같으므로, 문제이름과 출제자의 모든 결과를 출력한다.


여기까지 JOIN 공부를 마쳤다. 소스코드 삽입부터 계속해서 포스팅을 수정해나갈 예정이다.

반응형
반응형

 내 첫 포스팅은 BoB 8기 보안제품개발트랙에 어떻게 들어가게 되었는지로 시작해볼려고한다.

사실 지금 경연단계를 마치고 수료를 앞뒀지만 수료후기를 쓰기전에 합격후기부터 쓰는게 맞다 생각했고,

내가 BoB를 준비할때 가장 힘이되었던게 합격생들의 후기글이었어서 이렇게 나도 끄적여볼려고 한다.

후기라고 적었지만 아쉬웠던 점에 가깝고 또 그만큼 미래의 지원자분들에겐 에 가까울 수 있다.


1. 기분

 "응..?"

 

 아직도 최종 합격한 당일날의 기분을 잊지못한다. 사실 처음 내 이름을 봤을때 기쁜것보단 당황스러움이 더 컸다. 

이유는 함께 지원한 주변 지원자들을 알고있었고, 그들은 본인보다 훨씬 잘하는 사람들이였다.

내가 여기 붙어도 되나 싶기도하였고, 여기저기서 교육일정이 힘들다고 들어 큰일이란 생각도 들었다.

그래도 다음날부터 마음을 다잡고 뒤쳐지면안된다는 생각이 들어 언어책부터 간단히 전공공부를 했던 기억이 있다.

이후는 OT부터 1차 교육기간까지, 정신없는 일정으로 흘러갔고 그렇게 어떻게 여기까지 오게되었다.




*여기부턴 모두 개인적인 생각이니 그냥 참고정도로만 생각해줬으면 좋겠다.

2. 지원일정

"미리미리 준비하면 좋을것같아!"

 

  이번에 합격자수가 200명으로 늘었다. 그만큼 많은 인원이 지원했고 또 그만큼 치열했다.
일정은 서류(자기소개서) > 인적성검사 > 필기시험 > 면접으로 진행되며 생각보다 자기소개서 이후 일정이 타이트하게 진행된다. 본인은 대학생이라 기말고사 기간까지 겹쳐서 면접을 위한 PPT 퀄리티가 좋지 못했던 기억이 있다.

그래서 만약 BoB를 지원하고자 하는분들은 미리 자소서며 면접에 대해 준비해두는 것을 추천한다.

 

 

3. 서류(자기소개서)

"자신감있고, 솔직하게 그리고 내가 BoB에 어떤 도움을 줄수있는지 말해봐!"

 

 아마 본인도 가장 어려웠고, 지원자분들도 가장 어려워할 것이라 생각하는 서류부분이다.

서류에선 다양한 서류들을 요청하며 제일 중요한 자기소개서를 작성해야하는데 본인이 작성한 방법에 대해 말하고자 한다.

자기소개서엔 다음과같은 항목을 물어본다. 본인이 이뤘던 가장 큰 성과와 사례, 지원동기, 합격후포부, 관심분야, 학습계획, 진로계획이다. 다음과 같은 부분을 반영하여 하나하나 작성해나가면 좋을 것이라 생각한다.

 

일단 자신감있고 솔직하게 작성하라.

 BoB에선 열정을 중요시 생각한다. 실력이 있어도 열정이 없으면 힘들 것이다. 그만큼 자기소개서에 이러한 것이 묻어나올수록 좋다고 생각한다. 그리고 작성 내용에 대해 서류 검증이 들어가며 해당 내용이 면접질문으로 들어올 수 있으므로 솔직하게 적는 것 역시 중요하다. 마지막으론 BoB에선 노트북, 지원금부터 시작해서 여러 연구원님들께서 여러분이 공부에 집중할 수 있게 도와주신다. '합격 후 포부'라는 항목이 있는 만큼 당신이 BoB에 어떠한 도움을 줄수있는지 역시 자기소개서에 묻어나야 한다고 생각한다.

 

 두번째는 두괄식으로 작성하라.

 지금 영역에서 필자가 사용하고 있는 방식이다. 한문장씩만 읽고 넘겨도 충분하다. 합격후 멘토님들과 대화를 나눠보니 정말 자기소개서를 일일히 읽어보신다하신다. 그리고 그만큼 힘드시다고 하신다. 그래서 두괄식으로 작성하는 것이 눈에 잘 들어오셨다고 한다. 일단 한 문장으로 문단을 요약하여 적고, 그 뒤에 설명을 덧붙이는 방식이다. 이렇게 작성하면 몇몇 문장으로 이사람이 어떤것을 말하고자하는지 알 수 있어 좋았다고 하셨다.

 

 마지막은 작성한거 모두 백업해둬라.
 제출이후엔 작성한 내용을 볼 수 없다. 면접때 자기소개서 바탕으로 물어보시는 멘토님들이 계신다. 자기가 쓴 내용에 대해 준비하기 위해선 자기소개서에 쓴 내용들에 대해 한번씩 훑는 시간이 필요할 것이다. 미래를 위해 백업해두어라(참고로 본인은 이걸 몰라서 고생했다^^..).

 

 + 몇몇 추가 팁.

N. 문단이 나누어진다면 매운맛(강조하고 싶은, 자신있는) 부분을 먼저 배치하라.

N. '저는' 이란 단어를 생략해보아라. 하고싶은 말이 강조된다.

 

이런 부분만 지키고 남은 부분을 잘채워나가면 분명히 서류심사는 문제없을 것이라 생각한다.



4. 인적성검사

"일관성있게!"

 

 인적성 검사. 검사시간이 생각보다 길었던 기억이 있다. 시간적인 여유를 가지고 진행하면 좋을 것이다.

국어, 수학 등에 대한 다양한 사고를 필요로하는 파트도 있으니 적당한 긴장은 도움이 될것이다(이거 다 푼 사람있나..?)

그리고 이미 인적성을 해본 분이라면 알겠지만 여러 항목에서 비슷한 질문이 나오고 답변의 일관성역시 결과에 반영된다.

그러니 잘보일려고 좋아보이는 부분에 체크하는 것보다 본인의 모습 그대로 일관성있게 작성하면 문제없을 것이라 생각한다.



5. 필기시험

"모를 수 잇어, 일단 최선을 다해봐!"

 루머가 있는 시험이다. 필기시험 결과가 최종 결과에 크게 반영이 안 된단 말이있고, 된다는 말도 있다.

결론부터 말하자면 반영된다. 분명히 채점항목에 존재하므로 최대한 열심히 풀면 된다.

개인적으로 공부를 별로 못하고 가서 문제가 어려웠던 기억이 있다.

그래서 평소에 공부를 많이 해놓을 걸 반성했고, 그만큼 면접 때 열심히 준비하려했던 기억이 있다.

일단 공부는 미리 해가면 좋다. 시험은 공통 분야 기준으로 트랙 상관없이 모두 같은 문제를 보게 된다.

그래서 전반적인 보안 개론부터 지원 분야에 맞춘 전문 지식에 대해 공부해두면 좋을 것이다.

아 그리고 너무 걱정하지 마라. 점수가 다는 아니다. 만약 그랬다면 본인은 못 붙었을 것이다..

*수정 : 9기는 트랙별 안내 인 것을 보니, 이번에도 같을지는 모르겠다.



6. 면접

"주제는 신중히! 모르는 것은 모른다하고, 아는 것은 자신있게 말해봐!"

 일단 면접 시작시 PT 발표를 개인당 3분씩 했었다. 그래서 이에 맞게 PPT를 준비해가야한다.

PT는 '자신이 BoB에 들어오게 되면 하고싶은 프로젝트'였고 계획에 대해 발표해도 됐던걸로 기억한다.

일단 주제 선정시 신중해라. 기술적으로 대단하지 않아도 되니 현실적인 프로젝트도 충분히 좋다고 생각한다. 본인도 간단한 ARP Spoofing 관련 주제로 발표하였다. 복잡한 주제보단, 본인이 고른 주제에 대해 조금이라도 알고있고 할 수 있다고 자신하는 프로젝트를 선정하는 것이 좋다고 생각한다. 그래야 본인도 PT 발표에 대한 답변이 훨씬 수월할 것이다(본인의 PPT와 자기소개서에 써놓은 부분들에 대해 공부를 하고 가면 좋을 것이다).

 

 두번째는 솔직해라. 위에 자기소개서와 같다. 앞에 앉아계신 멘토님들은 해당 분야의 전문가들이다. 거짓말을 써놓으면 질문 몇번을 통해 바로바로 알아차리실수있다. 모르는 것은 모른다고 대답하고, 대신 아는 부분엔 자신있게 대답하라. 거짓말 하는 것보다 솔직하게 모른다고 하는편이 더 낫다(본인도 모른다고 대답한 답변들이 있다,,).

 

 이정도면 면접까지 무사히 마칠 수 있을 것이다. 본인이 앞에 써놓은 모든것을 지켰다는 것이 아니다.

합격 이후 준비하며 아쉬웠던 점과 멘토님들과 대화를 나누며 생각했던 점들을 토대로 작성한 것이다.

그래서 다음 지원자들은 본인 이야기를 참고해보면 좋겠단 생각을 한다. 위에서 말했듯이 절대 정답이 아니다.

참고만하여 본인 스타일대로 잘 풀어나가면 오히려 필자보다 수월히 합격할 수 있을 것이다.


 마지막으로 지원과 합격을 할 수 있게 도와준 동아리원들에게 너무 고맙다는 마음 전하고 싶고, 지원자분들은 꼭 합격하셨으면 좋겠다!

 

2020/05/26 수정 - 조회수를 보니 감사하게도 많은 분들이 봐주셨네요. 가독성을 위해 글을 조금 수정하였습니다.

2020/06/02 수정 - 면접시 PPT 발표 시간 10분을 개인당 3분으로 수정하였습니다.

반응형

+ Recent posts