문제에서 주어진 파일을 cmd에서 실행하면 위와 같이 암호화된 문자열이 출력된다.
IDA에 파일을 로드하고 Funtions window에서 main 함수를 찾으면 아래와 같이 디컴파일된 코드를 볼 수 있습니다.
저도 go 언어는 처음보지만 함수 형태를 보면 의미를 쉽게 유추할 수 있습니다. 아래 코드를 보면 v4는 플래그 길이를 나타내고 byte_4C5F5에서 데이터를 가져와서 20과 xor을 하면 플래그가 출력되지 않을까 유추할 수 있습니다. 아무래도 처음보는 언어이기 때문에 정확한 분석보다는 감으로 찾아야하는 부분이 있습니다. byte_4C5F5와 20을 xor 하면 cmd 에서 파일을 실행할때 출력되는 P]Y]oS{KS$KS[Ks{Ks$Ks[Kf'bqfg}zs5i가 되지 않을까 생각됩니다. 마침 길이도 34이므로 유력합니다.
while ( v4 < 34 )
{
v15 = v4;
v14 = v5;
v16 = v6;
*((_QWORD *)&v10 + 1) = byte_4C50F5[v4] ^ 20LL;
*(_QWORD *)&v10 = 0LL;
runtime_intstring(v0, v1, byte_4C50F5[v4] ^ 20, (unsigned int)byte_4C50F5, v2, v3, v10);
runtime_concatstring2(v0, v1, v7, DWORD2(v11), v8, v9, 0, v16, v14, v11, *((__int64 *)&v11 + 1));
v4 = v15 + 1;
v6 = v12;
v5 = v13;
}
byte_4C5F5 ^ 20 = P]Y]oS{KS$KS[Ks{Ks$Ks[Kf'bqfg}zs5i 에서 양쪽에 xor 20을 한번 더 연산을 해주면 byte_4C5F5 = P]Y]oS{KS$KS[Ks{Ks$Ks[Kf'bqfg}zs5i ^ 20 이 됩니다. byte_4C5F5를 파이썬으로 구현해보면 아래 코드와 같습니다.
buf="P]Y]oS{KS$KS[Ks{Ks$Ks[Kf'bqfg}zs5i"
buf2=[]
for i in range(34):
buf2.append(ord(buf[i])^20)
print(chr(buf2[i]),end='')
결과는 아래와 같이 플래그가 출력됩니다.
사실 위처럼 연산없이 byte_4C5F5 위치로 가면 플래그가 평문으로 출력됩니다.
'Reversing > CTF' 카테고리의 다른 글
[HackCTF] Keygen (0) | 2021.10.09 |
---|---|
[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 |
댓글