소스코드다
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define JOKER "\x40\x53\x06\x03\x43\x52\x54\x3b"
#define KEY "023661dd4\0"
#define TRUE 1
#define FALSE 0
#define OK 0
#define ERRO -1
void __print_sw_title (char *sw_name);
int __is_valid_pwd (char *pwd);
char *__obfuscation (char *pwd, char *key);
void __create_tag (char *id);
int main (int argc, char *argv[]) {
if (argc != 2) {
__print_sw_title(argv[0]);
return ERRO;
}
if ( __is_valid_pwd(argv[1]) ) {
__create_tag(argv[0]);
printf("\n +-+ 무, 무슨... 말도 안돼!! 어떻게 복호화 키를...?? +-+ \n");
} else {
printf("\n 너의 파일들은 이제 요단강을 건너다가 저승사자와 하이파이브를 하게되었다! 으하하하하!\n"); // ㅋㅋㅋㅋㅋㅋ
}
return OK;
}
int __is_valid_pwd (char *pwd) {
if (! strncmp(JOKER, __obfuscation(pwd, KEY), sizeof(JOKER)) ) {
return TRUE;
}
return FALSE;
}
char *__obfuscation (char *pwd, char *key) {
int i;
for (i = 0; i < strlen(pwd); i++) {
if(key[i] == '\0') break;
pwd[i] = pwd[i] ^ key[i];
}
return pwd;
}
void __print_sw_title (char *sw_name) {
printf(" ----------- [%s] ----------- \n", sw_name);
printf(" ::. 복호화 방법: %s <복호화키>\n\n", sw_name);
}
void __create_tag (char *id) {
FILE *fd;
char *tag_name = (char *)malloc(24 * sizeof(char));
memset(tag_name, '\0', 24);
snprintf(tag_name,24, "./%s.success", id);
fd = fopen(tag_name, "w");
if (fd != NULL) {
fprintf(fd, "복호화가 완료되었습니다.\n");
fclose(fd);
} else {
printf("[ }{4k3r m3ss493 ] Hey sussy baka~ 7h3r3 w4s 4n 3rr0r 0p3nin9 7h3 file..\n");
}
}
차근 차근 소스코드를 보자 일단 문제에선 간단한 xor연산이랬으니 아마도 이 아래 둘을 xor하면 답은 나올 것 같다
#define JOKER "\x40\x53\x06\x03\x43\x52\x54\x3b"
#define KEY "023661dd4\0"
int main (int argc, char *argv[]) {
if (argc != 2) {
__print_sw_title(argv[0]);
return ERRO;
}
if ( __is_valid_pwd(argv[1]) ) {
__create_tag(argv[0]);
printf("\n +-+ 무, 무슨... 말도 안돼!! 어떻게 복호화 키를...?? +-+ \n");
} else {
printf("\n 너의 파일들은 이제 요단강을 건너다가 저승사자와 하이파이브를 하게되었다! 으하하하하!\n"); // ㅋㅋㅋㅋㅋㅋ
}
return OK;
__is_vaild_pwd가 1(true)이면 풀린다 1인 경우를 보자
int __is_valid_pwd (char *pwd) {
if (! strncmp(JOKER, __obfuscation(pwd, KEY), sizeof(JOKER)) ) {
return TRUE;
}
return FALSE;
}
JOKER랑 __obfuscation을 비교해서 값이 같으면 true 다. JOKER값은 알고있으니 __obfuscation에 대해 더 보자
char *__obfuscation (char *pwd, char *key) {
int i;
for (i = 0; i < strlen(pwd); i++) {
if(key[i] == '\0') break;
pwd[i] = pwd[i] ^ key[i];
}
return pwd;
}
obfuscation은 pwd[i]즉 받은 인자와 key값을 xor한 값이다
pwd[i]가 flag이므로
JOKER = obfuscation = flag XOR KEY
FLAG = KEY XOR JOKER
FLAG = 023661dd4 XOR \x40\x53\x06\x03\x43\x52\x54\x3b
'Dreamhack > Dreamhack Wargame (Challenge)' 카테고리의 다른 글
[110] IT 비전공자 [dreamhack]Check Function Argument문제 풀기 (0) | 2024.12.29 |
---|---|
[109] IT 비전공자 [dreamhack]mmapped문제 풀기 (1) | 2024.12.28 |
[108] IT 비전공자 [dreamhack]cpp_string문제 풀기 (1) | 2024.12.26 |
[107] IT 비전공자 [dreamhack][CodeEngn] Malware L07문제 풀기 (2) | 2024.12.25 |
[106] IT 비전공자 [dreamhack]__environ문제 풀기 (0) | 2024.12.24 |