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 |
댓글