ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 메모리 보호 기법이란? - 리눅스에서의 메모리 보호기법 1부
    시스템 해킹 지식/삽질하며 알아가는 Linux에서의 메모리 보호기법 2019. 5. 9. 20:13
    반응형
    SMALL

    안녕하세요. Luke입니다. 이 카테고리의 글에서는 리눅스에서 사용되는 메모리 보호 기법에 대하여 포스팅을 해보려 합니다. 저는 시스템 해킹을 하게 된 계기가 FTZ로 접한 후, LOB를 풀며 RTL이라는 기법을 익힐 때 쯤, A0V3R CTF가 끝난 후 준하라는 친구가 ROP 기법에 대해 알려준 다음부터 본격적으로 시스템 해킹을 하게 된 것 같습니다.

     

    그러나 제가 느낀 점은 과연 쉘코드를 이용해서 스택 오버플로우를 끝낸 늅늅이 해커가 바로 메모리 보호기법에 대해 수월하게 익히고 익스플로잇을 성공적으로 할 수 있을까 라는 생각이 들었습니다. 그래서 제가 한번 메모리 보호 기법에 대해 풀어서 한번 설명을 해보고, 메모리 보호 기법을 우회하는 방법에 대해 쉽게 풀어써보자 라는 생각으로 포스팅을 시작하게 되었습니다. 해당 카테고리의 글은 적어도, Stack Overflow라는 취약점과 메모리의 구조에 대해 알고있다는 전제 하에 작성되었습니다.


    그럼 메모리 보호란 무엇일까요?

    먼저 위키백과에서는 메모리 보호를 이렇게 설명합니다.

    메모리 보호는 컴퓨터 메모리의 사용을 제어하는 방법이며 모든 운영 체제에서 중요한 쟁점사항 중 하나이다. 운영 체제에서 실행하고 있는 프로세스가 자신에게 할당되지 않은 영역의 메모리에 접근하는 것을 막는 것이 메모리 보호의 주된 목적이다. 이를 통해 프로세스 내의 버그가 다른 프로세스의 동작에 영향을 미치는 것을 예방하며 악성 소프트웨어가 시스템에서 허가되지 않은 접근권한을 갖고 시스템에 영향을 끼치는 것을 막아준다.

     

    길게 나열했지만, 짧게 요약해서 말하자면 다음과 같습니다.

     

    "취약점이 있는 프로그램의 익스플로잇을 어렵게 하는 것!"

     

    아니... 취약점이 있는 프로그램인데.. 어떻게 익스플로잇을 어렵게 할 수 있다는 것인지... 어렵게만 느껴지기도 합니다.


    어떻게 프로그램 상에 취약점이 있는데 익스플로잇이 어려워지는가?

    메모리 보호 기법을 이용하게 되면, 실제 소스코드 상에 취약점이 있어도 익스플로잇이 정상적이 방법으로 이루어지기 어렵게 됩니다. 그럼 도대체 왜 익스플로잇이 어려워지게 된다는 것일까요?

     

    일반적으로, 버퍼 오버플로우 공격은 buffer를 오버플로우 시켜, 리턴어드레스를 덮어 해커가 원하는 명령으로 실행 흐름을 조작합니다. 그.런.데. 해커는 어떻게 그 명령을 실행시킬까요?

     

    "바로 해커가 원하는 명령을 쉘코드로 작성하여 넣거나, 메모리의 특정 영역에 해커가 명령을 실행하는데 필요한 문자열을 덮어쓰기하기도 합니다."

     

    그럼 우리가 저기서 주목해야할 부분은 무엇일까요? 바로 빨간색으로 제가 강조처리한 쉘코드와 메모리의 특정 영역입니다.

     

    "만약 쉘코드를 실행할 수 없고(NX), 메모리의 특정 영역에 덮어쓸 수 없다면(Full relro) 어떻게 될까요? 또는, 오버플로우가 되었는지를 마지막에서 확인하거나(Canary), 주소를 알 수 없게 계속 주소가 바뀐다면(ASLR, PIE)?

     

    하핳 망했네요?

    네... 매우 골치 아파지겠지요 ㅎㅎ 이렇게 취약점이 있더라도 익스플로잇을 골치 아프게 하는게 메모리 보호기법입니다. 그러나, 그렇다고 포기할 우리의 해커들이 아니죠. 메모리 보호 기법은 취약점을 막는게 아닌 익스플로잇을 귀찮게 만드는 것일 뿐이니 충분히 우회가 가능합니다. (그러니 애초에 시큐어 코딩을 습관화 합시다 ^_^) 

     

    메모리 보호 기법의 종류에는

    • NX
    • Relro(Partial, Full)
    • Canary
    • ASLR
    • PIE

    가 있습니다. 자세한 설명과 우회법은 추후에 올라올 개별 포스팅을 확인해주세요.


    그럼 메모리 보호 기법이 걸려있는지는 어떻게 아나요?

    메모리 보호 기법의 확인은 gdb-peda를 이용하거나 checksec.sh를 이용해 확인할 수 있습니다. gdb-peda의 설치 방법은 gdb-peda에 대한 설명글이 아니므로... 다른분의 링크를 참고해주세요.(https://go-madhat.github.io/gdb-peda/)

     

    gdb-peda 설치 및 사용법!

    요즘 pwnable 문제의 binary를 분석하기위해 gdb를 종종 사용한다. write-up등을 보다보면 gdb가 이쁘길래 어떻게 한 것인가 찾아보다가 gdb-peda를 알게 되었다!

    go-madhat.github.io

     

    저는 gdb-peda를 기준으로 설명할게요. gdb-peda를 설치한 후, gdb로 바이너리를 열어줍니다. 그 다음 그냥 'checksec'이라고 한줄만 쳐주면 됩니다. 참 쉽쥬?

    코드게이트2018 예선 문제 Baskinrobbins31 바이너리 checksec

    해당 바이너리에서는 Canary, PIE는 걸려있지 않고 Partial Relro와 NX만 걸려있다는 것을 알 수 있습니다.(Aslr은 바이너리에서의 설정이 아닌 OS에서의 설정이므로, 익스플로잇 하는 환경에 따라 다릅니다.)

     


    그럼 메모리 보호 기법에 대한 글은 여기서 마치도록 하겠습니다. 다음 편인 NX&ASLR 로 돌아오겠습니다~~!

    반응형
    LIST

    댓글

Copyright ⓒ 2019, WeekHack