Dreamhack/Dreamhack Wargame (Challenge)

[32] IT 비전공자 [dreamhack] whatsdifferent문제 풀기

imaginefuture-1 2024. 10. 11. 09:51

 

 

32번째 문제다. whatsdifferent?

 

ff fs파일의 다른점?

 

 

지피티야지피티야!

 

`FF` 파일과 `FS` 파일은 다양한 맥락에서 다르게 사용될 수 있지만, 일반적으로 컴퓨터 시스템이나 소프트웨어에서 의미가 다릅니다. 아래에 몇 가지 가능한 의미를 정리해 보겠습니다:

### 1. **FF 파일**

- **FF (File Format)**:
  - "FF"는 여러 파일 형식을 의미할 수 있으며, 특정 소프트웨어에서 사용하는 특정 파일 형식으로 해석될 수 있습니다.
  
- **Flash File**:
  - Adobe Flash 관련 파일일 수 있으며, `.ff` 확장자를 가진 파일이 Adobe Flash 콘텐츠를 포함할 수 있습니다. 

- **Fast-Forward**:
  - 미디어 파일에서 자주 사용되는 용어로, 비디오나 오디오 파일에서 빠르게 재생하는 기능을 의미합니다.

### 2. **FS 파일**

- **FS (File System)**:
  - "FS"는 일반적으로 파일 시스템을 의미하며, 컴퓨터에서 데이터를 저장하고 관리하는 구조를 가리킵니다. 
  - 예를 들어, `ext4`, `NTFS`, `FAT32` 등 다양한 파일 시스템이 있습니다.

- **FS (File Specification)**:
  - 파일 형식이나 구조를 정의하는 데 사용될 수 있습니다. 이는 특정 소프트웨어에서 요구하는 파일의 규격을 나타낼 수 있습니다.

- **Game Files**:
  - 일부 게임에서 사용하는 파일 형식일 수 있으며, 게임의 리소스나 데이터가 포함될 수 있습니다.

### 3. **특정 프로그램에서의 사용**

- **프로그래밍 언어**: 
  - 특정 프로그래밍 언어에서는 "FF"와 "FS"가 고유한 구조체나 데이터 타입을 가리킬 수 있습니다.

- **의료 파일**: 
  - 일부 의료 소프트웨어에서는 `FF`와 `FS`가 의료 기록이나 이미지 파일을 나타낼 수 있습니다.

### 결론

`FF` 파일과 `FS` 파일은 그 자체로 일반화된 파일 형식이 아니며, 특정 컨텍스트에서 그 의미가 달라질 수 있습니다. 어떤 소프트웨어나 환경에서 사용하는지에 따라 다르게 해석될 수 있습니다. 더 구체적인 정보나 맥락을 제공해 주시면, 더 자세한 설명을 드릴 수 있습니다!

 

 

ㅇㅎ,,특정 소프트웨어의 특정 파일이냐, 아니면 파일 시스템 구조냐  차이인 것같은데..

 

흠.. 소스코드를 보자

 

// Name: chall.c
// Compile Option: gcc chall.c -o chall -fno-stack-protector

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>

#define FLAG_SIZE 0x45

void alarm_handler() {
    puts("TIME OUT");
    exit(-1);
}

void initialize() {
    setvbuf(stdin, NULL, _IONBF, 0);
    setvbuf(stdout, NULL, _IONBF, 0);

    signal(SIGALRM, alarm_handler);
    alarm(30);
}


int main(int argc, char *argv[]) {
    char cmd[50];
    char input[21];
    char filter[] = {'&', ';', '|', '$', '`', '*','[', ']', '{', '}', '\\', '^', '~', '?', '#', '!'};

    initialize();
    system("ls -al");
    printf("Input Command: \n");
    scanf("%20[^\n]", input);

    // filtering
    for (int i = 0; i < strlen(input); i++){
        for (int j = 0; j < sizeof(filter); j++){
            if(input[i] == filter[j]){
                printf("filtered.\n");
                exit(0);
            }
        }
    }

    snprintf(cmd, 49, "(%s) > /dev/null", input);

    system(cmd);
    system("cat ./out");
    printf("Terminated\n");

    return 0;
}

 

 

지피티야 지피티야!

 

 

This C program, `chall.c`, has a few notable features and potential security implications. Here’s a detailed analysis of the code:

### Code Breakdown

1. **Header Files**:
    - The code includes standard libraries for input/output (`stdio.h`), memory allocation (`stdlib.h`), signal handling (`signal.h`), and string manipulation (`string.h`).

 

입출력, 메모리 할당, 신호처리 및 문자열 조작 표준 라이브러리 헤더 포함되어있음.


2. **Constants**:
    - `#define FLAG_SIZE 0x45`: This constant is defined but not used in the program, suggesting it might be a remnant from earlier development or intended for future use.

 

 flag_size는 0x25 69비트

 

3. **Signal Handling**:
    - The function `alarm_handler()` is defined to handle alarms, printing "TIME OUT" and exiting the program if a timeout occurs (after 30 seconds).

 

타이머 기능


4. **Initialization**:
    - The `initialize()` function sets the input and output buffers to be unbuffered (`_IONBF`), sets up the alarm handler, and starts a 30-second countdown alarm.

 

초기화 부분은 늘 아직 어려운 것 같다.. 이 부분은 공부하고 다시 봐야겠다.

_IONBF는 C 프로그래밍 언어에서 사용하는 입력 및 출력 버퍼링 모드 중 하나입니다. setvbuf() 함수와 함께 사용되며, 이 모드는 버퍼링을 비활성화합니다. 즉, 입력 또는 출력이 발생할 때마다 데이터를 즉시 처리하도록 합니다.


5. **Main Function**:
    - The program starts with a greeting and prints the output of `ls -al` to the console.
    - It prompts the user for input and reads a command up to 20 characters long using `scanf("%20[^\n]", input)`.
    - The input is then filtered for certain special characters defined in the `filter` array: `{'&', ';', '|', '$', '`', '*', '[', ']', '{', '}', '\\', '^', '~', '?', '#', '!'}`. If any of these characters are found in the input, the program outputs "filtered." and exits.

 

ls -al 콘솔에 출력 인쇄

20자 길이 명령어를 읽음. 

filter배열에 정의된 특정 특수 문자에 대해 필터링됨.

저기 괄호안에 있는 특수 문자들이 입력에서 발견되면 프로그램은 filtered 출력하고 종료.


6. **Command Execution**:
    - If the input passes the filter, the program constructs a command string using `snprintf(cmd, 49, "(%s) > /dev/null", input);`. This means it wraps the input command in parentheses and redirects its output to `/dev/null`, essentially discarding it.
    - The program then executes the constructed command using `system(cmd)` and displays the contents of `./out` using another `system("cat ./out");`.

 

여기 부분이 특이한데

 

본질적으로 버린다는데...에? 버린다고요?

  • 입력이 필터를 통과하면 프로그램은 .를 사용하여 명령 문자열을 구성합니다 snprintf(cmd, 49, "(%s) > /dev/null", input);. 즉, 입력 명령을 괄호로 묶고 출력을 .로 리디렉션하여 /dev/null본질적으로 버립니다.
  • 그런 다음 프로그램은 구성된 명령을 사용하여 실행 하고 다른 명령을 사용하여 system(cmd)해당 내용을 표시합니다 ../outsystem("cat ./out");

크흐흐흑 아직은 어렵다..


### Security Implications

1. **Command Injection Vulnerability**:
    - Although the program attempts to filter certain dangerous characters to prevent command injection, the filtering might not be robust enough. For instance, if the input bypasses the filter (e.g., through encoding or other means), it could potentially allow the execution of malicious commands.
필터 우회하는 경우는 역시 어쩔 수 없는 보안 이슈인듯


2. **Using `system()`**:
    - The use of `system()` to execute commands from user input is inherently risky, as it allows for command execution if the input is improperly handled. 

 

system()이 본질적으로(!) 위험하다하네. 

입력을 통해 명령을 실행해서 사용하니까. 그럼 입력을 통하지않고 명령을 실행하는 방법이...있나..? (먼산)


3. **Buffer Overflow Risk**:
    - The command buffer (`cmd`) is sized at 50 characters, while the `snprintf()` uses a format specifier to limit the input size. This is generally safe, but care must be taken to ensure that inputs do not exceed the buffer size, especially in cases where filters might be bypassed.

 

버퍼 오퍼플로 위험은 피해갈수가없다..


4. **Uncontrolled Output Redirection**:
    - The output redirection to `/dev/null` means any output from the command is discarded, which can be useful for suppressing unwanted output but may hide important errors that could be critical for debugging or security assessments.

 

아까 위에서 얘기했든 /dev/null명령의 모든 출력이 삭제되는걸 의미하는데

장점:원치않는 출력 억제

단점:디버깅이나 보안평가에 중요한 오류를 숨김 가능.

 

모든것엔 양면성이 있다..ㅠ


5. **Timeout Handling**:
    - The timeout feature is a good practice to prevent long-running commands from being executed indefinitely, but it could lead to frustration if users do not complete their commands in time.

 

엌ㅋㅋ 실망감을 줄 수 있다는데요? (감정적인 이해 미스의 보안 이슈인건가..)

사용자 감정도 생각해야함 ㅠ

 

 


### Summary

Overall, this code demonstrates some basic concepts of command handling in C, but its reliance on `system()` for executing user inputs poses significant security risks, particularly regarding command injection. The filtering mechanism may not be sufficient, and it's crucial to validate and sanitize all user inputs thoroughly to mitigate potential security vulnerabilities.

 

 

접속하면 이렇게 뜬다

&입력하니 앞서 얘기했든 filtered가 뜬다

 

그 외의 문자를 입력하면 what's different?

terminated 뜬다.

diff ff fs 다른점을 했을 때도 

what's different? terminated가 뜨길래

으에 어떡하지 싶어서 블로그 검색해보니

https://yenas0.tistory.com/122

 

[Dreamhack] Write up - whatsdifferent

https://dreamhack.io/wargame/challenges/900 whatsdifferent Description 드림이는 ff 파일의 내용을 약간 수정해서 fs 파일로 저장했습니다. 드림이가 수정한 부분은 어디였을까요? 수정한 부분이 포함된 라인의 전

yenas0.tistory.com

 ./out파일은 출력되니까 그냥 이쪽으로 리다이렉션 시키면 될까 싶어서 명령어 쳤는데

 

out을 통해 dh가 떴다. 

 

 

리다이렉션은 Unix/Linux 시스템에서 명령의 입력 또는 출력을 다른 파일이나 장치로 보내는 기술입니다. C 언어의 system() 함수를 사용하여 외부 명령을 실행할 때, 리다이렉션을 활용하면 명령의 결과를 파일에 저장하거나, 파일에서 데이터를 읽을 수 있습니다. 아래에서 리다이렉션의 기본 개념과 C 코드에서 어떻게 사용하는지 설명하겠습니다.

1. 리다이렉션의 기본 개념

리다이렉션은 일반적으로 다음과 같은 방식으로 사용됩니다:

  • 출력 리다이렉션 (> 또는 >>):
    • >: 명령의 출력을 지정한 파일로 보냅니다. 파일이 이미 존재하는 경우, 기존 내용을 덮어씁니다.
    • >>: 명령의 출력을 지정한 파일로 보내며, 파일이 존재하는 경우 내용을 추가합니다.
  • 헤에 기존 내용을 덮어씌워버린거군.