CTFlearn 의 쉰다섯번째 문제
이번엔 Easy난이도의 프로그래밍 문제이다.
이전문제들과 달리 뭔가 설명이 길어서 조금 긴장했다.
내용을 대강 읽어보면 INTERPOL에서 추적하고 있는 신용카드 사기꾼을 붙잡았는데
사기꾼이 가지고 있던 영수증에 찍힌 신용카드 번호의 일부분을 보고
신용카드 전체 번호가 어떻게 되는지 알아내는것이 목표이다.
힌트는 두가지가 주어진다.
1. 신용카드 번호는 123457의 배수이다.
2. 신용카드 번호 는 Luhn 알고리즘으로 검증할 수 있다.
한번 파이썬으로 구현해본다.
cardnum_f = '543210'
cardnum_b = '1234'
for i in range(999999):
cardnum_m = ('00000' + str(i))[-6:]
cardnum = int(cardnum_f + cardnum_m + cardnum_b)
if (cardnum % 123457) == 0:
print(cardnum)
이렇게 한번 써봤다.
신용카드 번호에서 알고있는 부분을 먼저 써주고
가운데 모르는 6자리는 000000부터 999999 까지 만들어서 합친 뒤
123457로 나눠보고, 나머지가 0인 것들만 출력시키는 코드이다.
코드를 실행시키면 신용카드 번호로 의심되는 번호가 8개 나온다.
사실 8개 밖에 안되서 하나씩 넣어보면 금방 정답을 찾을 수 있다.
하지만 Luhn 알고리즘을 언급해줬으니
한번 사용해 본다.
위키피디아에 친절한 예시가 나와있다.
신용카드 각 자리수를 정해진 규칙에 따라 계산해서 모두 더해준 뒤
10 - (sum mod 10)) mod 10) 을 계산해서
그 값이 신용카드 맨 마지막 자리의 숫자와 일치하면 된다.
아래는 또 친절하게 수도코드까지 적어주었다.
이걸 참고해서 간단하게 만들어 본다.
cardnum_f = '543210'
cardnum_b = '1234'
for i in range(999999):
cardnum_m = ('00000' + str(i))[-6:]
cardnum = int(cardnum_f + cardnum_m + cardnum_b)
if (cardnum % 123457) == 0:
tmp = str(cardnum)
parity = int(len(tmp))-1 % 2
sum = 0
for i in range(len(tmp)):
if i % 2 == parity:
sum += int(tmp[i])
elif int(tmp[i]) > 4:
sum += (2 * int(tmp[i])) - 9
else:
sum += (2 * int(tmp[i]))
if (sum % 10) == 0:
print(cardnum)
위키피디아의 수도코드를
파이썬 문법에 맞게 거의 그대로 가져다 썼다.
해당 코드를 실행시키면
8개의 신용카드 번호 후보 중 하나만 나오게 된다.
해당 값이 플래그이다.
'워게임 > CTFlearn' 카테고리의 다른 글
[CTFlearn] Tone dialing - 암호학 / DTMF (80) | 2023.01.16 |
---|---|
[CTFlearn] PIN - 리버싱 / IDA (72) | 2023.01.13 |
[CTFlearn] Simple bof - 포너블 / 버퍼오버플로우 (79) | 2023.01.09 |
[CTFlearn] Image Magic - 프로그래밍 / 포렌식 / PIL (76) | 2023.01.06 |
[CTFlearn] Encryption Master - 암호학 / Base64 (64) | 2023.01.02 |