Information Security Study
darimchal_001 본문
XOR을 사용한 암호문을 복호화하는 문제이다.
#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");
}
}
문제 코드이다.
char 자료형의 문자열 인자 1개와 함께 프로그램을 실행시켰을 때 입력한 문자열을 __obfuscation() 내에서 KEY 문자열과 한 글자씩 XOR을 하고, 이 결과가 JOKER 내용과 일치하면 복호화에 성공하는 식으로 동작하는 듯하다.
vscode에서 컴파일을 하니 문제가 생겨 가상머신에서 컴파일 후 실행했다.
문제 코드와 동일한 test.c 파일을 만들었다.
KEY를 얻기 위한 코드를 위와 같이 main() 내에 삽입하여 저장하였다. 해당 코드는 JOKER 문자열과 KEY를 XOR하는, 한마디로 역산하여 평문을 찾아내는 동작을 하는 코드이다.
test.c에서 특정 코드를 삽입한 이후 이를 컴파일 후 임의의 문자열을 인자로 하여 실행을 하면, 'pa55uc0_'라는 문자열이 출력된다.
이를 chall1.c의 컴파일한 파일인 chall2의 인자로 하여 실행시키면 복호화에 성공한 것을 볼 수 있고, '복호화가 완료되었습니다.'라는 문자열이 있는 chall2.success 파일이 같은 경로에 생성된다.
성공!
'Dreamhack > Cryptography' 카테고리의 다른 글
ROT128 (0) | 2023.08.23 |
---|---|
Robot Only (0) | 2023.08.21 |
SingleByteXor (0) | 2023.08.16 |
Basic_Crypto1 (0) | 2023.08.16 |