리버싱 7차시

k4bunny·2025년 6월 21일

Layer7

목록 보기
10/13

과제

Custom 2

문제 파일을 디컴파일 해보면

코드가 함수하나 없이 깔끔한 편이여서 간단하게 풀 수 있었다.
먼저 중요한 변수들은 살펴보면,
v4 라는 정수형 변수에 76을 대입하고
vars0 이라는 80 크기의 문자열을 선언한다.
v3라는 변수는 추후 반복문에서 i 처럼 사용되는 것 같다.
s 라는 264 크기의 문자열을 선언하는데 이 변수는 추후에 문자열을 받기 위한
변수이기 때문에 신경쓰지 않겠다.
가장 중요한 key 변수 enc2_0 을 살펴보겠다.

enc2_0 은 64 크기로 지정된 배열이다.
이 코드에서 암호화를 진행할 때 이 배열을 토대로 진행한다.

변수를 확인했으니 암호화를 진행하는 부분을 확인해보면

쉽게 설명해보면 vars0[i]에 v4 - i * i 를 대입하고,
v4를 enc2_0[i]로 값을 변환 시킨다.

플래그는 enc2_0 배열을 그대로 가져와 해당 암호화 코드를 시키면 찾아낼 수 있다.

#include <stdio.h>

int main() {
    int v3 = 0;
    int v4 = 76;
    char vars0[80];
    unsigned enc2_0[64] = {
        0x4C, 0x62, 0x7D, 0x6E, 0x82, 0x50, 0x9F, 0x87, 0x72, 0xBD, 0xD9,
        0xD3, 0xD7, 0xE2, 0xF7, 0x2A, 0x48, 0x6F, 0xB0, 0xC2, 0xE8,
        0x0B, 0x5E, 0x5A, 0x87, 0xB7, 0x1E, 0x22, 0x58, 0x9B, 0xF3,
        0x1B, 0x53, 0x83, 0xFB, 0x2B, 0x57, 0x9F, 0x19, 0x4B, 0x93, 0xD3,
        0x5E, 0x9D, 0xD7, 0x2F, 0xBD, 0x05, 0x48, 0xAE, 0x2B, 0x8B, 0xD7,
        0x4F, 0xCC, 0x35, 0xAD, 0x1D, 0x99, 0xE3, 0x87, 0xC6, 0x41,
        0xFE
    };

    unsigned char * byte = (unsigned char *) vars0;

    while ( 1 ) {
        byte[v3] = v4 - v3 * v3;
        if ( ++v3 == 64 )
            break;
        v4 = enc2_0[v3];
    }
  
    byte[64] = 0;

    for (int i = 0; i < 64; i++) {
        printf("%c", byte[i]);
    }
}

Custom 3

문제 파일을 디컴파일 해보면

변수 s에 최대 152 크기에 문자열을 입력받는다.

그리고 이 값들이 s1에 저장된다.

코드를 계속 읽어보면 funcs_1E5B라는 함수 배열이 존재하는데

(입력받은 문자열의 길이 % 11) 번째 함수를 실행한다.
모든 함수는 구성이 비슷하다.

이렇게 생긴 구조에서 반복적으로 함수를 호출한다.
이 중 sub_1397 이라는 함수에 들어가게 되면 두 개의 함수가 뜨는데
그 곳에서 sub_12C6에 들어가면 키 값으로 XOR 연산을 하는 것을 발견할 수 있다.

키 값인 byte_2010에 저장된 값들을 확인해보면

이 값들을 s에 값에 115자리까지만 XOR 해주면 플래그가 출력될 것이다.

#include <stdio.h>
>
int main() {
    unsigned char byte_2010[16] = {
        0x10, 0x1F, 0x2E, 0x3D, 0x4C, 0x5B, 0x6A, 0x79,
        0x88, 0x97, 0xA6, 0xB5, 0xC4, 0xD3, 0xE2, 0xF1
    };
>
    unsigned char s1[116] = {
        0x5C, 0x7E, 0x57, 0x58, 0x3E, 0x6C, 0x11, 0x2F,
        0xCF, 0xFF, 0xD6, 0xD6, 0xBD, 0x91, 0x96, 0xA8,
        0x48, 0x74, 0x49, 0x64, 0x21, 0x0E, 0x0D, 0x1D,
        0xCF, 0xFF, 0xCA, 0xFC, 0x83, 0xE6, 0x92, 0xAB,
        0x22, 0x77, 0x1E, 0x74, 0x04, 0x09, 0x05, 0x20,
        0xD0, 0xC6, 0xC1, 0xD7, 0x9C, 0xB8, 0x85, 0xAB,
        0x58, 0x55, 0x42, 0x64, 0x1B, 0x6A, 0x10, 0x30,
        0xCF, 0xA6, 0xD6, 0xEF, 0xF6, 0xBB, 0xD2, 0xB8,
        0x57, 0x67, 0x42, 0x59, 0x0F, 0x19, 0x1E, 0x23,
        0xDB, 0xD5, 0xD4, 0xD7, 0xA9, 0xEA, 0xD1, 0xB2,
        0x7B, 0x59, 0x5D, 0x5F, 0x0F, 0x19, 0x5A, 0x18,
        0xCF, 0xC2, 0xC1, 0xD6, 0xF7, 0x81, 0x8A, 0x92,
        0x7E, 0x52, 0x49, 0x64, 0x14, 0x19, 0x1D, 0x1A,
        0xE5, 0xAE, 0xCE, 0xEC, 0xF6, 0xB4, 0x85, 0x94,
        0x47, 0x26, 0x1F, 0x40
    };
>
    for (int i = 0; i < 116; i++) {
        s1[i] ^= byte_2010[i % 16];
    }
>
    for (int i = 0; i < 116; i++) {
        printf("%c", s1[i]);
    }
>
    return 0;
}
profile
배고파요 ..

0개의 댓글