버퍼 오버플로우 실습

김동현·2024년 11월 8일
post-thumbnail

시나리오

아래 C 소스 코드를 컴파일한 바이너리에는 scanf 함수 사용으로 인한 버퍼 오버플로(BOF) 취약점이 존재한다.

64비트 리눅스 환경에서 GDB 및 BOF 취약점을 이용하여 Welcome! 메시지가 화면에 출력되도록 하는 과정을 보이는 포스트를 작성하시오.
올바른 패스워드를 입력하여 나오는 Welcome! 메시지는 인정하지 않는다.
32비트 환경이나 바이너리도 인정하지 않는다.

[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;
}

실습 환경

Mac Book M2 pro

kali linux in UTM

과정

hw.c를 컴파일하여 BoF의 취약점을 통해 WelCome!을 출력하는 것이 목표이다.

먼저 디버깅을 하기 전 gcc를 통해 컴파일을 진행하였고 hw.c는 교수님이 올려주신 파일을 이용하였다.

gcc -g -o [이름][컴파일을 할 파일]


gdb접속 후 disass 명령어를 이용하여 main과 CheckPassword를 확인해보았다.
이 코드에서 CheckPassword 함수가 먼저 실행하고 36번째 라인의 __isoc99_scanf@plt 함수 사용으로 취약점이 존재한다고 생각했다.

따라서 break 명령어로 break point를 잡았다.


그 후 x/8gx $rsp를 통해 버퍼의 상태를 확인하려고 했는데 사진과 같이 오류로 인해 볼 수 없었다.


오류 해결 과정

찾아보니 내가 쓰고 있는 맥북의 아키텍쳐가 arm이라 gdb 사용법이 조금 다른 것 같았다. arm와 amd가 사용하고있는 빅엔디안(?) 방식이 다르다고 한다.
일단은 현재 사용할 수 있는 환경이 Mac 뿐이라 여기서 멈췄지만 다른 방법을 더 찾아봐야겠다.


느낀점

  • 오류 해결이 너무 힘들었다. 뭐가 뭔지 모르는 상태에서 오류를 잡으려니 너무 오래걸렸고 결국 ChatGPT와 친구들의 도움으로 문제의 원인까지는 찾았지만 Mac에서 할 수 있는 BoF 실습 과정을 못찾아 조금 아쉬웠다. 다른 방법으로 더 찾아봐야겠다.
profile
코딩

0개의 댓글