문제 설명


우분투 터미에서 드림핵 포트번호 입력하고 접속했다.

그럼 Input을 입력하라는 줄이 출력되는데, 거기에 사용자가 input 값을 넣으면 해당 문자열을 16진수로 출력한다.

이렇게...

아마 알맞은 문자열 입력하면 'No...' 말고 플래그가 나오는 듯

 

// 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[]) {
    int fd;
    char *flag;

    initialize();

    // read flag
    flag = (char *)malloc(FLAG_SIZE);
    fd = open("./flag", O_RDONLY);
    read(fd, flag, FLAG_SIZE);
    close(fd);

    printf("Input: ");

    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...");
    }

    return 0;
}

이건 문제에 있는 코드인데,

if문을 보면 입력값으로 받은 int_arr[0] == 0x64726d68이고 int_arr[1] == 0x636b3a29일 때 "Nice!"라는 메시지와 함께 플래그를 출력한다는 사실을 알 수 있다.

 

저 16진수 값들을 입력했을 때 플래그가 나온다는 소리라서,

아스키 코드 변환기를 사용해서 입력해야 할 값을 찾아냈다. 

 

64=d

72=r

6d=m

68=h

이므로, 0x64726d68 = drmh

 

63=c

6b=k

3a=:

29=)

이므로, 0x636b3a29 = ck:)

 

이대로 drmhck:) 라고 input을 넣어 봤다. 

어라...

다시 살펴 보니, 출력값이 little andian으로 나오는 거라서 거꾸로 입력해야 하는 거였다. 

hmrd):kc 라고 다시 넣어 봄. 

풀이 완료!

'SWUFORCE > 워게임 풀이' 카테고리의 다른 글

[Dreamhack] addition-quiz (misc)  (0) 2024.08.20
[Dreamhack] whatsdifferent (misc)  (0) 2024.08.06
[Dreamhack] image-storage (web)  (1) 2024.07.22
[wargame.kr] login filtering (web)  (0) 2024.07.16
[wargame.kr] fly me to the moon (web)  (0) 2024.07.16

+ Recent posts