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]](/assets/images/windows/0x03_1.png)
![[그림 1-2]](/assets/images/windows/0x03_2.png)
Buffer 시작 위치가 EBP-12C인 것을 확인할 수 있습니다.
SFP도 덮어줘야 하니까 거리는 304가 되겠네요.(12C = 300)
- Exploit 작성하기
메모리 보호기법이 적용되지 않은 프로그램이기 때문에 RET를 Shellcode가 있는 곳의 주소로 변조하기만 하면 됩니다.
그럼 Payload는 아래 코드와 같이 Nop과 Shellcode를 합쳐서 304만큼 만들어주고, RET는 Shellcode 시작 전 Nop이 있는 위치로 지정하면 되겠네요.
![[그림 1-3]](/assets/images/windows/0x03_3.png)
immunity debugger로 프로그램 흐름을 한 번 살펴보겠습니다.
![[그림 1-4]](/assets/images/windows/0x03_4.png)
Strcpy가 동작이 완료된 후, RET가 Buffer 시작 주소로 잘 변조되었네요.
Main 함수의 RET를 변조했기 때문에 실제로 Shellcode가 실행되는 시점은 Main 함수의 에필로그 과정이 진행된 다음입니다.
에필로그 과정의 마지막에서 변조된 RET 주소로 프로그램의 흐름이 바뀌면 다음과 같이 Shellcode를 만나러 갑니다.
![[그림 1-5]](/assets/images/windows/0x03_5.png)
- 공격 결과 확인
![[그림 1-6]](/assets/images/windows/0x03_6.png)
CMD가 정상적으로 잘 실행되네요^^
지금까지 Direct EIP Overwrite에 대해서 알아봤습니다. 다음 연재에서는 메모리 보호 기법 중 하나인 ASLR의 개념과 우회 방법을 다루어보도록 하겠습니다.