본문 바로가기

보안/시스템 보안

scanf 함수 사용으로 인한 버퍼 오버플로(BOF) 실습

Q. 버퍼 오버플로란? 

버퍼에 데이터를 쓰는 소프트웨어가 버퍼의 용량을 초과하여 인접한 메모리 위치를 덮어쓸 때 발생하는 비정상적인 현상

 

[실습 조건 ]

  • 아래 C 소스 코드를 컴파일한 바이너리에는 scanf 함수 사용으로 인한 버퍼 오버플로(BOF) 취약점이 존재한다.
  • 64비트 리눅스 환경에서 GDB 및 BOF 취약점을 이용하여 Welcome! 메시지가 화면에 출력되도록 하는 과정을 보이는 포스트를 작성하시오.
  • 올바른 패스워드를 입력하여 나오는 Welcome! 메시지는 인정하지 않는다.
    32비트 환경이나 바이너리도 인정하지 않는다
  • 빌드 방법 : gcc -g -o hw hw.c
[hw.c]
#include <stdio.h>
#include <string.h>

void ShowWelcomeMessage (void)
{
        puts ("Welcome!");
}

int CheckPassword (void)
{
        char aBuffer [32];
        printf ("Password: ");
        scanf ("%s", aBuffer);
        return strcmp (aBuffer, "tltmxpaqhdkstlftmq");
}

int main (int argc, char * argv [])
{
        CheckPassword () ? puts ("Access Denied.") : ShowWelcomeMessage ();

        return 0;
}

 

[BoF 예제]
Breakpoint 1, 0x00005555555551b1 in CheckPassword () at hw.c:13
13              scanf ("%s", aBuffer);
(gdb) n
Password: 		--> 버퍼 오버플로를 발생시키는 패스워드 입력
14              return strcmp (aBuffer, "tltmxpaqhdkstlftmq");
(gdb) continue
Continuing.
Welcome!

Program received signal SIGSEGV, Segmentation fault.
0x00007fffffffdee8 in ?? ()