이번 문제의 경우 C source code가 제공된 문제였습니다. main()
함수 하나로 구성된 문제였으며 내용은 다음과 같습니다.
#include <stdio.h>
#include <string.h>
int main() {
int i;
char *serial = "H`cjCUFzhdy^stcbers^D1_x0t_jn1w^r2vdrre^3o9hndes1o9>}";
char enter[54];
printf("키를 입력하시게 : ");
scanf("%s", enter);
if (strlen(enter) == strlen(serial)) {
for (i = 0; i < strlen(serial) && (enter[i] ^ (i % 2)) == serial[i]; i++);
if (i - 1 == strlen(enter))
printf("정답일세!\n");
}
else
printf("그건 아닐세...\n");
exit(0);
}
serial 변수에 저장된 값이 flag와 관련된 값으로 보였으며 입력값과 비교하여 그에 따른 동작을 수행하는 것으로 파악되었습니다.
code를 분석하던 중 for()
구문에서 특이한 점을 확인할 수 있었습니다. 조건으로 제시된 부분에 (enter[i] ^ (i % 2)) == serial[i]
내용이 존재하였는데 이를 통해 일치 여부를 판단하였습니다.
해당 내용을 더 분석해보면 입력값과 i % 2
결과를 XOR한 값을 serial과 비교하는 내용이었는데 이를 통해 XOR 암호화 방식임을 알 수 있었습니다.
XOR 암호화
의 경우 아래 공식에 따른 역연산이 가능합니다.
A ^ B = C
에서 임의의 값 B는A ^ C = B
를 만족한다.
이 문제의 경우 B를 flag 값이라고 가정하였을 때 A에 i % 2
를, C에 serial 값을 대입하여 문제를 풀이할 수 있습니다. 간단한 스크립트인 만큼 C 언어를 이용하여 exploit을 진행하였습니다.
#include <stdio.h>
#include <string.h>
int main(){
int i;
char *serial = "H`cjCUFzhdy^stcbers^D1_x0t_jn1w^r2vdrre^3o9hndes1o9>}";
char answer[54];
for(i = 0; i < strlen(serial); i++){
answer[i] = serial[i] ^ (i % 2);
}
printf("Flag: %s\n", answer);
return 0;
}