Buffer OverFlow 공격

00SNU3K·2021년 8월 6일
0
  • stack에 정해진 버퍼보다 큰 공격 코드를 삽입하여 변환 주소를 변경함으로써 임의의 공격 코드를 루트 권한으로 실행하도록 하는 방법

  • 취약한 함수 scanf, gets, strcpy, . . . 등을 사용해서 발생하는 취약점

  1. strcpy 함수의 취약점
//target1.c
#include <stdio.h>
int main (int argc, char* argv[])
{
    char buffer1[5] = {0,};
    char buffer2[5] = {0,};
    
    if(argc>1){
        strcpy(buffer2, argv[1]);
    }
    
    printf("buffer1: %s\n", buffer1);
    printf("buffer2: %s\n", buffer2);
    
    return 0;
}
./target1 AAAAABB
buffer1: BB
buffer2: AAAAA

strcpy 함수는 문자열을 복사할때 문자열의 길이를 체크하지 않음

이처럼 처음 buffer2의 크기 5byte를 초과하는 BB는 다른 메모리를 침범

훤씬 더 긴 인자를 전달하면 Segmentation fault 에러 발생

✔따라서 문자열 길이를 체크하는 strncpy를 사용하여 취약점 제거 가능

//target2.c
#include <stdio.h>
int main (int argc, char* argv[])
{
    int number = 0x12345678;
    char buffer[5] = {0,};
    
    print("%x\n", number);
    if(argc>1){
        strcpy(buffer2, argv[1]);
    }
    print("%x\n", number);
    
    return 0;
}
./target2 $(python -c 'print "A"*5 + "\x21\x43\x65\x87"')
12345678
87654321
  1. gets 표준 입력함수의 취약점
//target3.c
#include <stdio.h>
int main (int argc, char* argv[])
{
    char buffer1[5] = {0,};
    char buffer2[5] = {0,};
    
    gets(buffer2);
   
	printf("buffer1: %s\n", buffer1);
    printf("buffer2: %s\n", buffer2);
    
    return 0;
}
./target3
AAAAABB
buffer1: BB
buffer2: AAAAA

gdb(디버거)를 통해 비정상적인 값의 입력으로 입력한 인자 중 $eip 레지스터에 들어간것을 확인 가능

$eip 레지스터의 값을 변경해서 실행의 흐름 변경 가능

Heap Buffer Overflow 취약점

  • heap은 사용자가 동적으로 할당하는 메모리 영역(malloc()등등)
  • 최초 정의된 힙의 메모리 사이즈 초과, 데이터와 함수 주소 등을 변경, 공격자 임의 코드 실행

Buffer overflow 대응 방안

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

  • ASLR(Address Space Layout Randomization): 메모리 공격을 방어하기 위해 주소 공간 배치를 난수화

    • 실행 시 마다 메모리 주소 변경, 악성코드의 특정 주소 호출 방지

카나리 단어(carnary word) : 메모리 변경 여부를 위해 저장해 두는 특정 값

profile
네트워크 전문가를 꿈꾸며

0개의 댓글