baby bof도 아직 못 풀었는데 bof를 어떻게 풀어요...
여기 블로그가 bof에 대한 설명을 진짜 친절하게 잘해두셨다.
빨리 c언어 공부 하고 이 문제 풀어야겠다;;
포인터랑 배열 개념은 대충 머릿속에 이해는 됐는데 아직 실천에 응용하기까진
적응이 걸리는 것 같다.
저 분이 설명한 그림처럼 코드를 보면 머리속에 스택을 생각하면서 코드를 읽어야겠다.
신기하겠다. 코드를 읽으면 저게 머릿속에 그려지면서 읽힌다는게...햐~
2024-10-22
c언어보다는 stack 메모리 저장 방식에 대한 이해도가 필요한 문제다.
혼공컴퓨터구조와원리os책을 완독하고 나니 이해가 된다.
그럼 이제 풀어보자
https://velog.io/@wearetheone/Dreamhack-CTF-bof
https://hackinguko.tistory.com/102
https://dorigamja.tistory.com/entry/pwnable-bof
(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바이트)를 초과하지 않는 안전한 입력을 받을 수 있습니다.
### 결론
이 코드는 버퍼 오버플로우 취약점을 가지고 있으며, 이를 통해 공격자는 시스템의 메모리를 손상시킬 수 있습니다. 이를 해결하려면 입력 크기를 제한하는 적절한 방법을 사용하여 안전하게 처리해야 합니다.
'Dreamhack > Dreamhack Wargame (Challenge)' 카테고리의 다른 글
[30] IT 비전공자 [dreamhack]file-special-bit문제 풀기 (5) | 2024.10.09 |
---|---|
[29] IT 비전공자 [dreamhack] littlevsbig (misc)문제 풀기 (8) | 2024.10.08 |
[27] IT 비전공자 [dreamhack] ROT128문제 풀기 (3) | 2024.10.06 |
[26] IT 비전공자 [dreamhack] baby-bof문제 풀기 (1) | 2024.10.06 |
[25] IT 비전공자 [dreamhack] simple-operation문제 풀기 (2) | 2024.10.04 |