본문 바로가기

CTF

[UTCTF 2024-misc] CCV

<문제>

 

<풀이>

문제 이름인 CCV는 Card Code Verification의 약자인 것 같다.

맞다면 이 문제는 신용카드의 유효성을 검증하는 문제일 것이다.

Ubuntu 22.04 환경에서 문제에서 주어진대로 nc를 실행하여 서버에 접속해보았다.

PAN, 날짜(MMYY), CSC, CVV를 출력해준다.

해당 신용카드 정보가 유효하면 1을 입력하고 유효하지 않으면 0을 입력하면 된다.

그리고 내가 어떤 값을 입력했는지 스스로 기억하고 있어야 한다.

 

우선 아무렇게 0과 1을 입력해서 어떻게 결과를 확인해봤다.

여러 번 돌려봤고 위와 같이 결과가 나왔다.

 

 

이제 정말 본격적으로 접근해본다.

우선 생소한 용어인 PAN, CSC, CVV을 검색해봤다.

 

PAN은 Primary Account Number의 약자로, 신용카드 앞면에 있는 14~19자리 숫자들이 이에 해당한다.

PAN에 대해서 알아보다가 Luhns' Algorithm이라는 것을 알게 되었는데,

신용카드 번호가 Luhn's Algorithm을 만족하면 유효한 번호라고 한다.

PAN: https://www.investopedia.com/terms/p/primary-account-number-pan.asp

룬알고리즘: https://dh-0501.tistory.com/224

룬알고리즘 코드: https://ko.wikipedia.org/wiki/%EB%A3%AC_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98

 

CSC는 Card Security Code의 약자로, 신용카드 뒷면에 각인되어있는 3~4자리 숫자가 이에 해당한다.

CVV는 Card Verification Value의 약자라는데, 설명을 읽어보면 CSC랑 같은 걸 의미하는 것 같다...

카드 보안 코드: https://w.wiki/9cTn

카드 보안 코드를 AMEX에서는 CSC, VISA에서는 CVV라고 부른다고 한다.

그런데 왜 둘 다 출력해주지..?

 

일단 CSC와 CVV는 잘 모르겠어서 PAN을 입력해서 Luhns' Algorithm을 돌려보기로 했다.

코드는 위키피디아에서 제공하는 checkLuhn함수를 활용해서 아래와 같이 짰다.

#include <stdio.h>
#include <stdlib.h>  // atoi
#include <string.h>  // strlen
#include <stdbool.h> // bool

bool checkLuhn(const char *pPurported)
{
    int nSum = 0;
    int nDigits = strlen(pPurported);
    int nParity = (nDigits - 1) % 2;
    char cDigit[2] = "\0";
    for (int i = nDigits; i > 0; i--)
    {
        cDigit[0] = pPurported[i - 1];
        int nDigit = atoi(cDigit);

        if (nParity == i % 2)
            nDigit = nDigit * 2;

        nSum += nDigit / 10;
        nSum += nDigit % 10;
    }
    return 0 == nSum % 10;
}

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        printf("Usage: ./luhns_algorithm [PAN]\n");
        return 1;
    }

    const char *pan = argv[1];
    bool check = checkLuhn(pan);
    printf("result: %d\n", check);

    return 0;
}

파일명은 luhns_algorithm.c로 하고 리눅스 터미널에서 gcc를 이용해 컴파일했다.

gcc -o luhns_algorithm luhns_algorithm.c

 

다시 nc를 실행하고 출력되는 PAN 값을

./luhns_algorithm [PAN값]

형식으로 입력해서 출력되는 결과대로 nc에 입력해보았다.

 

<1차 시도>

 

<2차 시도>

 

<3차 시도>

 

3차시도는 꽤 오래 이어졌는데 결국 실패했다.

지금보니 날짜가 59년 94월이다...

 

이후로도 여러번 시도해보았는데 3차시도보다 오래가지 못했다.

PAN과 date는 검증한 것 같은데 CSC랑 CVV는 검증을 못해서 그런 것 같다.

 

이번 문제풀이는 여기까지...