본문 바로가기
Reversing/CTF

[HackCTF] Strncmp

by L3m0n S0ju 2021. 9. 12.

 

int __fastcall strcmp_(const char *input, const char *buf)
{
  int v3; // [rsp+14h] [rbp-1Ch]
  int i; // [rsp+18h] [rbp-18h]
  int j; // [rsp+1Ch] [rbp-14h]

  v3 = 0;
  for ( i = 0; i <= 21; ++i )
    v3 = (v3 + 1) ^ 0x17;
  for ( j = 0; j < strlen(input); ++j )
    input[j] ^= key;
  return strncmp(input, buf, 28uLL);
}

 

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char input[32]; // [rsp+20h] [rbp-50h] BYREF
  char buf[40]; // [rsp+40h] [rbp-30h] BYREF
  unsigned __int64 v6; // [rsp+68h] [rbp-8h]

  v6 = __readfsqword(0x28u);
  qmemcpy(buf, "OfdlDSA|3tXb32~X3tX@sX`4tXtz", 28);
  puts("Enter your input:");
  __isoc99_scanf("%s", input);
  if ( !strcmp_(input, buf) )
    puts("Good game");
  else
    puts("Always dig deeper");
  return 0;
}

 

 

 


 

프로그램을 ida로 분석하면 위 코드와 같습니다. 일단은 Good game이라는 조건을 만족하기위해 strcmp 함수를 살펴보면 아래 v3부분에서 v3에 for문을 22번 돌려도 v3은 0 입니다.

 

  v3 = 0;
  for ( i = 0; i <= 21; ++i )
    v3 = (v3 + 1) ^ 0x17;

 

 

 

 

 


 

 for ( j = 0; j < strlen(input); ++j )
    input[j] ^= key;

 

gdb-peda$ x/wx 0x601064
0x601064 <key>: 0x00000000

 

다음으로 key라는 전역변수가 나오는데 gdb로 확인하면 0을 가지고 있기 때문에 아무리 0을 xor 연산을 해도 input[j]는 자기 자신을 가르킵니다. 따라서 아래와 같이 코드에 있는 값을 그대로 입력하면 Good game이란 문구가 출력됩니다. 게임은 이겼지만 플래그를 획득할 수 없습니다. key 값에 비밀이 숨겨져있을거라 추측하고 key 값 관련된 함수를 찾아봐야합니다.

 

 

 

 


search에서 key를 검색하면 key 문자열이 사용된 모든 것들이 출력됩니다. 그중에는 check라는 함수가 눈에 띄는데 key 값을 생성하는 부분이 있습니다. 코드는 아래와 같습니다.

 

 

int __fastcall check(int a1, const char **a2)
{
  int v3; // [rsp+1Ch] [rbp-4h]

  v3 = atoi(a2[1]);
  if ( v3 * (v3 - 14) == -49 )
    key = v3;
  else
    key = 0;
  return main(a1, a2, a2);
}

 

 


  if ( v3 * (v3 - 14) == -49 )
    key = v3;

 

위 코드를 보면 v3이 7일때 조건을 만족하므로 key값을 7로 바꿔서 진행하도록 하겠습니다.

 

 

 for ( j = 0; j < strlen(input); ++j )
    input[j] ^= key;

 

다시 이 부분으로 와서 key를 7이라고 가정하면 input ^ key == OfdlDSA|3tXb32~X3tX@sX`4tXtz 조건을 만족하면 되므로 input = OfdlDSA|3tXb32~X3tX@sX`4tXtz ^ key가 된다. input은 아래 코드로 구할 수 있다.

 

 

 

buf=list("OfdlDSA|3tXb32~X3tX@sX`4tXtz")
input=[]
for i in range (len(buf)):
    input.extend(chr(ord(buf[i])^7))
print(''.join(input))

 

 

 

 


플래그

 

 

 

 

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

[HackCTF] Static  (0) 2021.10.17
[HackCTF] Keygen  (0) 2021.10.09
[HackCTF] Handray  (0) 2021.09.11
[HackCTF] Reversing Me  (0) 2021.09.10
[HackCTF] Welcome_REV  (0) 2021.09.10

댓글