Write-up/HackCTF
[HackCTF] Reversing_me
새달아
2022. 1. 14. 16:10
우선 문제를 다운받으면 c언어로 된 txt코드가 뜬다.
#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이 제시되어있고, 사용자가 입력할 값인 enter가 나와있다.
가장 처음 if문을 보면 enter의 길이와 serial의 길이가 같아야한다.
- 1대1로 대응되는 문자열로 추측.
- 아무튼 53자를 꽉 채워야 한다.
이후 for문에서는 i가 0부터 1씩 증가하면서 serial의 길이만큼 반복되는데, 그와 더불어
(enter[i] ^ (i % 2)) == serial[i]
이 조건 또한 충족되어야 한다.
- enter[i]를 (i % 2)로 xor연산을 해준 것이 serial[i]와 같아야 한다!
xor연산을 한 결과에 같은 수를 다시 xor연산을 해주면 본래의 값이 나오게 된다.
예를들어, A ^ B = C라는 식이 있을 때, C에다 ^ B를 해주면 다시 A가 나오게 된다는 것이다.
간단히 숫자로 바꾸어 보면...
A = 15(1111)
B = 7(0111)
라고 했을 때, A ^ B 연산을 하면 C = 8(1000)이 된다.
다시 여기에 C ^ B를 하게 되면 1111, 즉 A가 다시 나오게 된다.
이러한 점을 이용하여 양쪽 변에 (i % 2)를 xor 해주게 되면 답이 나오게 된다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
int i;
char serial[54] = "H`cjCUFzhdy^stcbers^D1_x0t_jn1w^r2vdrre^3o9hndes1o9>}";
char enter[54];
for (i = 0; i < 53; i++)
{
enter[i] = serial[i] ^ (i % 2);
}
printf("%s", enter);
return 0;
}
위 코드를 실행시키면...
쨘! 다음과 같이 손쉽게 Flag를 얻어낼 수 있다.