OpenGL를 기반으로 UI 렌더러를 만들 때 고민 중 하나가 효율적으로 도형을 그리는 방법이 뭘까...였다.

 

1. OpenGL 기본 배경

 일단 기본 배경을 설명하자면, OpenGL에는 도형을 그리는 여러 방법이 있다.

 

 첫 번째는 OpenGL 1.0 Version에서 사용하던 'glBegin()-glVertex()-glEnd()' 방식을 사용한 방법인데, 이 방법의 경우에는 그리고자 하는 도형(Premitive)을 glBegin()을 통해 정의하고, 해당 도형의 모든 정점을 glVertex()을 호출하여 정의 하면 된다. 모든 정점을 다 정의한 후에는 glEnd()을 호출하여 정점 정의가 끝났음을 알리면 된다. 이 방법의 장점은 작성 난이도는 낮다는 것이고, 단점은 쓸대없이 많은 양의 CPU Call로 인한 성능 저하이다. (ex. 원의 경우 최소 360개의 정점에 대해 glVertex()로 정의해야한다.)

 

//사각형 그리기
glBegin(GL_QUADS);

glVertex2d(0, 0);
glVertex2d(width, 0);
glVertex2d(width, height);
glVertex2d(0, height);

glEnd();

 

(물론 이 외에도 Fixed Function만 이용 가능하기 때문에 사용자가 원하는 특수 처리를 못한다는 점이 있으나, 현재 포스팅하는 내용은 단순히 도형을 그리는 것에 초점이 맞춰져 있기 때문에 자세한 설명은 제외.)

 

 두 번째는 OpenGL 2.0 Version부터 등장한 Shader를 사용하는 방법이다. 이 방법은 간단하게 말하자면, 개발자가 GLSL 이라는 쉐이더 언어를 통해 화면 상의 각 픽셀의 색상값을 지정하는 것이다. (사실 이 부분은 Fragment Shader에 대한 설명이다) OpenGL은 각각의 픽셀에 대해 Shader Program을 실행시켜 컬러값을 도출한다. 이때 수 많은 Pixel에 대해 하나하나 CPU를 통해 호출하여 처리하면 느리겠지만, OpenGL은 GPU 위에서 병렬연산을 통해 빠르게 처리한다. 이 방법의 장점은 적은 양의 CPU Call이 필요하다는 점이며, 단점은 입문자가 접근하기 어렵게 느낄 수 있다는 점이다.

 

// 원 렌더링 Shader 예시
#version 330 core

uniform vec4 color;
in vec2 pos; // pixel 좌표 (0~1 범위로 normalize한 좌표)

float drawCircle() {
    float radius = length(pos);
    return step(radius, 1.0); // radius 값이 1.0 이하면 해당 pixel의 alpha 값을 1로 설정하여 원을 그린다.
}

void main() {
    float alpha = drawCircle();
    gl_FragColor = vec4(color.xyz, color.w * alpha);
}

 

(또한 Shader를 사용하면 각 Pixel을 자유롭게 조작할 수 있기 때문에 Motion Blur, Anti-Aliasing, Lighting등과 같은 특수처리를 쉽게 할 수 있다.)

 

2. 문제 발단

 나는 두가지 방법 중 유연성과 성능이 좋은 Shader를 사용하는 방법을 선택했다. 여기까지는 다들 납득이 갈 것이다.

문제는 직접 GLSL을 통해 각 도형에 대한 Shader를 만들고 난 후에 생겼다.

 

 도형을 그리는 알고리즘 자체가 비효율적이었던 것이다. (너무 별 생각없이 짰다..) 간단히 Round Rectangle을 그리는 로직으로 예를 들자면, 첫 번째로 Pixel 위치가 모서리 범위(주황색 범위) 안에 있는지 검사하고, 만약 안에 있으면 둥근 모서리 안 쪽(노랑색 범위)에 위치해 있는지를 검사하는 식이었다. 결과적으로 하늘색 + 노란색 부분만 칠하면 원했던 RoundRectangle을 그릴 수 있었다.

 

RoundRectangle 렌더링 알고리즘

 아무래도 Shader를 작성해보지 않은 분들은 '이게 왜 비효율적이야?'라고 생각할 수도 있다. 하지만 Shader의 경우 GPU 상에서 각 Pixel에 대해 병렬로 실행되는 만큼, 적은 분기(if 문)와 코드 양이 중요하다. 문제는 내 알고리즘은 각 도형을 그릴 때 무조건 한 두개 이상의 분기가 존재했고, 실제 구현 시 코드 길이도 길면 15줄까지 되었다.. (수학을 못해서...) 물론 이 자체로도 첫 번째 방법 보다야 성능이 좋았지만 나는 만족하지 못했다. 

 

3. SDF(Signed Distance Field)를 통한 문제 해결

 로직을 개선하고자 방법을 찾아보던 중 SDF(Signed Distance Field)라는 것을 발견했다. SDF는 테두리로 부터의 거리를 연산하는 알고리즘인데, 이때 앞에 부호화가 붙은 걸 보면 알 수 있듯이 테두리 안쪽에서의 거리는 마이너스로, 바깥에서의 거리는 플러스로 연산한다.

 

 따라서 도형의 SDF만 연산할 수 있다면, 도형을 채울 때는 SDF 값이 0 이하인 Pixel은 색을 칠하면 되고, 도형의 테두리를 그릴 때는 SDF값이 0인 Pixel만 칠하면 된다. (테두리 두께도 SDF를 통해 조작할 수 있다.)

 

// 사각형 SDF
float rectangleSDF( in vec2 pos, in vec2 size ) {
    vec2 distance = abs(pos) - size ;
    return length(max(distance, 0.0)) + min(max(distance.x,distance.y), 0.0);
}

// 둥근 모서리 사각형 SDF
float rectangleSDF( in vec2 pos, in vec2 size, float radius) {
    vec2 distance = abs(pos) - size + radius;
    return length(max(distance, 0.0)) + min(max(distance.x,distance.y), 0.0) - radius;
}

// SDF 사용 예제
void main() {
    float alpha = 1.0;
    float sdf = shapeSDF(); // 그리고자 하는 도형의 sdf 계산 (인자는 생략함)

    if( fill == 1.0 ) {
        // sdf가 0.0 보다 작으면 alpha 값을 1로 설정 (채우기)
    } else {
        // sdf가 0.0이면 alpha 값을 1로 설정 (테두리 그리기)
    }   
    gl_FragColor = vec4(color.xyz, color.w * alpha);
}

 

4. 마무리

 실제로 SDF를 적용했더니 코드양도 대폭 줄고 성능도 개선이 되어서 만족했다. 일단 지금 내 수준에서는 여기까지가 최선이라고 생각된다. 이후에 만약 더 좋은 방법을 찾는다면, 추가로 포스팅할 생각이다.

 

오타나 잘못된 내용 있으면 코멘트 부탁드립니다.

 

참고 링크

https://www.iquilezles.org/www/articles/distfunctions2d/distfunctions2d.htm

5. 시스템 해킹 (System hacking)



 안녕하세요. 벌써 한 주가 다 지나가 버리고 새로이 월요일이 왔네요. 끔찍합니다. 정말로요. 어찌되었든 오늘은 오랜만에 '시스템 해킹'을 주제로 해킹 관련 포스팅을 할까 합니다. 





 '시스템 해킹'의 정의에 대해 알아보도록 하겠습니다. 사실 시스템 해킹에 대한 정확한 정의는 나와있지 않습니다. 그렇기에 제가 생각하는 시스템 해킹의 정의를 말씀드리도록 하겠습니다. '시스템해킹'이란 '시스템의 취약점을 이용한 공격을 통해 루트 권한을 획득한 후 악성코드(malware)나 백도어(backdoor)를 설치 및 실행하도록 하는 것'이라고 생각합니다. 물론 무조건 공격자가 해당 시스템에 악성코드나 백도어를 설치해 놓는 것은 아닙니다. 공격자에 따라 루트 권한 획득 후 하는 행동이 다르겠죠. 그럼에도 저렇게 적어놓은 이유는 많은 사례들을 살펴보면 악성코드나 백도어를 설치해 놓기 때문입니다. 



 <시스템 해킹의 정의>

   -시스템의 취약점을 이용한 공격을 통해 루트 권한을 획득한 후 악성코드(malware)나 백도어(backdoor)를 설치 및 실행하도록 하는 것

   

  


 시스템 해킹 기법의 종류로는 여러가지가 있는데요, 대표적인 것들을 뽑자면 'stack buffer overflow', 'race condition', 'RTL', 'ROP', 'command injection', 'heap buffer overflow'등이 있습니다. (오늘 이 기법들 하나 하나를 다 다루어 볼려고 했으나, 한 포스팅에서 진행하기에는 너무 양이 많아서 앞으로 각각의 공격들을 하나씩 다룰 예정입니다.)




 그럼 오늘은 시스템 해킹의 정의로 포스팅을 마무리 짓겠습니다. 아무래도 시스템 해킹 공격 기법의 종류에 대해 언급을 하지 않으니 포스팅이 초라하네요. 그래서 이번주에는 시스템 해킹 기법 중 2가지를 추가로 더 포스팅하도록 하겠습니다. 읽어주셔서 감사합니다. (다른 의견이나, 틀린 부분 있으면 comment 남겨주세요) 

 

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

4. Worm  (2) 2018.01.11
3.메모리 보호기법  (2) 2018.01.05
Anti Reversing  (0) 2017.12.27
Ransomware  (0) 2017.12.18

2. 함수(function)



 안녕하세요. 어제는 '집합'에 대해 포스팅했었는데요, 오늘은 그에 이어 '함수'에 대해 포스팅을 하도록 하겠습니다. (정말 포스팅하는 게 보통 일이 아닙니다. ㅠㅠ)



 우선 '함수'의 정의에 대해 알아보겠습니다. 함수란 '변수 x,y에 대해 x 값이 변함에 따라 y 값도 x 값에 하나의 값으로 대응하는 것'입니다. 좀 더 깊게 들어가면 '변수 x,y의 값들을 모아 각각 x,y 집합이라 놓고 집합 x의 각 원소에 집합 y의 원소가 오직 하나씩만 대응하는 것'이라고 할 수 있습니다. 한마디로 함수에서 중요한 키워드는 '대응'이라고 할 수 있습니다. 하지만 여기서 헷갈리지 말하야하실 것은, 함수는 1대 1 대응이 아닙니다. x 집합에 있는 1개 이상의 원소가 y 집합의 한 가지 원소에만 대응해도 함수라고 합니다. 한마디로 x 집합의 한 원자가 2개의 y 집합의 원소와 대응되는 것은 안되지만 y집합의 원소들은 여러개의 x 집합의 원소와 대응되도 상관이 없다는 말이죠.

  이제 함수의 정의를 알아봤으니, 함수를 표현하는 방법에 대해 알아보겠습니다. 함수를 표현할 때는 두가지 방법을 이용하는데요, 보통 'f(x)=y'이런식으로 쓰고, 종종 f:x->y'이런식으로 사용하죠.





<함수의 정의>

  -변수 x,y에 대해 x 값이 변함에 따라 y 값도 x 값에 하나의 값으로 대응하는 것

  -변수 x,y의 값들을 모아 각각 x,y 집합이라 놓고 집합 x의 각 원소에 집합 y의 원소가 오직 하나씩만 대응하는 것

<함수 표현 방법>
  -f(x)=y

  -f:x->y



 자 다음으로는 함수와 관련된 용어들을 풀어보겠습니다. 우선 위에 그림에서 볼 수 있는 'X집합'은 정의역(domain)이라고 하고, 'y집합'을 공역(codomain)이라고 합니다. 그리고 함수 f의 x에 대한 함숫값인 y1,y2,y3는 치역(range)라고 하죠. 자 그럼 살짝 공역과 치역의 정의가 헷갈리실 겁니다. 똑같이 y집합을 지칭하고 있으니까요. 공역과 치역의 관계는 치역이 공역의 부분집합이라고 보시면 됩니다. 치역은 공역과 달리 x에 대응하는 y집합의 원소만을 포함하기 때문에 y집합 내의 모든 원소가 포함되지 않을 수 있기 때문이죠.(정의역과 공역에 대한 정의가 없다면 정의역과 공역은 실수 전체의 집합을 의미합니다.)


<함수 용어 정리>

  함수 f:x->y일 때

   -정의역(domain) : x 집합

   -공역(codomain) : y 집합

   -치역(range) : f(x) 집합





 오늘은 함수의 정의와 함수 용어 정리로 포스팅을 마치겠습니다. 물론 함수의 종류(일대일 함수, 일대일 대응 함수...)에 대해서 더 쓸 수 있지만 그 쪽은 딱히 다룰 필요를 못 느꼈기 때문에 여기서 마치겠습니다. 틀린 내용이 있다면 comment 남겨주세요!



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

1. 집합(Set)  (3) 2018.01.23

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

 안녕하세요. 오늘은 'Anti Reversing'을 주제로 포스팅을 하겠습니다.

 

1. Anti Reversing이란

 우선 'Reversing'이란 무엇일까요? 정보보안에서 Reverse Engineering이란 기계어로 이루어진 실행 파일을 분석하여 프로그램의 동작 방식(로직)을 유추하는 기술입니다.

 

 개발자가 아니신 분을 위해 설명을 덧붙이자면, 기계어란 컴퓨터가 이해할 수 있는 이진수로 작성하는 언어입니다. (ex. 0101010101...) 이진수로 이루어져 있기 때문에 사람이 기계어를 이해하기 쉽지 않죠.

개발자들은 C 또는 Java와 같은 인간이 이해하기 쉬운 프로그래밍 언어를 통해 프로그램의 소스코드를 작성하고,
이를 컴퓨터가 이해할 수 있는 언어인 기계어로 컴파일한 뒤 exe와 같은 실행 가능한 File로 프로그램을 빌드한 후 배포를 합니다.

 Reversing이 무엇인지 알았으니, 'Anti Reversing'이 무엇인지 바로 감이 올것입니다. 여러분이 생각대로 Anti Reversing이란 Reversing하는 것을 방해하는 기술입니다. 그럼 왜 Reversing하는 것을 막으려고 하는 것일까요? 그건 'Reversing'이라는 기술이 악의적인 목적으로 사용될 수 있기 때문입니다. 악의적인 목적으로 사용되는 예시를 들자면, Program Copy나 프로그램의 라이센스 없이 crack을 통해 사용하는 것 등이 있습니다. 총 정리해보면 'Anti Reversing'이란 '악의적인 목적을 가진 이가 Reversing하는 것을 방해하는 기술'이라고 할 수 있습니다.

Reverse Engineering은 개발자가 완성된 프로그램을 patch할 때나, 악성코드 분석 할 때 등 좋은 목적으로 사용되기도 합니다.

<Reversing의 정의>
   - 기계어로 이루어진 프로그램 실행 파일을 분석하여 프로그램의 동작 방식을 분석하는 것

<Anti Reversing의 정의>

   - Reversing을 방해하는 기술 (프로그램 로직을 분석할 수 없도록하는 기술)

   - 악의적인 목적을 가진 이가 Reversing하는 것을 방해한다                   

 

2. 마무리

 사실 Anti Reversing 기법의 종류에 대해서도 다룰려고 했으나, 워낙에 많은 기법들이 있어 소개해 드리기가 어려워 정의에 대해서만 짧게 알려드리고 마치게 되었습니다. (몇가지 알려드리자면 api를 이용해 debugger를 탐지하거나 TLS 기법을 이용한 방법들이 있습니다.) 그럼 오늘은 이렇게 'Anti Reversing'에 대한 포스팅을 끝마치겠습니다. (다음번에 시간이 된다면 anti-reversing 기법에 대해 추가로 포스팅 하겠습니다.) 읽어주셔서 감사합니다. 

 

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

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

 첫 포스팅으로 최근 몇 년 동안 국내외로 큰 이슈를 일으켰던 랜섬웨어(Ransomware)에 대해 다루겠습니다. 

 

1. 랜섬웨어의 어원

 우선 어원부터 알아보겠습니다. 랜섬웨어의 어원은 '몸값, 몸값을 반환하다'라는 뜻의 'Ransom'과 프로그램이라는 뜻의 'Software'가 합쳐진 합성어입니다. 실제로 랜섬웨어는 피해자의 시스템을 인질로 금전(=몸값)을 요구하는 악성 프로그램입니다.

<Ransomware의 어원>
  - Ransom(몸값, 몸값을 반환하다) + Software의 합성어

<Ransomware의 정의>
  - 시스템을 잠그거나 피해자의 개인 데이터를 암호화해 접근할 수 없도록 한 후, 이를 인질로 금전을 요구하는 악성 프로그램 (Malware)

 

2. 잘 알려진 랜섬웨어

1). WannaCry

 먼저 올 한해 전 세계적으로 큰 피해를 입힌 'WannaCry'는 2017년 5월 12일부터 등장한 랜섬웨어로 이터널 블루라는 마이크로소프트 윈도우의 취약점을 악용하여 제작되었고, 감염이 되면 시스템 내의 파일들이 암호화됩니다.

 

2). Locky

 2016년 2월에 첫 등장한 'Locky'는 다양한 파일을 암호화한 후 확장자 명을 (.locky)로 변경시키는 랜섬웨어로, 'RSA-2048', 'AES-128'유형의 암호화 기법을 사용하며 locker 계통 중에서 가장 막강한 유형의 랜섬웨어입니다. 

 

3). TeslaCrypt

 'TeslaCrypt'는 'CryptoLocker'와 'CryptoWall'을 조합해서 만들어진 랜섬웨어로 문서파일뿐만 아니라 게임 파일까지 감염시킵니다. 

 

4). RaaS(Ransomware as a Service)

 'RaaS(Ransomware as a Service)'란 실제 랜섬웨어의 명칭이 아니라 랜섬웨어가 서비스 형태로 진화된 것을 말하는 것입니다. 여기서 말하는 서비스 형태란 실제 RaaS형 랜섬웨어를 제작한 사람인 '제작자'와 이 랜섬웨어를 사용해 공격하는 '공격자'가 나누어져 있는 것으로 '공격자'는 랜섬웨어를 제작할 기술적 역량이 없어도 제작자로부터 랜섬웨어를 제공받아 공격할 수 있습니다. (본래의 랜섬웨어는 제작자가 공격하는 형태였습니다.) 이러한 RaaS 계통의 랜섬웨어로는 '케르베르(Cerber)', '사탄(Satan)'등이 있습니다. 

<Ransomware>

  1). WannaCry (2017년 5월 12일 등장)

      -이터널 블루 취약점 사용 (마이크로소프트 윈도우)

      -한국어를 비롯한 28개의 다국적 언어를 지원

  2). Locky(2016년 2월 등장)

      -파일 암호화 후 확장자 명을 (.locky)로 변경

      -RSA-2048과 AES-128 유형의 암호화 기법 사용

      -locker 개통의 랜섬웨어 중에서 가장 막강

  3). TeslaCrypt 

      -'CryptoLocker'와 'CryptoWall'을 조합해 제작

      -문서 파일 외에도 게임 파일 또한 감염

  4). RaaS (실제 랜섬웨어 x, 신 유형의 랜섬웨어 o)

      -이전과는 달리 서비스 형태로 진화된 랜섬웨어들을 통칭

      -랜섬웨어 제작자가 공격자에게 랜섬웨어를 제공하면, 공격자가 제공받은 랜섬웨어를 통해 공격하는 형태

      -RaaS 계통의 랜섬웨어: 케르베르(Cerber), 사탄(Satan)

 

3. 감염 경로

 세 번째로 랜섬웨어 감염경로에 대해 알아보겠습니다. 감염 경로로는 '신뢰할 수 없는 사이트', '스팸메일', '파일 공유 사이트', 'SNS', '네트워크망' 이 있습니다. 신뢰할 수 없는 사이트의 경우 단순히 페이지 방문만으로도 Drive-by-Download 기법을 통해 랜섬웨어가 설치되어 감염될 수 있습니다. 스팸메일은 출처가 불분명한 이메일 수신 시 첨부파일 또는 메일에 URL 링크를 넣어 악성코드를 유포합니다. 파일공유 사이트는 Torrent, 웹하드 등 P2P 사이트를 통해 파일을 다운로드하고 이를 실행할 경우 감염됩니다. SNS로는 sns에 올라온 사진 및 단축 URL을 이용해 랜섬웨어를 유포합니다. 네트워크망으로는 네트워크를 통해 최신 보안패치가 적용되지 않은 PC를 스캔하여 악성코드를 감염 및 확산시킵니다.

<Ransomware 감염경로>

  1). 신뢰할 수 없는 사이트

      -단순한 페이지 방문으로도 감염

      -Drive-by-Download 기법을 통해 유포

  2). 스팸메일

      -첨부파일 및 메일에 URL 링크를 넣어 악성코드를 유포

  3). 파일공유 사이트

      -P2P 사이트에서 파일을 다운로드하고 이를 실행할 경우 감염 (Torrent, 웹 서버)

  4). SNS

      -SNS에 올라온 사진 및 단축 URL을 통해 유포

  5). 네트워크망

      -네트워크를 통해 최신 보안패치가 적용되지 않은 PC를 스캔하여 악성코드를 감염 및 확산.

 

4. 마무리

 이로써 랜섬웨어에 대한 포스팅을 마치겠습니다. 그리고 마지막으로 당부드리고 싶은 것은 랜섬웨어에 걸리지 않도록 위에 나와있는 감염경로를 조심하시고, 자신이 쓰는 운영체제의 보안 패치를 꼭 받는 것입니다. 읽어주셔서 감사합니다.

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

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

+ Recent posts