문제 설명
우분투 터미에서 드림핵 포트번호 입력하고 접속했다.
그럼 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 |