버퍼오버플로우 공격에 대해

| 2021년 1월 8일 | 0 Comments

안녕하세요. iwinv사업부 임종우입니다.

최근 실생활 속 PC와 컴퓨터 또는 스마트폰 등 전자기기를
많이 접하는 현대 사회에서 대부분의 문서나 자료등을 안전하게 보호하기 위해 

보안을 중요시 하여 소중한 데이터를 날리지 않게  준비하는 자세가 필요하다 생각되어
보안부분에서 알려진 버퍼오버플로우에 대해 글을 작성하게 되었습니다.

 

 

버퍼오버플로우(Buffer Overflow)

버퍼 오버플로우란 시스템 해킹의 대표적인 공격방법 중 하나입니다.
버퍼( buffer) : 데이터가 저장되는 메모리 공간을 뜻하며,

오버플로우(Overflow)는 단어에서 유추할 수 있듯이
데이터가 저장된 크기보다 커서 해당 메모리 공간을 벗어 나는 경우 사용됩니다.

즉 버퍼공간(100%)보다 큰 데이터를 저장하게 해서
일어나는 오버플로우(Overflow)를 이용한 공격방식입니다.

주로 개발된 프로그래밍언어의 버퍼 오버플로우에 취약한 함수가 있을경우
ex) strcpy , strcat , gets , fscanf , scanf , sscanf , vfscanf 등

이를 이용해 공격을 시도하며 공격이 성공할 경우 시스템의 권한을 상승시키거나
악성 행위를 할 수 있기 때문에 버퍼오버플로우공격과 방어에 대해  소개드립니다.

 

 

1. 버퍼오버플로우 공격방식 

스택(Stack) 버퍼 오버플로우 

스택은 함수 처리를 위해 지역변수 및 매개변수가 위치하는 메모리 영역을 말하며, 
스택에 할당된 버퍼들이 문자열 계산등에 의해 정의된 버퍼의 한계치를 넘는 경우

버퍼 오버플로우가 발생하여 복귀 주소(Return Address)를 변경하고
공격자가 원하는 임의의 코드를 실행하는 방식입니다..

 

 


힙(Heap) 버퍼 오버플로우

힙은 사용자가 동적으로 할당하는 메모리영역입니다.
힙에 할당된 버퍼들에 몬자열이 저장되어 질 때, 최초 정의된 힙의 메모리 사이즈를 초과하여

문자열 등이 저장되는 경우 버퍼 오버플로우가 발생하여 데이터와 함수 주소 등을 변경하여
공격자가 원하는 임의 코드를 실행하는 방식입니다.

해당 스택,힙버퍼 오버플로우를 대처하기 위한 방안이 존재하고.
크게 2가지의 방법으로 윗 공격에 대처가 가능합니다.

스택 가드

메모리상에서 프로그램의 복귀 주소(Return Address)와 변수 사이에 카나리 단어(Canary Word)
저장해 두었다가 그 값이 변경되었을 경우 프로그램 실행을 중단하는 기술

ASLR(Address Space Layout Randomization) 
메모리 공격을 방어하기 위해 주소 공간 배치를 난수화하는 방법입니다. 
실행 시 마다 메모리 주소를 변경시켜 악성코드에 의한 특정주소 호출을 방지하여 방어가 가능합니다..

위에서 서술한 스택 버퍼오버플로우에 대한 원리를 간략하게 소개드리겠습니다.

Stack Buffer OverFlow 원리

Stack기반의 버퍼오버플로우에서 가장 중요시 되는건 RET값을 변조한다는 점입니다.
따라서 Buffer Overflow가 일어나는 배열에서 Ret 값이 저장되는 공간까지 거리를 구해야합니다.



#include<studio.h>
func()
{
            printf(“Hacked!\n”);
}

int main(int argc, char *argv[])

            char buffer[100];
            strcpy[buffer, argv[1]]);
            printf(“%\n”,buffer);
            return 0;

}

자료출처 : https://blog.naver.com/luuzun/50190684185


 

 

붉은색으로 표시한 부분이 버퍼오버플로우가 일어나는 부분이고
푸른색으로 표시한 부분이 버퍼오버플로우공격으로 실행시킬 함수입니다.

프로그램을 컴파일 한 뒤 gab를 사용해 디버깅 하면 다음과 같은 코드값을 확인 가능합니다.


자료출처 : https://blog.naver.com/luuzun/50190684185

 

환경변수를 사용한 버퍼 오버플로우 방식도 존재합니다.

NOP이란? 
다음명령어를 실행하는 명령어로 어느부분에 넣어도 Shell이 실행됩니다.

Nop을 이용한 버퍼오버플로우는 몇가지 단점이 존재하는데,

성공여부가 확실하지 않고, buffer와 Ret과는 멀다는 단점이 있습니다.
61Byte 이하면 사용할수가 없습니다.

변수를 설정하면 아래와 같이 표기가 되는데

 

 

 


[whddn1596@localghost tmp]$ export whddn1596’perl -e’ print ” \x90″x100, “x31\xc0 등

환경변수를 다 적용했으면, 코르를 작성하고 환경변수에 저장된 코드의 주소 값을 확인합니다.    

#include<stdlib.h>
int main(int argc, char *argv[])
{
         char *addr;
         addr=getenv)argv[1]);
         printf(“%s Address : %\n”, argv[1],addr);
}

./파일이름 환경변수” 명령어로 실행하면 아래와 같은 결과값이 나옵니다.

[whddn1596@localhost 2]$ ./path whddn1596
whddn1596 Address : 0xbffffb70
whddn1596@localhost 2]$

 

환경 변수로 사용하면 단 한번으로 권리자 권한을 획득 할 수 있습니다.

버퍼오버플로우와  공격방식 대처방안에 대해 
흥미로운 부분을 발견하여 작성되었으며

제가 이해한 부분과 자료를 참고하여 만들었습니다.
보안전문가가 아니다보니 재미로만 읽어주시면 감사하겠습니다.

긴글 읽어주셔서 감사합니다.

 

Category: 보안

Avatar

About the Author ()