HackCTF Reversing Me Write-Up

juuun0·2022년 1월 26일
1
post-thumbnail

Analyze Target

이번 문제의 경우 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 암호화 방식임을 알 수 있었습니다.


Exploit

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;
}
profile
To be

0개의 댓글