Wargame/HackCTF

[Reversing] Reversing Me

210_ 2019. 11. 21. 23:17

문제설명

이 코드는 입력값을 xor과 %를 이용하여 serial값과 비교한 값들이 모두 같으면 "정답일세!"를 출력하는 코드이다.

#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);
	
}

접근방법

XOR은 다음과 같은 공식이 성립한다.

"A ^ [고정값] = B" 은 "B ^ [고정값] = A"과 같다.

그러므로 다음이 성립하게 된다.

"enter[i] ^ (i % 2) = serial[i]" 은 "serial[i] ^ (i % 2) = enter[i]" 가 같다.

풀이

코드를 조금 수정하여 풀어보았다.

#include <stdio.h>
#include <string.h>

int main() {
	int i;
	char *serial = "H`cjCUFzhdy^stcbers^D1_x0t_jn1w^r2vdrre^3o9hndes1o9>}";
	
	for (i = 0; i < strlen(serial); i++)
	    printf("%c", serial[i] ^ (i % 2));
}

Get Flag!