Buffer Overflow 와 Format String Bug
프로세스 구조
CODE
- TEXT 영역이라고도 한다.
- 실행할 프로그램의 코드가 저장되어 있다.
- CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리한다.
DATA
- 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역이다.
- 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.
HEAP
- 사용자가 직접 관리할 수 있는 메모리 영역이다.
- 사용자에 의해 동적으로 메모리 공각이 할당되고 해제된다.
- 메모리의 낮은 주소에서 높은 주소로 할당된다.
- c 언어의 malloc
STACK
- 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.
- 함수의 호출과 관계된 지역변수와 매개변수가 저장된다.
- 메모리의 높은 주소에서 낮은 주소로 할당된다.
STACK 할당 예시
Buffer Overflow
- 할당된 버퍼의 크기를 초과한 데이터가 입력되어 인접한 다른 메모리 정보를 덧쓰는 현상이다.
- 프로세스가 데이터를 버퍼에 저장할 때 프로그래머가 지정한 곳 바깥에 저장하는 것을 의미한다.
- 할당받은 공간보다 더 많은 입력을 받아 발생한다.
- return address 를 변경하여 악의적인 코드를 실행시킬 수 있다.
BoF 발생 예시
- 32 bit 시스템이라고 가정한다.
int main(){
char buf[10];
scanf("%s",buf);
...
}
- 입력 전.
-
AAAAAAAAAAAAAAAAAA
입력을 한다 -
입력 후.
- 할당 받은 버퍼 크기를 넘는 입력을 받아 인접한 메모리의 정보가 덧씌워졌다.
- Buffer Overflow 공격을 통해 리턴 주소를 공격자 마음대로 수정할 수 있다.
포맷 스트링 ( FSB )
- Format String Bug
- 입력 값에 포맷 스트링을 넣으면 문자로 취급하는게 아닌, 서식 문자로 취급하여 취약점이 일어날 수 있다.
- 포맷팅 문자열에서 발생한다.
- 메모리 안의 정보를 누출시킬 수 있다. 즉 스택 메모리의 정보를 얻을 수 있다.
- 잘못된 메모리 주소에 접근을 시도하여 프로그램을 중단시킬 수 있다.
- %n 을 이용하여 스택 값을 변조할 수 있다. 즉 리턴 주소 값을 수정하여 악의적인 코드를 실행시킬 수 있다.
예시
- 코드
int main(int argc, char **argv){
printf(argv[1]);
}
- 입력
./example "%s%s%s%s"
-
스택에 있는 메모리 정보를 노출 시킨다.
-
입력
./example "%p%p%p%p"
- 실행하는 순간의 스택에 있는 메모리 주소를 출력해준다.
댓글남기기