○Buffer Overflow
▷배열의 index로 기존 배열에 할당된 공간을 벗어나 접근하는 것.
▷보안상에서 큰 문제가 될 수 있다. (RET값을 바꾸어 다른 함수로 접근가능)
▶Buffer Overflow에 취약한 함수들
▷strcpy, strcat : 문자열 복사
▷gets / scanf, fscanf, sscanf의 %s : 문자열 입력
◎gets의 buffer overflow
▷gets 함수
▷예제
▷call_echo가 echo를 부름 (stack frame)
▷입력값
▷25글자부터 error 출력.
▷해석
▷char buf[4] -> 24byte 할당됨. (넉넉히 할당 - 컴파일러마다 다름)
▷24글자부터 Return Address에 영향을 미침. (24 char + 1 /nul)
▷24글자가 Error가 안일어나는 이유 : 운이 좋아서 RET가 바뀌어도 상관없는 위치로 바뀌었다.
▷-> RET가 바뀌어도 바로 Error을 일으키지 않음, 원하는 위치로 RET위치 변경 가능
○Code Injection Attack
▷exe 코드를 나타내는 byte를 포함하는 String을 입력.
▷RET를 exploit 코드쪽의 위치로 포함하는 위치로 바꿈.
▷gets를 사용하는 함수가 RET를 하면, exploit code로 jmp함.
▷->특정 코드를 실행하도록 유도가능.
▷ex) Internet Worm, IM wars ...
※Worm과 Virus
▷worm: 혼자 실행가능한 프로그램, 알아서 다른 컴퓨터로 번식시킴.
▷virus: 다른 프로그램에 첨가되는 코드. 독립적으로는 실행 불가.
▶취약점 해결
▶취약한 코드(함수)를 사용하지 않는다.
▷gets -> fgets
▷strcpy > strncpy
▷scanf -> fgets (문자열 읽을때) / %ns (n: 크기)
▶System-Level Protection
▶Randomized stack offsets
▷Stack이 할당될 때, 랜덤으로 공간을 추가로 할당
▷해커가 Address 예측이 힘들도록 함.
▶Nonexecutable code segements
▷Stack의 실행권한 제거
▷Stack에서 exe 코드를 실행할 수 없음.
▶Stack Canaries
▷버퍼에 Overflow를 감지하기 위한 특정 값을 배치함. (Canary)
▷함수에서 나가기 전에 Canary가 변경되었는지 확인 (변경 -> Overflow가 일어났음, 에러)
▷GCC 컴파일러에서 기본적으로 제공 (-fnostack-protector -> 사용하지 않음)
○Return Oriented Programming Attacks
▷ret 근처의 어셈블리 코드 조각들(gadgets)를 이용해서 원하는 결과를 도출해낸다.
▷Stack Randomization, nonexecutable stack을 통해 Code injection이 불가능해진 경우 사용
▷Stack Canary가 적용된 경우, 할 수 없다. (ret값을 건드리기 때문)
▶gadget
▷ret(0x03)으로 끝나는 명령들
▷실행 가능한 고정된 코드 위치