Dreamhack/Dreamhack Wargame (Challenge)

[28] IT 비전공자 [dreamhack] bof문제 풀기

imaginefuture-1 2024. 10. 7. 08:02

 

큰일났다

baby bof도 아직 못 풀었는데 bof를 어떻게 풀어요...

 

https://3omh4.tistory.com/entry/systemhacking-stack-buffer-overflow-%EC%8A%A4%ED%83%9D-%EB%B2%84%ED%8D%BC-%EC%98%A4%EB%B2%84%ED%94%8C%EB%A1%9C%EC%9A%B0

 

[System][Dreamhack] stack buffer overflow - 스택 버퍼 오버플로우

드림핵 내용을 기반으로 내 방식으로 이해한 내용을 정리했다. (잘못된 내용이 있다면 댓글로 알려주세요..!) 스택 버퍼 오버플로우 스택의 버퍼에서 발생하는 오버플로우 버퍼 데이터가 목적지

3omh4.tistory.com

 

여기 블로그가 bof에 대한 설명을 진짜 친절하게 잘해두셨다.

빨리 c언어 공부 하고 이 문제 풀어야겠다;;

 

포인터랑 배열 개념은 대충 머릿속에 이해는 됐는데 아직 실천에 응용하기까진

적응이 걸리는 것 같다.

 

저 분이 설명한 그림처럼 코드를 보면 머리속에 스택을 생각하면서 코드를 읽어야겠다.

신기하겠다. 코드를 읽으면 저게 머릿속에 그려지면서 읽힌다는게...햐~

 

 


2024-10-22

 

c언어보다는 stack 메모리 저장 방식에 대한 이해도가 필요한 문제다.

혼공컴퓨터구조와원리os책을 완독하고 나니 이해가 된다.

 

그럼 이제 풀어보자

 

https://velog.io/@wearetheone/Dreamhack-CTF-bof

 

[Dreamhack CTF] bof

문제를 다운 받으면 도커파일 하나랑이렇게 파일 3개가 들어가 있다.cat, flag는 택스트로 되어 있고 bof는 바이너리 파일로 되어 있어서 bof가 실행파일이라고 생각했다.그리고 bof를 실행시켜보면

velog.io

https://hackinguko.tistory.com/102

 

[PWN] dreamhack - bof writeup

Dreamhack CTF Season 5 Round #2 (🌱Div2) 에 출제된 bof 문제 풀이주어진 파일을 열어보면 ./cat이라는 문자열이 v5 변수에 들어간다.그리고 read_cat이라는 함수의 인자로 전달되어 실행된다. 이때 사용자가

hackinguko.tistory.com

https://mnzy.tistory.com/204

 

[Dreamhack] beginner: bof

1. 문제https://dreamhack.io/wargame/challenges/1111 bofDescription Buffer overflow is one of the basics of pwnable 🐱 The path of the flag file is /home/bof/flag.dreamhack.ioThe path of the flag file is /home/bof/flag.2. 풀이(1) 코드 확인main()

mnzy.tistory.com

https://dorigamja.tistory.com/entry/pwnable-bof

 

DreamHack [pwnable] bof

시스템해킹 비기너 문제입니다.  ubuntu에 접속해서 서버를 확인하면, 초록색 글자가 출력되는 글자다.meow? 라는 출력에 oo을 입력했고, 고양이 그림과 함께 meow, oo :) 문장이 출력됐다.그리고 mero

dorigamja.tistory.com

 

 

IDA로 BOF파일을 디컴파일러하면 이렇게 나온다. %144s는 144글자다

 

(1) 코드 확인
main(): 사용자의 입력을 받아 read_cat()함수를 호출하고 입력을 출력하는 코드이다. 
이때 ./cat 이 저장되는 v5변수는 16바이트이고, 입력값은 128 바이트의 크기이다.
즉,  v4의 크기가 128바이트인데, scanf로 최대 144바이트를 읽어들이므로, bof가 발생할 수 있는 것이다. 

read_cat(): 주어진 파일 경로(v5)를 열고, 최대 128바이트의 내용을 읽어서 출력한다. (파일 내용 출력)
따라서 입력값으로 128바이트+flag의 경로를 주면 v5에 영향을 줄 것이다. 


출처 ㅣhttps://mnzy.tistory.com/204

 

문제 설명을 보면 /home/bof/flag 위치에 flag가 존재한다고 적혀있으니, 
딱봐도 v5주소에 있는 문자열을 임의의 path로 덮어서 flag를 얻는 문제라고 생각된다.

그리고 나서 read_cat 함수를 확인해보니 128바이트만 read함수로 넘겨준다.
128바이트 이후 문자열부터는 bof로 인해 ./cat이라는 문자열이 존재하는 영역을 침범할 수 있고
이를 이용하여 ./cat이 아니라 flag가 존재하는 임의의 주소로 변경해줄 수 있다.

출처 ㅣ https://hackinguko.tistory.com/102

 

 


버퍼를 꽉 채운 후, 그 뒤에 /home/bof/flag의 위치를 입력해주면 open의 인자값으로 들어가면서 flag가 나오지 않을까?

https://velog.io/@wearetheone/Dreamhack-CTF-bof

 

gpt:

 

이 코드는 C 언어로 작성된 프로그램입니다. 여기서는 주요 동작을 살펴보고, 각 부분을 설명해 드릴게요. 이 코드에는 **버퍼 오버플로우**와 관련된 취약점이 있을 수 있습니다.

### 코드 분석

1. **함수 시그니처**
   ```c
   int __fastcall main(int argc, const char **argv, const char **envp)
   ```
   - `main` 함수는 표준 C 프로그램의 진입점입니다. 여기서는 **`__fastcall`**이라는 호출 규약을 사용하고 있습니다. 이는 **매개변수를 레지스터를 통해 전달**하는 빠른 호출 방식입니다. 보통 컴파일러에 의해 적용되며, 호출 규약에 따라 함수 인자의 전달 방식이 다를 수 있습니다.
   - `argc`, `argv`, `envp`는 각각 **명령줄 인수의 개수**, **명령줄 인수 배열**, **환경 변수 배열**입니다.

2. **변수 선언**
   ```c
   char v4[128]; // [rsp+0h] [rbp-90h] BYREF
   char v5[16];  // [rsp+80h] [rbp-10h] BYREF
   ```
   - **`v4`**는 128바이트 크기의 배열로, 사용자 입력을 저장하는 버퍼입니다.
   - **`v5`**는 16바이트 크기의 배열로, `"./cat"` 문자열을 저장하는 버퍼입니다.

3. **`init(argc, argv, envp)`**
   - 이 함수는 전달된 인수들과 환경 변수를 초기화하는 함수로 보입니다. 구체적인 동작은 코드에서 확인할 수 없으나, 일반적으로 **초기 설정이나 환경 구성을** 수행합니다.

4. **`strcpy(v5, "./cat")`**
   ```c
   strcpy(v5, "./cat");
   ```
   - **`strcpy`** 함수는 문자열을 복사하는 함수입니다. `"./cat"` 문자열을 **`v5`** 배열에 복사합니다. 이 문자열은 나중에 파일을 읽는 동작에 사용됩니다.

5. **`printf("meow? ")`**
   - 단순히 `"meow?"`를 출력하는 부분입니다. 사용자에게 입력을 요청하는 메시지로 보입니다.

6. **사용자 입력 받기 (`__isoc99_scanf`)**
   ```c
   __isoc99_scanf("%144s", v4);
   ```
   - `scanf`를 사용하여 사용자 입력을 **`v4` 배열**에 저장합니다. 이때 **최대 144바이트**의 문자열을 입력받도록 설정되어 있습니다. 그러나 **`v4`는 128바이트 크기**이므로, 여기서 **버퍼 오버플로우 취약점**이 발생할 수 있습니다.
   - 입력 크기가 배열 크기를 초과할 수 있기 때문에, 악의적인 사용자가 **버퍼를 넘치는 데이터를 입력**하여 메모리 손상을 일으킬 수 있습니다.

7. **`read_cat(v5)`**
   - 이 함수는 **`v5`에 저장된 문자열**을 사용하여 파일을 읽는 것으로 보입니다. `v5`에는 `"./cat"`이 저장되어 있으므로, **`cat` 파일을 읽는** 동작을 수행할 가능성이 큽니다. 

8. **출력 (`printf`)**
   ```c
   printf("meow, %s :)\n", v4);
   ```
   - 사용자 입력을 출력하는 부분입니다. `%s`에 **`v4`** 배열의 값을 넣어, 사용자가 입력한 문자열을 화면에 출력합니다.

### 버퍼 오버플로우 위험성
이 코드에서 가장 중요한 부분은 **`__isoc99_scanf("%144s", v4)`**입니다. 이 부분에서 **144바이트**의 데이터를 입력받도록 설정되어 있지만, 실제로 **`v4` 배열은 128바이트**만 할당되어 있습니다. 따라서, 128바이트 이상의 데이터를 입력하면 **버퍼 오버플로우**가 발생할 수 있습니다.

이 취약점을 통해 공격자는 **스택 메모리**를 덮어쓰거나 **제어 흐름을 변경**할 수 있습니다. 이는 보안상 매우 위험한 상황을 초래할 수 있으며, 시스템에 심각한 영향을 미칠 수 있습니다.

### 해결 방법
이러한 버퍼 오버플로우 문제를 방지하기 위해서는 입력받는 데이터의 크기를 배열의 크기에 맞게 제한해야 합니다. 예를 들어, **`scanf`** 대신 **`fgets`**와 같은 함수로 입력 크기를 명시적으로 제한하는 것이 좋습니다.

```c
fgets(v4, sizeof(v4), stdin);
```

이렇게 하면 배열 `v4`의 크기(128바이트)를 초과하지 않는 안전한 입력을 받을 수 있습니다.

### 결론
이 코드는 버퍼 오버플로우 취약점을 가지고 있으며, 이를 통해 공격자는 시스템의 메모리를 손상시킬 수 있습니다. 이를 해결하려면 입력 크기를 제한하는 적절한 방법을 사용하여 안전하게 처리해야 합니다.

서버 접속 시

 

a를 144글자 넣어본다(정확히 세진않았다. 아무튼 그 이상) %144s 그럼 open()error오류가 뜬다

 

버퍼를 꽉채운다음 끝에 /home/bof/flag 넣어줬더니 flag가 나왔다.