Dreamhack - baby-bof (버퍼오버플로우)

·2025년 11월 3일

Dreamhack-Writeups

목록 보기
45/53

baby-bof

문제 링크

https://dreamhack.io/wargame/challenges/974

문제 설명

Simple pwnable 101 challenge
Q. What is Return Address?
Q. Explain that why BOF is dangerous.

풀이과정

  1. 주어진 C코드를 확인해 보았습니다. 중요한 코드만 확인해 보겠습니다.
void win () 
{
  char flag[100] = {0,};
  int fd;
  puts ("You mustn't be here! It's a vulnerability!");

  fd = open ("./flag", O_RDONLY);
  read(fd, flag, 0x60);
  puts(flag);
  exit(0);
}

win함수를 호출하면 플래그를 획득할 수 있습니다.

  char name[16];

  // don't care this init function
  proc_init (); 

  printf ("the main function doesn't call win function (0x%lx)!\n", win);

이름을 입력받기 위해 16바이트 크기의 버퍼를 설정합니다.

이름을 입력하면 (0x%lx)!\n", win 를 통해 win 함수의 주소를 16진수(0x%lx)로 출력합니다. 이 주소를 확인해 win 함수를 호출할 수 있습니다.

  printf ("hex value: ");
  scanf ("%lx%c", &value);

  printf ("integer count: ");
  scanf ("%d%c", &count);

두 번째와 세 번째 입력입니다.

hex value 에서는 덮어쓸 값을 입력받아 value로 저장합니다. 플래그를 획득하기 위해서는 win 함수에 접근해야 함으로, 위에서 알아낸 16진수를 입력합니다.

integer count 에서는 덮어쓸 횟수를 정수로 입력받아 count로 저장합니다.

  for (idx = 0; idx < count; idx++) {
    *(long*)(name+idx*8) = value;
  }

핵심 코드입니다.

name의 시작 주소부터 8바이트씩(long), 떨어진 메모리 주소에 value를 덮어씁니다.

하지만 for문은 name이 몇 바이트인지 제대로 확인하고 있지 않고, count의 입력을 허용하고 있습니다. 즉, name보다 큰 값이 들어오게 된다면 버퍼 오버플로우가 발생하게 되는 것입니다.

name은 앞에서 확인했듯 16바이트입니다. name을 덮어쓰기 위해서는 16바이트를 넘어야 하기에 integer count에서 입력값은 3을 초과해야 합니다. count값이 3을 초과하게 되면 name의 입력 범위를 넘어, 버퍼오버플로우가 발생하게 됩니다.

  1. 우분투 환경에서 주어진 VM에 접속합니다. 괄호 안에 vim 주소가 있음을 확인할 수 있었습니다.
    name은 무엇을 입력하든 공격과 상관이 없으니 아무 값이나 입력해줍니다.

입력받은 name값과 name 배열의 시작 주소부터 8바이트 단위로 16번(0x10) 메모리 주소와 값을 출력하는걸 확인할 수 있었습니다.

  1. 이어서 hex value 와 count를 입력해줍니다. 위에서 알아낸 것 처럼 value에는 제공된 vim 주소값, count 에는 3 이상의 값을 입력해줍니다.

정상적으로 플래그를 획득할 수 있었습니다.


느낀점

  • c코드를 해석하는데에 어려움을 느꼈습니다. 코드 공부 또한 소홀히 하면 안되겠다고 느꼈습니다.
  • 버퍼 오버플로우를 주제로 문제를 풀어보는 것은 이번이 2번째인데, 제대로 확인을 하지 않으면 실행되면 안되는 코드까지 강제로 실행시킬 수 있는 매우 심각한 취약점이 될 수 있음을 깨달았습니다.

Summary (English)

  • Simple pwnable where win() prints the flag but is not called by main.
  • Vulnerability: unchecked loop writes 8-byte value into name+idx*8, allowing out-of-bounds writes.
  • Exploit: use printed win address as value and count>3 to overwrite a return address (or control data) with win's address.
  • Result: program returns into win() and prints the flag — shows why BOF is dangerous.
profile
CTF 풀이 및 실습 중심 학습을 기록합니다.

0개의 댓글