시큐어코딩
시큐어코딩 (8) - CH 02-4 버퍼 오버플로우란 무엇일까?
vitamin3000
2025. 4. 13. 22:07
이번 포스트에서는 버퍼 오버플로우에 대해 학습해보고자 한다
1. 버퍼 오버플로우란..
데이터가 특정 데이터 구조에 할당된 메모리 경계 외부에 기록될 때 발생한다
- 버퍼 경계가 무시되고 확인되지 않을 때 발생
- 버퍼 오버플로우는 다음을 수정하는데 악용될 수 있다
- 변수
- 데이터 포인터
- 함수 포인터
- 스택의 반환 주소
2. Smashging tthe Stack(스택을 부수다?)
이 내용은 빈도와 잠재적 결과 때문에 중요한 취약성 유형이다
- 이것은 버퍼 오버플로가 실행 스택에 할당된 메모리의 데이터를 덮어쓸 때 발생한다
- 성공적인 악용은 스택의 반환 주소를 덮어써서 대상 컴퓨터에서 임의의 코드를 실행할 수 있도록 한다
3. 버퍼 오버플로우의 코드 예제
예를 들어 문자열을 비교하는 아래의 코드가 있다고 가정해보자
char IsPasswordOk(void){
char Password[12];
gets(Password);
if(!strcmp(Password, "badprog"))
return(true)
else return (false);
}
이때 Password의 입력값을 "12345678901234567890"로 입력한다면,
Password에 할당된 메모리 공간에는 최대 11자와 NULL 종료 문자만 저장할 수 있으므로 스택에 있는 반환 주소와 기타 데이터가 덮어 씌워진다.
이를 스택으로 살펴보면 다음과 같다.
이때의 EBP, ESP의 값들이 덮어씌워지며 주소를 찾지 못해 오륙 ㅏㅂ라생한다.
4. Vulnerability(취약성)
이번엔 Password의 문자열의 값을 “1234567890123456j►*!”로 입력했다고 가정해보자.
스택에는 다음과 같이 쌓인다.
여기서, EBP는 넘어가고 Return Addr Caller.에 주목해보자
j►*!와 \0이 조건이 만족하여, 오류가 발생하지 않고 실행이 된다.
무엇이 실행되냐면..
3~5행은 스킵하고, 6행부터 실행되는 것.
따라서 이러한 취약점은 입력 문자열에 포함된 임의의 코드를 실행하는데 악용 될 수 있다.