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