VISA_or_MC - Writeup by AI

张开发
2026/4/16 2:18:35 15 分钟阅读

分享文章

VISA_or_MC - Writeup by AI
VISA_or_MC - Writeup by AI一、题目信息题目来源: Bugku Crypto题目名称: VISA_or_MC题目类型: 密码学/编码转换二、考点分析核心知识点信用卡卡号识别规则VISA 卡以数字 4 开头16 位MasterCard: 以数字 5 开头16 位本题中所有 5 开头的都算 MC二进制编码转换将卡片类型转换为二进制位0/1每 8 位二进制转换为一个 ASCII 字符数据分类与统计考点权重表考点权重说明信用卡卡号规则30%识别 VISA 和 MC 的前缀差异二进制编码40%理解 0/1 序列到文本的转换数据分析能力30%从大量数据中发现规律三、解题思路1. 初步分析题目提供了一个包含 272 个信用卡卡号的文件file.txt题目名称VISA_or_MC暗示需要区分 VISA 卡和 MasterCard。2. 识别规则通过查询信用卡卡号规则VISA: 以 4 开头MasterCard: 以 51-55 开头但本题放宽到所有 5 开头3. 发现规律统计发现VISA 卡4 开头: 136 张MasterCard5 开头: 136 张总计272 张刚好全部可以分类4. 编码转换将卡片类型转换为二进制VISA (4 开头) → 0MasterCard (5 开头) → 1生成 272 位二进制序列每 8 位转换为一个 ASCII 字符得到 34 个字符的 flag。四、详细步骤步骤 1: 读取文件并统计withopen(file.txt,r)asf:linesf.readlines()# 共 272 行卡号步骤 2: 识别卡片类型defidentify_card_type(card):cardcard.replace(-,)# 移除连字符iflen(card)!16:returnUNKNOWNifcard[0]4:returnVISAelifcard[0]5:returnMCelse:returnUNKNOWN步骤 3: 生成二进制序列遍历所有卡号根据类型生成 0/1 序列binary_sequenceforlineinlines:cardline.strip().replace(-,)ifcard[0]4:binary_sequence0# VISAelifcard[0]5:binary_sequence1# MC步骤 4: 二进制解码将 272 位二进制序列转换为 ASCII 文本defbinary_to_text(binary_str):chars[]foriinrange(0,len(binary_str),8):bytebinary_str[i:i8]char_codeint(byte,2)if32char_code126:chars.append(chr(char_code))return.join(chars)步骤 5: 获取 Flag解码结果shellmates{XXX}五、完整代码#!/usr/bin/env python3# -*- coding: utf-8 -*-defidentify_card_type(card_number):识别信用卡类型cardcard_number.replace(-,)iflen(card)!16:returnUNKNOWNifcard[0]4:returnVISAelifcard[0]5:returnMCelse:returnUNKNOWNdefbinary_to_text(binary_str):将二进制字符串转换为文本chars[]foriinrange(0,len(binary_str),8):bytebinary_str[i:i8]iflen(byte)8:char_codeint(byte,2)if32char_code126:chars.append(chr(char_code))return.join(chars)defmain():# 读取文件withopen(file.txt,r)asf:linesf.readlines()print(f总卡数{len(lines)})# 统计visa_count0mc_count0forlineinlines:cardline.strip()ifnotcard:continuecard_typeidentify_card_type(card)ifcard_typeVISA:visa_count1elifcard_typeMC:mc_count1print(fVISA 卡 (4 开头):{visa_count})print(fMasterCard (5 开头):{mc_count})# 生成二进制序列binary_sequenceforlineinlines:cardline.strip().replace(-,)ifcard[0]4:binary_sequence0elifcard[0]5:binary_sequence1print(f二进制序列长度{len(binary_sequence)}bits)# 解码flagbinary_to_text(binary_sequence)print(fFlag:{flag})if__name____main__:main()六、运行结果 CTF 题目VISA_or_MC 总卡数272 VISA 卡 (4 开头): 136 张 MasterCard (5 开头): 136 张 有效卡片总数272 生成二进制序列 规则VISA(4 开头)0, MasterCard(5 开头)1 二进制序列长度272 bits 可转换为字节数34 bytes 解码结果 Flag: shellmates{XXX} 验证 Flag 格式 ✓ Flag 格式正确! 最终答案shellmates{XXX}

更多文章