본문 바로가기
Reversing/CTF

[HackCTF] Keygen

by L3m0n S0ju 2021. 10. 9.

 

 

 

 

 

_BYTE *__fastcall encoding(const char *a1)
{
  unsigned __int8 v2; // [rsp+1Fh] [rbp-11h]
  int i; // [rsp+20h] [rbp-10h]
  int v4; // [rsp+24h] [rbp-Ch]
  _BYTE *v5; // [rsp+28h] [rbp-8h]

  v5 = malloc(0x40uLL);
  v4 = strlen(a1);
  v2 = 72;
  for ( i = 0; i < v4; ++i )
  {
    v5[i] = ((a1[i] + 12) * v2 + 17) % 70 + 48;
    v2 = v5[i];
  }
  return v5;
}

 

 

 

 


위 코드는 이번 문제의 핵심 코드이다. 위 함수의 결과가 "OO]oUU2U<sU2UsUsK"이면 플래그를 출력한다. 경우의수가 많지 않으므로 브루트포스 공격으로 입력값을 알아내겠다. 코드는 아래와 같다.

 

 

 

key="OO]oUU2U<sU2UsUsK"
result=""
k=72
for i in range (len(key)):
    for j in range (33,127):
        if(((j+12)*k+17)%70+48==ord(key[i])):
            result+=chr(j)
            k=ord(key[i])
            break
print(result)

 

 

 

결과 -> A,d<&$+$''.+$&.&&


하지만 위 결과를 입력하면 플래그가 출력되지않는다. 그 이유는 fgets로 입력값을 받기 때문에 \n까지 문자열에 포함되므로 A,d<&$+$''.+$&.&&를 입력하면 A,d<&$+$''.+$&.&&\n 이런식으로 뒤에 개행문자가 추가되서 strcmp로 비교하면 다르다고 판단하게 된다. 따라서 어쩔 수 없이 &를 하나 지우는데 \n은 아스키 코드로 10으로 위 함수에 적용하면 K를 출력하게된다. 따라서 개행문자 포함 "A,d<&$+$''.+$&.&\n"dl 입력되면 함수는 "OO]oUU2U<sU2UsUsK"를 반환한다.

 

 

 

 

 

플래그

 

'Reversing > CTF' 카테고리의 다른 글

[HackCTF] Static  (0) 2021.10.17
[HackCTF] Strncmp  (0) 2021.09.12
[HackCTF] Handray  (0) 2021.09.11
[HackCTF] Reversing Me  (0) 2021.09.10
[HackCTF] Welcome_REV  (0) 2021.09.10

댓글