본문 바로가기
✒️ Miscellaneous (Misc)/Dreamhack

[Dreamhack] littlevsbig Write Up

by A Lim Han 2023. 11. 28.

⚠️ littlevsbig Write Up

1. 문제 확인 후 파일 다운로드

2. 문제 파일 속 chall.c 오픈 후 코드 분석  -->  FLAG 출력 조건 발견

// 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;
}

 

 

++  FLAG 출력 조건

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

 

조건
입력값의 길이 8 바이트(글자)
앞 4바이트의 Hex 변환 결과 0x68  0x6d  0x72  0x64
뒤 4바이트의 Hex 변환 결과 0x29  0x3a  0x6b  0x63

3. Hex값 확인을 위해 Dreamhack Tools로 접속

4. Hex 값 결과를 Input으로 하여 PlainText로 변환

# Input
: 68 6d 72 64 29 3a 6b 63

# OutPut
: hmrd):kc

5. 다시 문제로 돌아와 서버 생성

 

6. 생성한 서버에 접속 후 4번 과정에서 얻은 Input 값 입력  -->  FLAG 발견

7. 문제 정답 입력란에 얻은 FLAG 입력  -->  문제가 해결되었음을 확인