촉촉한초코칩
[Dreamhack] littlevsbig 본문
코드
// 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가 나오는 조건은 int_arr[0]와 int_arr[1]이 저 값과 동일해야 한다.
int_arr은 입력받을 arr배열을 가리키는 포인터 인 것 같다.
실행
ubuntu에서 chall.c 생성하고 gcc 명령어 입력해주었다.
- input_arr[0] : arr[3] [2] [1] [0] → 0x64726d68
- input_arr[1] : 입력한 값 (arr[7] [6] [5] [4]) → 0x636b3a29
입력 : 0x686d72 64293a6b63
그러면 6자가 최대인데..
print문에서 0x%x가 무슨 뜻인지 모르겠어서 찾아봤다. → 16진수(헥사) 형식으로 정수를 출력하는 형식 지정자
arr에 8글자를 입력하고 각 글자를 16진수로 변환된 값이 0x64726d68와 0x636b3a29가 되어야 한다.
그래서 위 16진수를 문자열로 변환했더니 drmhck:) 이런 문자열이 나왔다.
문자열을 거꾸로 뒤집으면 될 것 같다.
4개씩 나눠지니까 4문자씩 앞뒤를 바꿔주었다.
뭐지.....
nc로 접속해야 하는 거였다...
아무튼 성공
'Study > MISC' 카테고리의 다른 글
[Dreamhack] Snowing! (0) | 2024.09.17 |
---|---|
[Dreamhack] addition-quiz (0) | 2024.09.11 |
[Dreamhack] broken-png (0) | 2024.09.04 |
[Dreamhack] **Exercise: Docker (0) | 2024.08.20 |
[Dreamhack] dreamhack-tools-cyberchef (0) | 2024.08.12 |