HackCTF reversing에서 두 번째 문제는 Reversing Me이다.
문제를 처음 보게 되면 코드가 주어져 있다. 이 코드를 해석해 문제를 풀어야 하는 것 같다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#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);
}
|
우리가 주목해서 봐야 할 부분은 for 문이다.
입력받은 enter 문자열에서 각 배열 인덱스 값을 2로 나눈 나머지(0 또는 1)와 XOR 연산해 serial 배열과 비교하는 것을 볼 수 있다. XOR 연산은 배타적 특성을 가지기 때문에 이를 통해 flag를 유추할 수 있다. 따라서 serial 값을 알아내 우리가 원하는 flag를 출력하는 코드를 작성해 보자.
1
2
3
4
5
6
7
8
9
|
#include <stdio.h>
#include <string.h>
void main() {
char* serial = "H`cjCUFzhdy^stcbers^D1_x0t_jn1w^r2vdrre^3o9hndes1o9>}";
printf("Flag is ");
for (int i = 0; i < strlen(serial); i++)
printf("%c", serial[i] ^ (i % 2));
}
|
이 코드를 통해 플래그를 알아낼 수 있고, 인증하면 된다.
[HackCTF-Reversing#6] static - 250 points (0) | 2021.01.06 |
---|---|
[HackCTF-Reversing#5] keygen - 200 points (0) | 2021.01.06 |
[HackCTF-Reversing#4] Strncmp - 150 points (0) | 2021.01.05 |
[HackCTF-Reversing#3] Handray - 100 points (0) | 2021.01.03 |
[HackCTF-Reversing#1] Welcome_REV - 50 points (0) | 2021.01.01 |
댓글 영역