密码学-->buuctf49~60

本文详细介绍了buUCTF比赛中的多个密码学挑战,包括rsa的爆破、古典密码解密、RSA的共模攻击等,涉及多种加密解密方法和技巧,如猪圈密码、圣堂武士密码、栅栏密码、凯撒密码、维吉尼亚加密等,并提供了部分解密工具和思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

密码学–>buuctf49~60

49.bbbbbbrsa

from base64 import b64encode as b32encode
from gmpy2 import invert,gcd,iroot
from Crypto.Util.number import *
from binascii import a2b_hex,b2a_hex
import random

flag = "******************************"

nbit = 128

p = getPrime(nbit)
q = getPrime(nbit)
n = p*q

print p
print n

phi = (p-1)*(q-1)

e = random.randint(50000,70000)

while True:
	if gcd(e,phi) == 1:
		break;
	else:
		e -= 1;

c = pow(int(b2a_hex(flag),16),e,n)

print b32encode(str(c))[::-1]

# 2373740699529364991763589324200093466206785561836101840381622237225512234632

题目先给了p和n,d但是e是50000到70000之间随机的一个数字,爆破e就行了

from gmpy2 import *
from Crypto.Util.number import *
import base64
p = 177077389675257695042507998165006460849
n = 37421829509887796274897162249367329400988647145613325367337968063341372726061
c = '==gMzYDNzIjMxUTNyIzNzIjMyYTM4MDM0gTMwEjNzgTM2UTN4cjNwIjN2QzM5ADMwIDNyMTO4UzM2cTM5kDN2MTOyUTO5YDM0czM3MjM'
c = int(base64.b64decode(c[::-1]))
q = n //p
phi = (p-1)*(q-1)
for i in range(50000,70001):
    if gcd(i,phi) == 1:
        d = invert(i, phi)
        m = long_to_bytes(pow(c,d,n))
        if b"{" in m and b"}" in m:
            print(m)

注意要先把c逆转再base64解码。题目中也给了c的10进制值。。。。
flag{rs4_1s_s1mpl3!#}
50.古典密码知多少
在这里插入图片描述
先猪圈密码,圣堂武士密码,标准银河字母解码得到:
FGCPFLIRTUASYON
再栅栏解密得到flag
猪圈密码及其变种:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
圣堂武士密码:
在这里插入图片描述
标准银河字母:

在这里插入图片描述

flag{CRYPTOFUN}
51.RSA

from Crypto.Util.number import getPrime,bytes_to_long

flag=open("flag","rb").read()

p=getPrime(1024)
q=getPrime(1024)
assert(e<100000)
n=p*q
m=bytes_to_long(flag)
c=pow(m,e,n)
print c,n
print pow(294,e,n)

p=getPrime(1024)
n=p*q
m=bytes_to_long("BJD"*32)
c=pow(m,e,n)
print c,n

'''
output:
12641635617803746150332232646354596292707861480200207537199141183624438303757120570096741248020236666965755798009656547738616399025300123043766255518596149348930444599820675230046423373053051631932557230849083426859490183732303751744004874183062594856870318614289991675980063548316499486908923209627563871554875612702079100567018698992935818206109087568166097392314105717555482926141030505639571708876213167112187962584484065321545727594135175369233925922507794999607323536976824183162923385005669930403448853465141405846835919842908469787547341752365471892495204307644586161393228776042015534147913888338316244169120  13508774104460209743306714034546704137247627344981133461801953479736017021401725818808462898375994767375627749494839671944543822403059978073813122441407612530658168942987820256786583006947001711749230193542370570950705530167921702835627122401475251039000775017381633900222474727396823708695063136246115652622259769634591309421761269548260984426148824641285010730983215377509255011298737827621611158032976420011662547854515610597955628898073569684158225678333474543920326532893446849808112837476684390030976472053905069855522297850688026960701186543428139843783907624317274796926248829543413464754127208843070331063037
381631268825806469518166370387352035475775677163615730759454343913563615970881967332407709901235637718936184198930226303
<think>好的,我现在需要处理用户关于BUUCTF-USB题目的询问。首先,我得回忆一下这个题目的具体内容。BUUCTF是一个CTF(Capture The Flag)竞赛平台,里面的题目通常涉及各种安全领域的挑战,比如逆向工程、密码学、取证等。USB相关的题目可能涉及到USB流量分析,这在CTF中是比较常见的取证类题型。 首先,用户可能想知道如何解决这个题目,或者需要了解解题的一般步骤。通常,USB流量分析的题目会提供一个抓包文件,比如pcap或者pcapng格式,其中包含USB传输的数据。解题的关键在于提取这些数据,并分析其中可能的键盘输入、鼠标移动或存储设备的数据传输。 接下来,我需要考虑解题的具体步骤。首先,用户可能需要使用Wireshark之类的工具打开提供的流量文件,然后过滤出USB传输的数据包。对于键盘数据,通常关注的是URB_INTERRUPT in类型的传输,因为键盘输入是通过中断传输实现的。数据部分可能包含按键的键码,需要将这些键码转换为实际的字符。 这里需要注意,USB键码到字符的转换可能需要对照USB HID使用表。例如,键码0x04对应a,0x05对应b,依此类推,但可能会有移位或修饰键的影响。此外,有些题目可能会将数据隐藏在鼠标移动的坐标中,或者存储设备的批量传输中,所以需要根据具体情况调整分析方法。 另外,可能需要使用脚本来自动化提取和处理数据。例如,用Python的scapy库读取pcap文件,过滤出有效的数据段,然后进行转换。用户可能需要编写这样的脚本,或者在互联网上查找现有的工具或脚本进行辅助。 可能遇到的挑战包括数据包的过滤是否正确,键码转换是否有误,或者数据是否经过加密或编码。这时候需要仔细检查每一步的输出,确认是否遗漏了某些关键数据包,或者是否需要调整转换逻辑。 此外,BUUCTF的题目可能有不同的变种,所以需要根据具体的题目文件进行调整。比如,有些题目可能使用不同的传输类型,或者数据被分成多个包,需要重新组合。这时候需要仔细分析数据包的结构,查看是否有长度字段或标识符来帮助重组数据。 最后,总结解题思路:分析流量文件,确定数据传输类型,提取有效数据,转换数据格式,最终得到flag。可能需要结合工具和脚本,逐步排除干扰信息,找到关键数据段。</think>BUUCTF中的USB类题目通常涉及USB流量分析,属于取证题型。以下是解题的逐步指南: --- ### **1. 题目背景** - 题目提供一个包含USB设备通信数据的抓包文件(如`.pcap`)。 - 目标:从流量中提取隐藏的Flag,常见于键盘输入、鼠标轨迹或存储设备传输。 --- ### **2. 解题步骤** #### **步骤1:分析流量类型** - 使用 **Wireshark** 打开文件,过滤USB流量: - 键盘输入:`usb.transfer_type == 0x01`(中断传输)且`usb.endpoint_number == 0x81`。 - 鼠标移动:`usb.endpoint_number == 0x81`,数据长度可能为4字节。 - 存储设备:`usb.transfer_type == 0x02`(批量传输)。 #### **步骤2:提取数据** - **键盘输入**:提取`Leftover Capture Data`字段(例如:`2d0000000000`)。 - 键码转换规则: - 第3字节为实际键码(如`0x04`→a,`0x05`→b,参考[HID键码表](https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf))。 - 若存在`0x02`修饰键(Shift),字符需转换大写或符号。 - **鼠标数据**:提取坐标(如`x=bytes[1], y=bytes[2]`),可能用于绘制轨迹。 #### **步骤3:编写脚本自动化处理** - 使用Python示例提取键盘数据: ```python from scapy.all import * packets = rdpcap('usb.pcap') keystrokes = [] for pkt in packets: if pkt.haslayer('USBTransferData'): data = pkt['USBTransferData'].leftover if len(data) >= 8: # 键盘数据通常为8字节 key = data[2:3].hex() if key != '00': keystrokes.append(key) # 转换键码为字符(需对照HID表) ``` #### **步骤4:处理特殊编码** - 若数据经过加密或编码(如Base64、Hex),需进一步解码。 - 示例:提取的字符串`666c61677b...7d`→Hex解码→`flag{...}`。 --- ### **3. 常见技巧** - **数据重组**:若数据分片,需按`URB ID`或包顺序合并。 - **流量筛选**:排除无效数据(如`000000000000`)。 - **工具辅助**:使用`tshark`命令行快速提取字段: ```bash tshark -r usb.pcap -T fields -e usb.capdata | grep -v "000000000000" ``` --- ### **4. 例题参考** - **BUUCTF-USB** 示例解法: 1. 过滤键盘中断流量,提取键码。 2. 发现键码序列:`0x16 0x07 0x08...`。 3. 对照HID表转换,得到`f l a g { ... }`。 --- ### **5. 总结** - 关键点:确定设备类型→过滤有效数据→转换键码/坐标→解码隐藏信息。 - 扩展学习:了解USB协议细节及更多HID设备的数据格式(如游戏手柄)。 遇到具体题目时,需结合流量特征灵活调整分析策略!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值