[HackCTF] Reversing Me
Reversing/Reversing (Wargame)

[HackCTF] Reversing Me

728x90

Source Code

#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값을 변조한 결과를 비교해 모든 조건을 통과했을 때 "정답일세!"가 나오게되는 코드이다.

이 때 가장 주목해야하는 부분은 (enter[i] ^ (i%2)) == serial[i];이다.

  • i%2는 i의 값이 홀수인지 짝수인지에 따라 홀수인 경우 1, 짝수인 경우 0이 된다.
  • ^연산은 XOR연산으로, 배타적논리합이라고도 한다. 배타적 논리합의 경우, 두 번 해주면 원본값이 나온다.

배타적 논리합(XOR)의 특징

이 때, P를 enter값으로, K는 i%2(01010101...)으로 생각하면 P^K = serial 값이 된다. serial ^ K를 하게 되면 P로 enter값이 된다. 따라서, serial값과 i%2를 XOR연산하여 입력해야하는 키를 찾아내도록 한다.

 

#include <stdio.h>



int main(void) {

char *serial = "H`cjCUFzhdy^stcbers^D1_x0t_jn1w^r2vdrre^3o9hndes1o9>}";

for (int i = 0; i < strlen(serial); i++)

printf("%c", serial[i]^(i%2));

return 0;

}

SMALL

'Reversing > Reversing (Wargame)' 카테고리의 다른 글

[CodeEngn] BASIC RCE L03  (0) 2021.05.04
[CodeEngn] BASIC RCE L02  (0) 2021.05.04
[CodeEngn] BASIC RCE L01  (0) 2021.05.04
[HackCTF] Handray  (0) 2021.05.03
[HackCTF] welcome_rev  (0) 2021.05.03