본문 바로가기

악성코드/스텍 프레임 변조

버퍼 오버플로우 BO

버퍼 오버플로우 개념

- 데이터의 길이에 대한 불명확한 정의를 악용한 덮어쓰기로 발생

- 해커가 의도적으로 구성한 정보로 덮어쓰는 공격 수행 가능

- 버퍼 오버플로우 공격에 취약한 함수와 그렇지 않은 함수가 있음(ex. strcpy() )

 

 

버퍼 오버플로우 공격 취약한 기본 예제 코드

int main()(int argc, char *argv[])
{
	char buffer[10];
    strcpy(buffer, argv[1]);
    printf("%s\n", &buffer);
}

 

예제 코드에서 오버플로우 공격은 strcpy(buffer, argv[1]) 에서 발생한다.

 

 

GDB를 통하여 본 main()으로부터 strcpy()가 호출되는 과정

 

프로세스 흐름도

1. 스택에 ebp 값을 넣음

2. 현재의 ESP 값을 EBP 레지스터에 저장 - 프레임 포인터 갱신

3. main 함수의 char buffer[10]; 실행

 - 스택 프레임 내에 로컬 버퍼 할당

 - 10 바이트를 할당했으나 char 문자열 처리로 4바이트 단위, 정렬로 실제로 12바이트 할당

4. EBP가 가리키는 주소로부터 12바이트 상위의 내용을 EAX 레지스터에 저장

 - EAX에 argv[]에 대한 포인터 값 저장

5. EAX가 argv[1]을 가리키도록 수정

6. EDX 레지스터에 명령어 라인 제 1 인수의 포인터, 즉 argv[1] 저장

7. strcpy()의 제 2인자로 스택에 저장

8. EAX 레지스터에 -12(%ebp)를 주소 값으로 계싼해서 즉, buffer의 시작 주소 저장

9. 스택에 buffer의 시작 주소 저장

10. call 0x8048340 <strcpy>

 

 

즉,

strcpy 함수는 입력된 인수의 경계를 체크하지 않음

10개 이상의 문자를 인자로 전달할 경우 buffer 위치에 10개 이상의 문자 복사

16개 이상 입력하면 EBP를 지나 RET 주소 공간까지 덮어 쓰기 가능

 

 

버퍼 오버플로우 공격 대응 방안

1. 버퍼 오버플로우에 취약한 함수 사용 금지(strcpy, strcat, getwd, gets, fscanf,realpath,spritf)

2. 경계선 관리가 엄격히 수행되는 솔리드 코딩 필요

3. 최신 운영체제 사용

 - 스택 가드

 - 스택 실드

 - non-excutable stack

'악성코드 > 스텍 프레임 변조' 카테고리의 다른 글

스택 프레임 변수 FS  (0) 2024.12.12
포맷 스트링 공격  (0) 2024.11.19