버퍼오버플로우 시나리오 작성

yeong-min·2023년 12월 26일
1

버퍼오버플로우 취약 프로그램

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

void fun_c(char *str){
	char buffer[10];
    scanf("%s", buffer);
}

void fun_b(char *str){
	char buffer[10];
    strcpy(buffer, str);
    fun_c(buffer);
}

void fun_a(char *str){
	char buffer[10];
    strcat(buffer, str);
    fun_b(buffer);
}

int main(int argc, char **argv){
	if(argc!=2){
    	printf("사용법 : %s <입력 문자열>\n", argv[0]);
        return -1;
    }
    
    fun_a(argv[1]);
    
    return 0;
}

일반 사용자 권한의 공격자가, root가 소유한 프로그램에 대해 버퍼 오버플로우 공격을 수행하여 root shell을 획득하는 시나리오를 상세히 설명하시오.

시작 전 앞서 fun_b의 return address 주소를 구하기 위해


fun_b의 buffer시작주소 - fun_c의 buffer시작주소
0xffe08052-0xffe08012=40(16진수) 64(10진수)
총 64byte의 차이가 이론상(22byte)보다 훨씬 크게 나왔습니다.
그래서 운영체제마다 다른 더미데이터가 있는 것 같아서 더미데이터가 없다는 가정하에 시나리오를 작성해보았습니다.
기준 주소는 fun_b의 buffer시작주소 : 0xffe08052를 사용하였습니다.

시나리오 순서
1. 코드가 스택에서 실행될 수 있게 설정해주고 root권한을 주고 setuid권한을 줍니다.
스택의 주소가 계속 변경되는 ASLR도 꺼줍니다
2. fun_b 버퍼의 시작주소가 0xffe08052이고 그 바로 밑에는 fun_c의 str이 4byte차지 하고 그 밑에 악성코드로 주소를 바꿔줄 return address의 주소가 있습니다. 총 8을 빼주면 변경할 return address의 주소(fun_c의 return address) : 0xffe0804a

  1. fun_c안에 scanf라는 함수에 버퍼오버플로우를 시킬 것입니다.
    총 스택 프레임의 길이는 위 사진과 같이 총 82byte입니다.
    더미 데이더가 없다는 가정이므로 fun_c버퍼의 시작주소는 fun_b의 buffer의 시작 주소(0xffe08052)에서 str(4byte) + return address(4byte) +saved ebp(4byte) + buffer 크기(10byte) = 22byte를 뺀 값이 되므로 fun_c의 시작주소(0xffe0803c) 이므로 여기부터 덮어쓰기가 시작됩니다.
  1. 82byte의 악성 파일을 만든 후 쉘코드 30byte를 추가하고 나머지는 NOP로 채우고 변경할 return address의 주소(0xffe0804a)는 자기 자신보다 크면 되고 쉘코드 위로만 가지 않게 보내면 됩니다.
    왜냐하면 위에 NOP에 eip가 가게 되면 eip는 계속 1byte씩 증가하므로 결국은 쉘코드를 실행시키게 됩니다.

주의할 점

  • intel이므로 return address주소에 리틀엔디안 형식으로 입력해야합니다.
  • “00”이들어가면 문자열로 인식해서 00이 들어가지 않게 return address 주소를 조작해야합니다.

위 공격을 방어하는 방법

  1. 스택 가드 (Stack Guard) : 스택 가드는 프로그램이 악의적인 공격에서 보다 안전하도록 도와주는 보안 기술입니다. 이것은 스택 메모리 영역을 보호하고 스택 버퍼 오버플로우와 같은 공격으로부터 시스템을 보호합니다. 스택 가드가 활성화되면 스택 메모리를 효과적으로 보호하게 됩니다.

  2. ASLR (Address Space Layout Randomization):
    ASLR은 주소를 랜덤하게 만드는 기술입니다. ASLR을 활성화하면 프로세스의 메모리 주소가 무작위로 변경되어 악의적인 공격자가 쉽게 예측하지 못하게 합니다.

  3. 스택에서 코드 실행 불가능 하게 만들기
    스택에서 코드 실행으로 쉘코드가 실행되어 악성코드를 전파하는 방식인데 스택에서 코드 실행을 불가능하게 만들면 방어할 수 있습니다.

0개의 댓글