Security/Write Up

[Dreamhack] littlevsbig

2er0127 2023. 8. 28. 15:45

Dreamhack CTF Season S4 Round #4 

 

 

 

해당 문제는 리눅스 환경에서

nc host3.dreamhack.games [포트 번호]

로 접속한다.

 

 

 

접속하면 Input: 으로 사용자 입력을 받고, 입력 받은 문자를 16진수로 출력해준다.

 

 

unsigned char arr[9];
    scanf("%8s", arr);
    printf("arr  | 0x%x  0x%x  0x%x  0x%x  0x%x  0x%x  0x%x  0x%x |\n", arr[0], arr[1], arr[2], arr[3], arr[4], arr[5], arr[6], arr[7]);

    unsigned int * int_arr = (unsigned int *)arr;

    printf("arr  | 0x%x  0x%x |\n", int_arr[0], int_arr[1]);

    if(int_arr[0] == 0x64726d68 && int_arr[1] == 0x636b3a29){
        puts("Nice!");
        puts(flag);
    }
    else{
        puts("No...");
    }

 

코드를 보면 

 

8글자를 배열에 담아 출력하고,

다시 4byte씩 int_arr[0], int_arr[1]에 담는다.

 

int_arr[0] == 0x64726d68

&&

int_arr[1] == 0x636b3a29

 

일 때, 플래그가 출력된다.

 

 

 

아스키(ASCII) 코드표를 참고하면 아래와 같다.

0x64726d68 = drmh

0x636b3a29 = ck:)

 

 

 

 

하지만 출력 결과를 보면 리틀엔디안(Little Endian)을 사용하기 때문에 

hmrd):kc

를 입력해야 플래그를 얻을 수 있다.

 

 

 

728x90