⚠️ 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 입력 --> 문제가 해결되었음을 확인
'✒️ Miscellaneous (Misc) > Dreamhack' 카테고리의 다른 글
[Dreamhack] dreamhack-tools-cyberchef Write Up (0) | 2023.11.27 |
---|---|
[Dreamhack] Exercise: Welcome-Beginners 드림핵 워게임 문제 풀이 (0) | 2023.11.25 |
[Dreamhack] baby-linux 드림핵 워게임 문제 풀이 (0) | 2023.11.23 |
[Dreamhack] broken-png 드림핵 워게임 문제 풀이 (0) | 2023.08.20 |
[Dreamhack] 64se64 드림핵 워게임 문제 풀이 (0) | 2023.08.19 |