1. 집합(Set)


 

 안녕하세요. 첫 시작은 수학에서 가장 기본이 되는 이론 중 하나인 '집합'에 대해 포스팅 하겠습니다. 



 첫 번째로는 '집합'의 정의에 대해 알아보겠습니다. 우선 '집합'의 뜻은 '주워 모아서 합한 것', '한 곳에 모이는 것' 등이 있습니다. 한 마디로 여러가지를 하나로 묶은 것이라고 볼 수 있죠. 실제 수학에서의 '집합' 또한 이와 유사한 의미입니다. 다만 하나로 모인 것에서 명확히 구별이 가능한, 쉽게 말해서 '각각이 서로 다른 것'을 좀 더 강조한 것이라 생각하시면 될 것 같습니다. 또한 하나의 모임으로 구성될 때에는 '명확한 기준'이 있어 그 기준에 맞는 사물들만 모여야합니다. 따라서 실제 집합의 정의를 정리해 보면 '각각이 정확히 구별이 가능하고 제시된 명확한 기준에 부합한 요소들의 모임을 하나의 대상으로 본 것'이라고 할 수 있습니다. 그리고 집합을 정의할 때 '요소'라는 표현을 썼는데요, 실제로는 '요소'가 아닌 '원소(element)'라는 표현을 사용합니다. 



 <집합의 뜻>

   -'주워 모아서 합한 것', '한 곳에 모이는 것'

 <집합의 정의>

   -각각이 정확히 구별이 가능하고 제시된 명확한 기준에 부합한 요소들의 모임을 하나의 대상으로 본 것




 두 번째로 집합 표현 방법에 대해 알아보겠습니다. 집합은 소속성을 제외한 어떠한 구조도 가지지 않습니다. 그렇기에 집합을 표현할 때는 중괄호 안에 순서와 상관없이 수를 나열하는 방식, 또는 기준을 제시하는 방식을 사용합니다. 


 우선 전자의 방식은 '원소 나열법'이라고 부릅니다. 정의를 하자면 '집합의 원소를 나열하여 표기하는 방법'이죠. 실제로 위의 'Animal'이라는 집합을 원소 나열법으로 표현한다면 'Animal={cat,dog,mouse,bird,pig}'로 표현할 수 있습니다. ','를 이용해 원소를 구별하고, '{}'로 원소들을 묶죠. 간단한 방법이지만 원소들 간의 논리적인 관계를 한 눈에 보기 어려울 수도 있습니다.


 나머지 후자의 방식은 '조건 제시법'이라고 부릅니다. '조건 제시법'의 정의는 '집합의 원소인지를 판단하는 조건을 제시하여 표기하는 방법'입니다. 실제로는 '{}' 안에 '|'을 집어넣어 '|'의 왼쪽에는 집합의 원소를 나타내는 식을 적고, 오른쪽에는 원소가 만족해야하는 조건을 제시합니다. 이번에는 쉽게 숫자를 이용해서 표현하도록 하겠습니다. 우선 A라는 집합에 1부터 10까지의 자연수가 있다고 합니다. 그럼 이 집합을 어떻게 표현해야 할까요? 우선 집합 A의 원소는 'x'라고 표현하여 '|'의 왼쪽에 넣어주고, x가 자연수인 것과 1부터 10까지 있다는 사실을 '|'의 오른쪽에 표현해주면 됩니다. 그럼 다음과 같은 식이 나오죠. 'A={x | x는 자연수, 0<x<11}' 이 방법은 원소 나열법과는 달리 원소들 간의 논리적인 관계를 이해하기 쉽다는 특징을 가지고 있습니다.


    


 <집합 표현 방법>

   1). 원소 나열법

        -집합의 원소를 나열하여 표기하는 방법

           ex). Animal={cat,dog,mouse,bird,pig}

   2). 조건 제시법

        -집합의 원소인지를 판단하는 조건을 제시하여 표기하는 방법

     ex). A={x | x는 자연수, 0<x<11}





 세 번째로는 집합과 원소와의 관계집합과 집합사이의 관계에 대해 알아보겠습니다. 

 

 우선 집합과 원소와의 관계를에 대해 알아 봅시다. 집합을 이용할 때 가장 중요한 것은 어떻게해서든 각각의 원소들과 집합 사이의 관계가 '속한다', '속하지 않는다'로 명확히 구분되어져야 된다는 것입니다.(한마디로 제 3의 선택지가 없어야 합니다.) 그럼 이 '속한다','속하지 않는다'를 어떻게 표현해야할까요? 바로 '∈'라는 'ㅌ'과 유사한 포함 기호를 사용하면 됩니다. 여기서 유의할 점은 '∈'은 원소와 집합 사이에서만 사용된다는 것입니다. 집합과 집합 사이에는 다른 기호가 사용됩니다. 자 그럼 예시를 하나 보여드리겠습니다. 'cat'라는 원소가 하나 있고, 'Animal'이라는 집합이 있을 때 이들간의 관계는 어떻게 표현할 까요? 바로 'cat ∈ Animal'이렇게 표현하시면 되고, 그와 반대로 'Animal'이 아닌 'plant'라는 집합일 경우에는 'cat ∉ plant'와 같이 포함 기호에 '/'를 그으시면 됩니다. 


 그 다음으로는 집합과 집합 사이의 관계를 표현에 대해 알아보겠습니다. 집합과 집합 사이의 관계는 위에서 보았던 원소와 집합 간의 관계처럼 단순하지 않습니다. 한 집합이 다른 집합에 완전히 포함될 수도 있지만, 몇가지 원소들만 포함될 수 있기 때문이죠. 몇가지 예시를 들면서 설명하겠습니다. 


 먼저 '고양이과'라는 집합이 있고, 'Animal'이라는 집합이 있다고 합시다. 이 두 집합 사이의 관계는 어떤 형태일까요? 바로 '고양이과'라는 집합이 'Animal'에 완전히 포함되는 형태입니다. 사자,호랑이,시라소니,고양이 등등 고양이과 동물들은 어찌되었든 '동물'이니까요. 이렇게 '고양이과'라는 집합의 모든 원소들이 'Animal'이라는 집합의 원소인 경우를 '부분집합(subset)'이라고 하고, 또 이 경우에는 'Animal'이라는 집합에 '고양이과'를 제외한 다른 원소들이 있으므로 'Animal'과 '고양이과'는 같지않고 따라서 이를 '진부분집합(proper subset)'이라고 합니다.(집합 사이의 포함관계를 표현하는 기호는 '⊂'입니다.) 





 이쯤되면 정말 헷갈립니다. '부분집합'과 '진부분집합'의 차이는 무엇인가? 바로 '진'의 차이입니다. 여기서 '진'은 '진짜'라는 의미라고 보시면 됩니다. '부분집합'은 두 집합 중 하나가 하나에 완전히 포함되는 것으로 이 두 집합이 완전히 같을 수도 있고, 위에 있는 예시처럼 포함되는 집합에 있는 원소를 제외한 또다른 원소들이 존재할 수 있습니다. 전자의 경우에는 의미상 완전한 부분집합이라고 할 수 없습니다. 왜냐하면 두 집합이 각각 가진 원소가 전부 같다면, 이것은 '부분'이 아니라 '전체'가 되는 것이니까요. 그렇기에 이러한 상황이 배제된 후자와 같은 의미상 완전한 부분집합을 이루는 것을 '진부분집합'이라고 하는 것입니다. 그림으로 표현하자면 부분집합에 진부분집합이 포함되어 있는 것으로 나타낼 수 있겠네요.




<원소와 집합 사이의 관계>

  -속한다, 속하지 않는다. 

    ex). 속한다- 'cat ∈ Animal'

          속하지 않는다.- 'cat ∉ plant'

<집합과 집합 사이의 관계>

  1). 부분 집합

      -A⊂B, A = B

  2). 진부분 집합

      -A⊂B, A ≠ B






 드디어 마지막으로 집합의 연산에 다루어 보겠습니다. 집합 연산에는 크게 '합집합(union),곱집합(intersection),차집합(difference),여집합(complementation)'이 4개가 존재합니다. 

 

 '합집합'은 둘 이상의 집합들의 모든 원소를 한 곳에 합쳐 놓은 집합입니다. 기호는 '∪'를 사용합니다. 예를 들어 'animal' 집합과 'plant' 집합의 합집합은 'animal ∪ plant'라고 표현하고, 그 결과는 '{고양이, 개, 꽃, 풀, 호랑이, 나무....}' 입니다. 





 '곱집합'은 둘 이상의 집합들이 똑같이 갖고 있는 원소들만 한 곳에 모아 놓은 집합입니다. 기호는 ' ∩'를 사용합니다. 예를 들어 서로 다른 개성을 가진 3명의 학생들이 있고, 이들의 유일한 공통점이 '스마트폰'을 가지고 있다는 것이라고 할 때 이들의 곱집합은 ''학생1 ∩학생2 ∩학생3'이라고 표현하고, 결과는  '{스마트폰}'입니다.




 

 '차집합'은 둘 이상의 집합들 상에서 빼지는 집합이 가지고 있는 원소를 제외한 모든 원소들을 모아놓은 집합입니다. 기호는 '-'를 사용합니다. 예를 들면 A 집합에는 20대에서 30대 사람들이 있고 B집합에는 10대에서 20대가 있다고 가정할 때, A집합에서 B집합을 뺀다고 합시다. 실제 표현은 'A-B'라고 쓰고 결과는 30대 사람들만 남아있겠죠. 그 이유는 우선 B집합과 A 집합은 20대라는 공통된 원소를 가지고 있습니다. 이 상황에서 B집합을 뺀다고 할 때 B에 속해 있던 10대는 당연히 사라지고 20대 또한 함께 사라져 30대만 남은 것입니다. 




 '여집합'은 전체 집합에서 어떠한 집합의 원소를 제외한 모든 원소들의 집합입니다. 기호는 '-'를 집합 위쪽에 써서 사용하거나 작은 따옴표를 사용하거나 c를 지수 위치에 놓습니다. 예를 들어 0세에서 100세까지 전연령을 모아, 10대를 제외한 모든 연령대에게 밥을 제공하는 상황이 있다고 가정합시다. 이 것을 집합으로 표현하면 '10대'를 집합 A라고 할 때 라고 표현하고 결과는 '{x|0<x<101, x∉A}'입니다. 


<집합의 연산>

  1). 합집합

       -둘 이상의 집합들의 모든 원소를 한 곳에 합쳐 놓은 집합

  2). 곱집합

       -둘 이상의 집합들이 똑같이 갖고 있는 원소들만 한 곳에 모아 놓은 집합

  3). 차집합

       -둘 이상의 집합들 사이에서 빼지는 집합이 가지고 있는 원소를 제외한 모든 원소들을 모아놓은 집합

  4). 여집합

       -전체 집합에서 어떠한 집합의 원소를 제외한 모든 원소들의 집합



 오늘은 집합의 정의, 집합의 표현 방법, 원소와 집합 사이의 관계, 집합과 집합 사이의 관계(부분집합, 진부분집합), 집합 연산에 대해 쓰고 포스팅을 마치겠습니다. 혹시 틀린 부분이 있으면 comment 남겨주세요.

(양이 너무 많아서 힘들었습니다. ㅠㅠ)

'수학' 카테고리의 다른 글

2. 함수(function)  (0) 2018.01.24

4. Worm



안녕하세요. 이번주는 Worm에 대해 포스팅을 하겠습니다. 



 첫 번째로 Worm의 정의에 대해 설명해드리겠습니다. 저번주에는 Ransomware 관련 포스팅을 했었는데요, Worm 또한 Ransomware와 마찬가지로 악성프로그램(malware)의 일종입니다.  Worm은 스스로를 복제해서 네트워크를 이용해 확산시키는 악성프로그램으로, 바이러스와 달리 다른 파일을 감염시켜 실행되지 않고 독자적으로 실행되어 스스로를 복제합니다. 그리고 'Worm'이라는 이름의 유래는 John Brunner가 1975년에 출판한 공상 과학 소설 《The Shockwave Rider》에서 유래되었다고 하네요.

<Worm의 정의>

  -다른 파일을 감염시키지 않고 독자적으로 실행되어 스스로를 복제한 후 네트워크를 통해 확산시키는 악성프로그램





 두 번째로는 Worm의 종류에 대해 살펴보겠습니다. 웜의 종류로는 Morris Worm, code red Worm, SQL Slammer, Blaster Worm, Welchia Worm, sobig.F Worm,Mydoom Worm, Netsky Worm ,bagle Worm ,Sasser Worm 등이 있습니다.  그 중 몇가지 worm에 대해 설명드리겠습니다. 

 

  Morris Worm은 최초로 등장한 웜이라고 해서 꽤 유명한 웜입니다. 실제 제작자인 Robert Morris의 이름을 따서 지어진 이름이죠. Morris Worm은 당시 전세계 모든 유닉스 컴퓨터 중 10%에 해당하는 규모의, 즉 약 6000대를 감염시킨 웜입니다. 이 프로그램의 제작 의도가 '인터넷의 크기를 알아내려고'임을 알고나니 황당하기도 하죠. 물론 이런 순수한 의도 덕분에 감염된 pc가 크게 피해를 입지 않았지만, 이로인해 '네트워크'상에 엄청난 영향을 주었고, 이로인해 '네트워크'를 공격할 수 있는 악성프로그램 'Worm'의 시발점이 되었습니다. 

 

  code red worm은 2001년 당시 25만대 이상의 컴퓨터를 감염시킨 웜으로, 마이크로소프트 인터넷 정보 서비스(IIS)의 buffer overflow 취약점을 이용해 제작되었습니다. 이 code red worm에는 20~27일 동안 잠복한 후 미국 백악관 홈페이지 등 몇몇 IP에 DOS 공격을 취하는 기능도 포함되어 있었습니다.

 

  SQL Slammer는 2003년에 등장하여 10분만에 75,000 대 이상의 컴퓨터를 감염시킨 웜으로, 마이크로소프트의 'SQL Server'와 Desktop Engine database 제품에서 발생한 buffer overflow 버그를 이용해 제작되었습니다.  

 

  Blaster Worm은 2003년에 등장하여 1~2분 간격으로 컴퓨터를 재부팅 시켜 국내외적으로 큰 피해를 준 웜입니다. 추가적으로 이 blaster worm의 제작자는 대담하게도 프로그램 안에 당시 마이크로소프트 기술 고문이었던 빌 게이츠에게  'billy gates why do you make this possible? Stop making money and fix your software!!'이라는 메세지를 남겼습니다. 


<Blater worm을 hex dump한 모습>

 

  Whlchia Worm은 Nachi Worm으로도 알려져 있는 웜으로, 감연된 pc 안의 Blaster worm을 제거하고, blaster worm에 의한 추가 감염을 방지할 수 있도록 마이크로소프트의 보안패치를 적용시킨 후 스스로 삭제됩니다. worm을 없애기 위해 worm을 이용하다니 꽤나 신박하네요. 

 

  sobig.F Worm은 2003년에 등장하여 감염됨 pc를 통해 메일 발신 주소를 위장하여 스팸 메일을 발송하도록하는 웜으로, sobig worm 중 가장 크게 영향을 끼쳤습니다. ( sobig worm에는 sobig.A,sobig.B~sobig.F까지 존재합니다.)

 

  마지막으로 Mydoom Worm은 2004년에 등장해 역대 최고의 전파 속도로 전세계 100만대 이상의 PC를 감염시킨 worm으로, 당시에 전자 메일 스패머가 감연된 컴퓨터를 통해 스팸메일을 보냈다고 알려져 있습니다. 


<Worm의 종류>

  -Morris Worm(1989)

  -code red Worm(2001.7.13)

  -SQL Slammer(2003)

  -Blaster Worm(2003.8.11)

  -Welchia Worm(2003)

  -sobig.F Worm(2003)

  -Mydoom Worm(2004.1.26)

  -Netsky Worm (2004)

  -bagle Worm(2004)

  -Sasser Worm(2004)

 

 오늘은 worm의 정의와 종류를 끝으로 포스팅을 마무리하겠습니다. 혹시 제가 쓴 포스팅에서 오류를 발견하시면 comment 남겨주세요! 끝까지 읽어주셔서 감사합니다.


'정보보안' 카테고리의 다른 글

5. 시스템 해킹 (System hacking)  (145) 2018.01.29
3.메모리 보호기법  (2) 2018.01.05
Anti Reversing  (0) 2017.12.27
Ransomware  (0) 2017.12.18

3. 메모리 보호기법



안녕하세요. 이번주는 '메모리 보호기법'에 대해 포스팅하겠습니다.


 우선 '메모리 보호'의 정의를 알아봅시다. 메모리 보호란 '컴퓨터 메모리의 사용을 제어하는 방법'입니다. 좀 더 자세히 말하자면 'OS에서 실행하고 있는 프로세스가 자신에게 할당되지 않은 영역의 메모리에 접근하는 것을 막는 것'이라고 할 수 있습니다. 한마디로 허가되지 않은 메모리 접근으로 인한 영향을 미리 예방하는 것입니다. 


<메모리 보호의 정의>

  -컴퓨터 메모리의 사용을 제어하는 방법

  -OS에서 실행하고 있는 프로세스가 자신에게 할당되지 않은 영역의 메모리에 접근하는 것을 막는 것

   (=허가되지 않은 메모리 접근으로 인한 영향을 미리 예방하는 것)


 자, 이제 메모리 보호기법의 종류에 대해 알아보겠습니다. 사실 메모리 보호 기법은 점점 발전해 나가는 시스템 해킹에 대응하여 발전해 왔습니다. 그 중 오늘은 총 4가지의 메모리 보호기법을 다루겠습니다. 


 우선 가장 첫번째로 'ASLR'부터 설명하겠습니다. ASLR은 Address Space Layout Randomization의 약자로, 그 이름에서 알 수 있듯이 뭉뜬그려 말하면 '실행 및 호출 할 때 마다 주소 배치를 무작위로 배정하는 기법'입니다. 그러면 무엇의 주소 공간을 무작위로 배정한다는 것일까요? 바로 heap, stack, libc 등의 주소 공간입니다. 이러한 ASLR 기법의 효과는 buffer overflow 공격을 힘들게 한다는 점이지만, 이 또한 NOP sled, RTL, ROP 등으로 우회할 수 있습니다. 그럼 정리를 하면 ASLR 기법은 '실행할 때 마다 heap,stack,libc 등의 주소를 프로세스 주소 공간에 무작위로 배치하는 기법'입니다. 


 두 번째로는 'DEP/NX'에 대해 설명하겠습니다. DEP와 NX는 둘 다 같은 개념의 보호기법으로 각각 Data Execution Protection과 Non executable의 약자입니다. 각각의 의미를 읽어보면 한 마디로 '실행시키지 않는다'입니다. 좀 더 자세히 말하자면 'heap과 stack과 같이 buffer overflow 공격에 이용되는 메모리 공간에 있는 코드를 실행시키지 않는다'는 것이죠. (쉘 코드 실행 x) 


 세 번째로는 'ASCII-Armor'에 대해 설명하겠습니다. ASCII-Armor는 '라이브러리 함수(Libc)의 상위 주소에 \x00인 NULL 바이트를 삽입하는 기법'입니다. 이로써 buffer overflow에서 이용되는 'strcpy()'와 같은 취약한 함수들을 통한 공격을 힘들게 만듭니다. (strcpy()는 NULL byte를 만나면 종료) 


 마지막으로 'Canary'기법에 대해 설명하겠습니다. Canary기법이란 'buffer와 SFP(Stack Frame Pointer) 사이에 buffer overflow를 탐지하기 위한 임의의 데이터를 삽입하는 기법'입니다. 만약 buffer overflow를 통해 공격을 하면 canary가 변경되어 경고가 발생할 것입니다. 카나리에는 terminator canary, random canary 등이 있고, StackGuard와 ProPolice 등에서 canary 기법을 지원합니다.


<메모리 보호기법의 종류>

  1). ASLR (Address Space Layout Randomization)

      - 실행할 때 마다 heap,stack,libc 등의 주소를 프로세스 주소 공간에 무작위로 배치하는 기법

  2). DEP/NX (Data Execution Protection/Non-Executable)

      - heap과 stack과 같이 buffer overflow 공격에 이용되는 메모리 공간에 있는 코드를 실행시키지 않는 기법

  3). ASCII-Armor

      - 라이브러리 함수(Libc)의 상위 주소에 \x00인 NULL 바이트를 삽입하는 기법

  4). Canary

      - buffer와 SFP(Stack Frame Pointer) 사이에 buffer overflow를 탐지하기 위한 임의의 데이터(canary)를 삽입하는 기법


 이렇게 목표했던 메모리 보호의 정의와 메모리 보호기법의 종류에 대한 설명이 끝났습니다. 그럼 포스팅을 마무리 하겠습니다. 만약 틀린 내용이 있다면 comment를 남겨주세요! (그냥 심심해서 comment 남겨주시면 더욱 감사합니다.)

'정보보안' 카테고리의 다른 글

5. 시스템 해킹 (System hacking)  (145) 2018.01.29
4. Worm  (2) 2018.01.11
Anti Reversing  (0) 2017.12.27
Ransomware  (0) 2017.12.18

+ Recent posts