No img


버퍼 오버플로우(Buffer OverFlow)

Posted by bonggang | 2020. 3. 13. 20:49

개인의 정보 보안 학습을 위해 작성되었습니다. 본 게시물을 불법적으로 활용하실 경우 혹은 본 게시물로 인해 발생하는 모든 문제에 대한 책임은 당사자에게 있으며, 작성자는 어떠한 법적 책임도 지지 않음을 밝힙니다. 해당 문서를 열람하는 것은 이에 대해 동의하는 것으로 간주합니다.


 

기본 개념


연속된 메모리 공간을 사용하는 프로그램에 지정된 버퍼의 크기보다 더 많은 데이터를 입력해서 정해진 메모리 범위 내에 할당된 버퍼 크기를 넘어선 위치에 자료를 읽거나 쓸 수 있다. 이를 이용해서 임의의 프로그램이나 함수를 실행시켜서 공격자 프로그램을 통제할 수 있는 권한을 획득하는 공격 기법이다.

 

버퍼 오버플로우 공격에 취약한 함수

: strcpy, strcat, gets, fscanf, scanf, sprintf, sscanf, vfscanf, vsprinf, vscanf, vsscanf, streadd, strtrns

-> 처리하는 문자열의 최대 크기를 정하지 않는 함수

 

공격 방법


이 때 사용되는 버퍼는 스택과 힙으로 나누어진다. 그렇기 때문에 공격방법 역시 스택 버퍼오버플로우힙 오버플로우로 나눌 수 있다.

 

스택: 지연변수, 인자, 함수 종료 후 돌아갈 곳의 주소 값 등이 저장되며 돌아갈 곳의 주소 값을 변조하여 관리자 권한을 획득하는 것이 스택 버퍼 오버플로우 공격의 목표다.

: malloc, calloc 등의 함수를 사용해 프로그래머가 직접 공간을 할당할 때 이곳에 저장된 데이터 및 함수를 변경하여 원하는 결과를 획득.

 

실습


0. ASLR 해제

echo 0 > /proc/sys/kernel/randomize_va_space

관리자 권한으로 *ASLR을 해제시켜준다.

 

* ASLR: 메모리상의 공격을 어렵게 하기 위해 프로그램 실행 시 메모리 주소를 랜덤 하게 바꾸어 주는 기술

 

1. BOF를 위한 코드 작성

#include <stdio.h>

void attack(){
        printf("attack!\n");
}

int main(int argc, char *argv[]){
        char buffer[50];
        strcpy(buffer, argv[1]);
        printf("%s\n", buffer);
}

 

컴파일 옵션

-fno-stack-protector : 스택 보호 기법 해제

-mpreferred-stack-boundary=2 : 스택 더미 없애기

-z execstack : 스택 메모리에 실행권한 부여

 

실행 결과

 

2. gdb로 분석

* set disassembly-flavor intel: 인텔 버전으로 디스어셈블리 출력

 

info functions를 통해 attack 함수 주소를 확인한다.

 

3. perl 스크립트로 명령어 입력

`perl -e 'print "A"x54, "\x00"'`

 

-> 위 과정을 그림으로 표현하면 대충 아래와 같은 느낌이다.

 

참고


https://m.blog.naver.com/PostView.nhn?blogId=luuzun&logNo=50190684185&proxyReferer=https%3A%2F%2Fwww.google.com%2F

https://blog.naver.com/on21life/221477089117

youtu.be/ZRHncXwedZ8

https://redscreen.tistory.com/27