1. BOF - Buffer OverFlow / OOB - Out Of Boundary / Off-by-one
초심으로 돌아가서 처음부터 다시 공부하자.
1. BOF, 버퍼 오버플로우 라고 불리우는 메모리 관련 취약점.
- 일반적으로 스택, 힙에 발생하는 취약점으로, 버퍼가 허용할 수 있는 양을 초과할 때 발생하는 취약점
- 각각을 스택 오버플로우, 힙 오버플로우 라고 부름
- 버퍼에 입력제한이나 검증등의 방지책이 없을 때 ret 영역을 덮어씌우는 공격이 가능
- *sfp는 스택 프레임 포인터로 쉽게 ebp 값이 저장되는 영역을 의미
스택 오버플로우는 주로 입력 길이에 대한 검증을 정확히 수행하지 않을 때 발생.
길이를 명시하는 함수를 쓰더라도, 버퍼와 길이간 검증은 필수.
2. OOB, 아웃 오브 바운더리 라고 불리우는 메모리 관련 취약점.
- 버퍼 범위 바깥의 인덱스에 접근할 때 발생
- 에러로도 있다. 동일한 이유이며 이를 이용하여 공격할 수 있는 상황이 있기에 취약점이 된 것.
- 대표적으로, 버퍼에 입력할 때 index 값을 지정하는 경우 발생 가능
: 사용자에게 index값을 입력하도록 한 후 해당 index에 값을 입력할 때
: %로 해결이 안된다. (buffer length가 10이라고 입력받은 index%10을 해도, 음수를 쓰면 된다)
- dreamhack OOB ex3의 경우 다음과 같이 풀이가 된다.
1. 4byte int의 표현 범위는 -2147483648 ~ 2147483647(-2^31~2^31-1)이다.
2. 즉 2147483648과 -2147483648은 동일 (1000 0000 0000 0000)
3. -2147483648 값을 입력하고, 해당 값에 -를 붙이더라도 결국 다시 -2147483648이 되는 것. (2147483648이라는 값은 표현 불가능)
4. 해당 값 %10을 하면 결국 -8이 된다.
3. Off-by-one
- 경계 검사에서 발생하는 취약점. 버퍼에 for문 돌릴 때, 인덱스 한개 잘못 넘어가거나 하는 경우. - for문에서 실수하는 경우가 대표적인데, 해당 버퍼 이후에 중요한 변수값이 있으면 위험할 수 있다.