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