CTF 풀이

[드림핵] r-xor-t 풀이

화이트해커 Luna 🌙 2024. 2. 13. 09:41
728x90
반응형

 

해당 문제는 Dreamhack CTF Season 4 Round #2 (🌱Div2) 에 출제된 문제입니다.

 

 

 

 

 

 

 

1. 프로그램 분석

 

주어진 문제파일을 다운로드한 뒤, 자세한 분석을 위해 디컴파일 했습니다. 

 

 

 

소스코드 입니다. 

 

undefined8 main(void)
{
    int iVar1;        // 정수형 변수 iVar1 선언
    size_t sVar2;     // 문자열 길이를 저장할 변수 sVar2 선언
    int local_14;     // 지역 변수 local_14 선언
    int local_10;     // 지역 변수 local_10 선언
    int local_c;      // 지역 변수 local_c 선언

    puts("Input: ");  // "Input: " 메시지 출력
    __isoc99_scanf(&DAT_00102010, input);  // 사용자로부터 입력을 받아 변수 input에 저장

    sVar2 = strlen(input);  // 입력된 문자열의 길이를 확인하여 변수 sVar2에 저장

    // 입력된 문자열의 길이가 64(0x40)이면 처리를 시작합니다.
    if (sVar2 == 0x40) {
        // 입력된 문자열을 처리하여 변형하고 rot 배열에 저장하는 반복문
        for (local_c = 0; local_c < 0x40; local_c = local_c + 1) {
            (&rot)[local_c] = input[local_c] + 0xd & 0x7f;
        }

        result[0] = DAT_001040df;  // result 배열의 첫 번째 요소에 값을 설정

        // rot 배열의 내용을 역순으로 처리하여 result 배열에 저장하는 반복문
        for (local_10 = 1; local_10 < 0x3f; local_10 = local_10 + 1) {
            result[local_10] = (&rot)[0x3f - local_10];
        }

        result[63] = rot;  // result 배열의 마지막 요소에 rot 배열을 저장

        // result 배열의 값에 3을 XOR 연산하여 result2 배열에 저장하는 반복문
        for (local_14 = 0; local_14 < 0x41; local_14 = local_14 + 1) {
            result2[local_14] = result[local_14] ^ 3;
        }
    }

    // result2 배열과 주어진 문자열을 비교하여 일치하는지 확인
    iVar1 = strncmp(result2, "C@qpl==Bppl@<=pG<>@l>@Blsp<@l@AArqmGr=B@A>q@@B=GEsmC@ArBmAGlA=@q", 0x40);
    if (iVar1 == 0) {
        puts("\nNice!");  // "Nice!" 메시지 출력
        printf("Flag is DH{%s}\n", input);  // 입력된 문자열을 포함한 플래그 출력
    }

    return 0;  // 프로그램 종료
}

 

 

 

해당 프로그램이 사용자로부터 입력을 받아 처리하는 과정은 다음과 같습니다. 

 

 

1. `puts("Input: ");`: 사용자에게 "Input: "이라는 메시지를 출력하여 입력을 요청합니다.
2. `__isoc99_scanf(&DAT_00102010,input);`: 사용자가 입력한 값을 문자열로 받아들입니다. 여기서 `DAT_00102010`은 입력된 문자열이 저장될 메모리 위치를 나타냅니다.
3. `sVar2 = strlen(input);`: 입력된 문자열의 길이를 확인합니다.
4. `if (sVar2 == 0x40) {`: 입력된 문자열의 길이가 0x40(64)인지 확인하는 조건문입니다.
5. `(&rot)[local_c] = input[local_c] + 0xd & 0x7f;`: 입력된 문자열을 변형시키는 반복문입니다. 각 문자에 0xd를 더하고, 결과가 0x7f를 초과하지 않도록 조정하여 `rot` 배열에 저장합니다.
6. `result[0] = DAT_001040df;`: `result` 배열의 첫 번째 요소에 값을 설정합니다.
7. `result[local_10] = (&rot)[0x3f - local_10];`: `result` 배열을 초기화한 후, `rot` 배열의 내용을 역순으로 저장합니다.
8. `result[63] = rot;`: `result` 배열의 마지막 요소에 `rot` 배열을 저장합니다.
9. `result2[local_14] = result[local_14] ^ 3;`: `result` 배열의 각 요소에 3을 XOR 연산하여 `result2` 배열에 저장합니다.
10. `iVar1 = strncmp(result2,"C@qpl==Bppl@<=pG<>@l>@Blsp<@l@AArqmGr=B@A>q@@B=GEsmC@ArBmAGlA=@q",0x40);`: `result2` 배열과 주어진 문자열을 비교하여 일치하는지 확인합니다.
11. `if (iVar1 == 0) {`: 일치한다면 다음을 실행합니다.
12. `puts("\nNice!");`: "Nice!"라는 메시지를 출력합니다.
13. `printf("Flag is DH{%s}\n",input);`: 입력된 문자열을 포함한 플래그를 출력합니다.
14. `return 0;`: 프로그램을 종료합니다.

 





 

2. 페이로드 분석

 

 

이 프로그램에서는 입력된 문자열을 역순으로 배열하고 XOR 연산 및 다른 변형을 적용하여 처리합니다. 이러한 변형 과정을 역으로 적용함으로써 원래의 플래그를 복원할 수 있습니다

 

 

아래는 변형된 문자열을 역으로 해독하고, 원래의 플래그를 복원하는 익스플로잇 스크립트 입니다. 

 

# 주어진 문자열
text = "C@qpl==Bppl@<=pG<>@l>@Blsp<@l@AArqmGr=B@A>q@@B=GEsmC@ArBmAGlA=@q"

# 1. 주어진 문자열을 역순으로 배열하고, 각 문자에 3을 XOR 연산합니다.
text2 = ''.join([chr(ord(c) ^ 3) for c in reversed(text)])

# 2. 각 문자에 -13을 적용하여 원래 문자열을 복원합니다.
text3 = ''.join([chr((ord(c) - 13) & 0x7f) for c in text2])

# 복원된 문자열 출력
print(f"Flag is DH{{{text3}}}")

 

 

 

이 Exploit 코드는 다음과 같은 과정을 거쳐 플래그를 획득합니다.

 

  1. 주어진 문자열을 역순으로 배열하고, 각 문자에 3을 XOR 연산하여 변형합니다.
  2. 변형된 문자열에 -13을 적용하여 원래 문자열을 복원합니다.
  3. 복원된 문자열을 출력하며, 이를 플래그 형식에 맞추어 출력합니다.

 


3. FLAG

 

더보기

DH{e615b75a4d563ac971466e05641d7aed556b62fcb460b6027f126bff411bfe63}

 

 


문의는 댓글 남겨주세요

 

728x90
반응형