예외 상황 예제 개발 1실 서버팀 우상욱 소스 첨가(…)
프로그램 실행 전 VC++ 프로젝트 설정 (Release) 최적화 off 버퍼 보안 검사 off
Access Violation 잘못된 메모리(주소) 참조 실행을 제한하지 않을 경우 잘못된 메모리주소 사용으로 인한 프로그램 오작동 야기 검사하는 영역이 한정되어 있음
Access Violation 검사 영역 유저 모드를 제외한 범위에서 발생 유저 모드에서도 코드 영역에서는 발생한다. 파티션 x86 32비트 윈도우 3GB 유저 모드 x64 64비트 윈도우 IA-64 64비트 윈도우 NULL 포인터 할당 0x00000000 0x0000000000000000 0x0000FFFF 0x000000000000FFFF 유저 모드 0x00010000 0x0000000000010000 0x7FFEFFFF 0xBFFEFFFF 0x000007FFFFFEFFFF 0x000006FBFFFEFFFF 64KB 접근 금지 0x7FFF0000 0xBFFF0000 0x000007FFFFFF0000 0x000006FBFFFF0000 0x7FFFFFFF 0xBFFFFFFF 0x000007FFFFFFFFFF 0x000006FBFFFFFFFF 커널 모드 0x80000000 0xC0000000 0x0000080000000000 0x000006FC00000000 0xFFFFFFFF 0xFFFFFFFFFFFFFFFF 유저 모드를 제외한 범위에서 발생 유저 모드에서도 코드 영역에서는 발생한다.
Divide by Zero 피제수를 0으로 나누려고 할 때 발생 피제수 및 제수에 0이 있을 때 0÷a=0(a≠0)이 며, 0÷0의 몫은 부정(不定), a÷0은 불능이 된다. 정의되지 않은 값 / 또는 무한 이기 때문에 데 이터로 표현할 수 없음
Divide by Zero
Divide Overflow 나눗셈 연산 결과를 저장할 때, 저장소 공간이 연산 결과를 저장할 수 없을 만큼 적을 때 발생 나눗셈 연산 결과를 저장할 때, 저장소 공간이 연산 결과를 저장할 수 없을 만큼 적을 때 발생 주로 어셈블러에서 DIV 명령어 실행중 발생 (예상하지 못한 크기의 데이터)
Divide Overflow 피제수, 제수, 몫, 나머지 간의 관계 ※ Divisor : r/m (레지스터/메모리), 주로 EBX(BX) 나 ECX(CX)를 사용한다.
Stack Overflow 함수 복귀 전 계속된 함수 호출로 인하여 스택 프레임이 한도를 넘길 때 발생 함수 복귀 전 계속된 함수 호출로 인하여 스택 프레임이 한도를 넘길 때 발생 Window 환경의 기본 스택 크기 → 1MB (VC 의 /stack 옵션으로 조절 가능) Windows 환경에서는 스택이 높은 주소에서 낮은 주소로 자람
Stack Overflow ASM CALL X : 스택 에 복귀할 주소 를 넣고 EIP 를 X 주소의 함수 쪽으로 맞춘다. (ESP 주소 감소) RET : 스택 에서 CALL 당시에 넣었던 복귀 주소를 꺼내어 EIP 를 맞춘다. (ESP 주소 증가) PUSH X : 해당 값을 스택에 넣 으면서 ESP를 자라게 한다.(ESP 주소 감소) POP X : 해당 위치에 현재 ESP 의 위치에 저장되어 있던 값을 넣고 ESP 는 줄어든다.(ESP 주 소 증가) 스택 (예제에서) 높은 주소 낮은주소 이쪽은 생략합니다…. main에서 EBP 복귀주소 – CALL RecursiveFunction RecursiveFunction에서 EBP …
Buffer Overrun Buffer Overrun = Buffer Overflow 정해진 버퍼 공간을 넘어서 사용 대표적인 함수 strcpy → strcpy_s strcat → strcat_s
Buffer Overrun CALL 명령시 스택에 넣 었던 공간까지 사용 RET 으로 복귀시 엉뚱 한 위치로 복귀 해커(크래커)들이 권한 을 얻기 위해 자주 사용 한 방법 Strcpy 전 스택 Strcpy 후 스택 비고 높은주소 낮은주소 main의 스택 프레임 var 주소 0x0040109C (복귀주소) 0x00401020 (hacked 함수주소) 복귀시 hacked 함수 호출 main의 EBP FFFF input (strcpy 매개변수) EEEE DDDD CCCC BBBB AAAA
Check ESP Failure Debug 모드에서 컴파일 할 경우, Stack Frame의 값이 올바른지 검사하는 명령어를 추가함 함수 호출 후 복귀후 __RTC_CheckEsp 함수를 호출하 여 스택(ESP) 검사 Release 모드는 명령어 추가 없음
Check ESP Failure 라이브러리 버전이 다른 경우 강제 캐스팅(예제) 다중상속으로 인한 호출 함수 불일치 헤더 파일 변경등… 라이브러리 사용처에서 변경사항 이 반영이 안된 상태로 사용 강제 캐스팅(예제) 다중상속으로 인한 호출 함수 불일치 기타 등등… 결국, Stack(ESP)이 함수 호출 후 올바르지 않게 되는 공통적인 문제 발생.
참고자료 제프리 리처의 Windows via C/C++ Debugging Applications for Microsoft .NET and Microsoft Windows 어셈블리언어(5/E) : Assembly Language For Intel-Based Computers http://dic.naver.com/ http://www.ethanhein.com/wp/2009 /be-brave-go-ahead-and-divide-by- zero/ http://www.devnote.net/44 http://wikidocs.net/mybook/read/pa ge?pageid=3914 http://www.gamedev.net/community /forums/topic.asp?topic_id=308819