/ POSTS

windows-0x03

0x03 Basic Bof

What is the Buffer Overflow?

Buffer Overflow(이하 BOF)는 데이터의 저장 또는 보관을 위해 주어진 메모리 공간의 크기보다 더 많은 값을 입력해 인접 메모리의 값을 변조할 수 있는 공격 기법입니다. 공격자들이 BOF를 이용해서 주로 하는 일은 변수의 값을 변조하는 것과 RET를 변조해서 프로그램의 흐름을 조작하는 것입니다.

이 취약점은 왜 발생할까요?

  • strcpy, gets 등의 입력 값 길이를 체크하지 않는 취약한 문자열 함수의 사용
  • 길이 값 검증을 하지 않은 취약한 프로그램 설계

BOF는 흔히 위의 두 가지 이유로 발생합니다. 그렇다면 이 취약점이 발생하지 않게 하려면 어떻게 하면 될까요? 입력 값 길이를 체크하는 안전한 문자열 함수를 사용하면 되겠죠? 물론 이것도 중요하지만 안전한 함수의 사용만으로는 이 공격을 100% 막을 수는 없습니다. 안전한 함수로 문자열 길이 500만큼 받도록 해놓더라도 버퍼의 크기가 300이면 BOF가 일어날 수 있습니다. 그렇기 때문에 안전한 문자열 함수의 사용과 더불어 안전한 프로그램 설계도 뒷받침되어야 합니다.

Direct EIP Overwrite

아래 소스코드를 가지고 가장 기초적인 BOF를 다루어보도록 하겠습니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#pragma warning (disable:4996)
#define _CRT_SECURE_NO_WARNINGS

int main(int argc, char* argv[]) {

    char content_buffer[1000];
    char display_buffer[300];
    FILE *f = fopen(argv[1], "rb");

    fgets(content_buffer, 1000, f);
    strcpy(display_buffer,content_buffer);

    printf("%s\n", display_buffer);

    fclose(f);
    return 0;
}

fgets로 길이 1000만큼 파일을 읽어와서 content_buffer에 값을 저장하고, 다시 content_buffer에서 display_buffer로 값을 복사한 후 출력해주는 프로그램입니다. 여기서 문제는 strcpy로 content_buffer에서 display_buffer로 값을 복사한다는 것이죠.

본격적으로 공격을 시작해보도록 하겠습니다.

  • Buffer 시작 주소에서 RET까지의 거리 알아내기

Buffer 시작 위치에서 값을 얼마나 넣어야 RET를 변조할 수 있는지 알아야 공격이 가능하겠죠?

지금은 거리를 모르니 다음과 같이 간단하게 “A” 100개만 넣어서 분석을 해보겠습니다.

[그림 1-1]
[그림 1-1]
[그림 1-2]
[그림 1-2]

Buffer 시작 위치가 EBP-12C인 것을 확인할 수 있습니다.

SFP도 덮어줘야 하니까 거리는 304가 되겠네요.(12C = 300)

  • Exploit 작성하기

메모리 보호기법이 적용되지 않은 프로그램이기 때문에 RET를 Shellcode가 있는 곳의 주소로 변조하기만 하면 됩니다.

그럼 Payload는 아래 코드와 같이 Nop과 Shellcode를 합쳐서 304만큼 만들어주고, RET는 Shellcode 시작 전 Nop이 있는 위치로 지정하면 되겠네요.

[그림 1-3]
[그림 1-3]

immunity debugger로 프로그램 흐름을 한 번 살펴보겠습니다.

[그림 1-4]
[그림 1-4]

Strcpy가 동작이 완료된 후, RET가 Buffer 시작 주소로 잘 변조되었네요.

Main 함수의 RET를 변조했기 때문에 실제로 Shellcode가 실행되는 시점은 Main 함수의 에필로그 과정이 진행된 다음입니다.

에필로그 과정의 마지막에서 변조된 RET 주소로 프로그램의 흐름이 바뀌면 다음과 같이 Shellcode를 만나러 갑니다.

[그림 1-5]
[그림 1-5]
  • 공격 결과 확인
[그림 1-6]
[그림 1-6]

CMD가 정상적으로 잘 실행되네요^^

지금까지 Direct EIP Overwrite에 대해서 알아봤습니다. 다음 연재에서는 메모리 보호 기법 중 하나인 ASLR의 개념과 우회 방법을 다루어보도록 하겠습니다.