CTF

[Reversing] Baby_Keylogger

name2965 2022. 7. 9. 23:37
728x90

 

이번 문제는 어디선가 얻은 리버싱 문제입니다.

 

 

주어진 파일은 키로거 프로그램과 플래그파일입니다.

 

먼저 플래그파일을 열어보면

 

 

 

 

플래그가 다음과 같은 형식으로 길게 나열되어있습니다.

 

이제 한번 프로그램을 실행시켜보면

 

 

 

 

다음과 같은 메세지와 함께 프로그램이 실행되지 않습니다.

 

dll 파일이 누락되어서 그런거 같은데 일단 동적분석은 제쳐놓고 

 

exeinfope 로 한번 열어보겠습니다.

 

 

 

 

64비트 기반 실행파일이고 gcc를 통해서 컴파일된 프로그램으로 보입니다.

별다른 패킹은 없으므로 바로 IDA로 분석을 진행해보겠습니다.

 

 

 

 

함수 목록을 쭉 살펴보면 다음과 같이 이름이 잘 나와있습니다.

 

하나하나 확인해보면

 

fake_flag 함수와 encrypt_text 함수를 제외하곤 기본적으로 키로거를 구성하는 함수들이란것을 알수 있습니다.

 

fake_flag 함수는 그냥 별다른 특징이 없는 함수입니다.

분석하기 귀찮게 하기 위해서 일부러 만든 함수로 보입니다.

 

그다음에 encrypt_flag 함수를 보면

 

 

 

굉장히 길다는것을 알수 있습니다.

 

함수를 잘 살펴보다보면

 

 

아까전에 플래그 파일에서 봤었던 플래그값에 계속 있었던 ^.^ 라는 문자열이 반복문을 통해서

계속 append 되고 있다는 사실을 알수 있습니다.

 

그러므로 이 함수가 플래그값을 암호화하는 함수라는것을 알수있습니다.

 

이제 이 함수를 분석해야하는데 

이 프로그램은 C++로 작성되서

IDA로 분석하는데 약간의 어려움이 있으므로

 

최대한 C언어로 거의 비슷하게 프로그래밍해서 표현해보면 다음과 같습니다.

 

 

__int64 encrypt_text(__int64 a1){
    char *v7 = "MIXMIX";
    char *v6 = "Pk*F|Y_%Ov=BTQRc/}#^mbiKrj!p1qyMea0X$d.hA7'6[&lxs5wD4Z({z]8@u?<oVEWNn\\I+L)UfCH9SJ,G3`;\">g-t2:~";
    
    int v2;
    int v3;
    int v1 = strlen(key_input);
    int v13 = v1;
    int v14;
    char *v12 = malloc(4 * v1);
    int j = 0;
    int i;
    int v11 = 0;
    for(i = 0; i < v13; ++i)
    {
    	v2 = v6[key_input[i] - 33];
        v3 = v7[i % 6];
        v12[i] = v3 ^ v2;
    }
    int v10 = 15;
    for(i = 0; i < v13; ++i)
    {
    	v14 = 128;
        for(j = 0;j <= 7; ++j)
        {
            if(v14 == (v14 & v12[i]))
            	strcat(a1, "1");
            else
            	strcat(a1, "0");
            v14 >>= 1;
        }
        strcat(a1, "^.^");
    }
    printf("%s\n",al);
    free(v12);
    return al;
}

 

일단 C언어로 최대한 비슷하게 구현해봤습니다.

 

기본적으로 키보드로 입력된 값을 암호화 시키는 함수인데

분석해보면

 

처음에는 키보드로 입력한 만큼 반복문을 돌리는데

짧은 문자열과 긴 문자열에서 특정 연산을 통해 얻은 자릿값을 통해서 가져올 문자 하나씩을 선택한뒤

두 문자를 xor 연산해서 동적할당한 배열에 요소로 하나씩 저장합니다.

 

그뒤에 갑자기 변수에 15라는 값을 할당한뒤

이중 반복문을 통해서 xor연산된 암호화값을 이진수로 바꾸고 ^.^ 라는 문자열로 이어주는 작업을 합니다.

그리고나서 이 문자열을 출력하고나서 문자열을 반환합니다.

 

 

일단 플래그는 주어졌으므로 이 플래그를 어떻게 원래 플래그로 복호화할수 있을지 생각해보면

 

^.^ 를 제외한 나머지 모든 값들을 가져와서 10진수로 변환한뒤 역연산을 진행해서

원래 입력됐었던 문자열을 얻어내야합니다.

 

그러므로 파이썬을 통해서 복호화 코드를 작성해보면 다음과 같습니다.

 

 

v6 = "Pk*F|Y_%Ov=BTQRc/}#^mbiKrj!p1qyMea0X$d.hA7'6[&lxs5wD4Z({z]8@u?<oVEWNn\\I+L)UfCH9SJ,G3`;\">g-t2:~"
v7 = "MIXMIX"
a = []


flag_enc = ["01100110","00001110",
"00001011","00011011","00011110","00110110","00111001","00101000","00010101","00001000",
"00101110","01100100","01101010","00110100","00111111","01100010","01110000","00111011",
"00100001","00000000","00010001","01101110","01100101","00001000","00011101","01110011"]


for i in range(0, len(flag_enc)):
    a.append(int(flag_enc[i], 2))

for i in range(0, len(a)):
	print(chr(v6.index(chr((a[i] ^ ord(v7[i%6]))))+33), end="")

 

 

다음과 같이 최종 복호화 코드가 나왔습니다.

 

이 코드를 실행시키면 다음과 같이 플래그가 성공적으로 복호화가 된것을 확인할수 있습니다.

 

 

 

728x90

'CTF' 카테고리의 다른 글

2023 TAMUctf write-up  (0) 2023.05.15
[2023 root access CTF] write-up  (3) 2023.05.02
[2023 FooBar CTF] Write-up  (0) 2023.03.14
2022 Hacking Land CTF write-up  (0) 2022.08.01
[Forensic] Baby_RSA writeup  (0) 2022.05.11