import pikalang code="""pi pi pi pi pi pi pi pi pi pi pika pipi pi pipi pi pi pi pipi pi pi pi pi pi pi pi pipi pi pi pi pi pi pi pi pi pi pi pichu pichu pichu pichu ka chu pipi pipi pipi pipi ka pikachu pi pi pi pi pi pikachu pi pikachu pi pi pi pi pi pi pi pi pi pi pi pi pi pikachu ka ka ka ka ka ka ka ka ka ka ka ka ka ka ka ka ka pikachu pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pikachu ka ka ka ka ka ka ka ka ka ka ka ka ka ka ka ka ka ka ka ka ka ka ka pikachu pichu pichu pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pikachu pipi pipi ka ka ka ka ka pikachu pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pikachu pichu pichu pikachu pipi pipi ka ka ka ka pikachu ka ka ka ka ka ka ka ka ka ka ka ka ka ka ka ka ka ka ka ka ka ka pikachu pi pi pi pi pi pi pi pi pi pi pi pi pi pikachu pichu pichu pi pikachu pipi pipi ka pikachu ka ka ka ka ka ka pikachu ka ka ka ka ka ka pikachu pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pikachu ka ka ka ka ka ka ka pikachu pi pi pikachu pichu ka ka ka ka ka pikachu pipi ka ka ka ka ka ka ka ka pikachu pi pi pi pi pi pikachu pi pi pi pi pi pi pi pi pi pi pi pi pi pikachu pi pi pi pi pi pi pi pi pikachu""" print(pikalang.evaluate(code))
# 将密文字符用custom_key的索引映射为标准Base32字符 translated = "" for c in ciphertext: if c in custom_key: index = custom_key.index(c) translated += standard_base32[index] else: translated += c # 保留=等符号
p = 369944419156711147060143317175368453031918731002211 m = 15977898348258634512826613220527141251832530996721392570130087971041029999399 output = 2585445282868005908429000279352060638616081153750867519015673856624926072491
num = 0x11451441541112138 # 计算 (p^(num+1) - 1) / (p-1) mod m numerator_mod = (p - 1) * m pow_p = pow(p, num + 1, numerator_mod) x = (pow_p - 1) // (p - 1) # 使用整数除法
flagnum = output ^ x print(long_to_bytes(flagnum)) #b'chive{D0NOT_1gN0e_Spac1}'
3 通往密码学的门票
没啥好说的,而且都给了,就是aes我怎么cyberchef跑不出来
1 2 3 4 5 6 7 8 9 10 11 12 13
from Crypto.Cipher import AES import base64
cipher_b64 = "1HNbfgdgCb//dpGk12YtczYGLYmjdR7s9dCKJJfrr98=" key = b"chiveneed crypto" iv = b"1234567890123456"
from Crypto.Util.number import * from gmpy2 import* c = 14271757452507943071363474081183177541200790942660097362031513886851813587528134582572623848099972456210228075056689703678634430590797149277427115279824926442186977544324306260773649073825258375503308259966047878145831154583554477788481105294302042561339920635706483442941551205973477969173915718871915200671444481285822722729938647546992523692395422404360203948065134128667282828088223097039984276000238274553470626265301814171381825551273451184740276394592917354674905944151497783585449290941573824525838704634409122052101666001004692525883972813532885183994544943464894545185023638492085950625538360026448964484416 d = 4815495065667066088118714476427058753990743828259006517928935325112968696840430371714130163853991651023479500210542005249756415206638902683029392973565078922631633962903160240083183872850081940759280556038034304922411271717701758840032637415957285506384476648687723125050863954698306566523238177577903137128985048379343833790147660878587100123568156527088537427057806920417679112122772952688286636103079120623812415745406014703247604608247491265604106814516290321498329310376520189943315843444275641215377323721032913694774148750077107667520354091976538955228826389103068822347784629987748995327732324026601673620853 e = 65537 p_bits=1024 q_bits=1024
k_phi = e*d -1 pphi = [] for k in range(e,2,-1): if k_phi % k == 0: tmp = k_phi // k if int(tmp).bit_length()==p_bits+q_bits: pphi.append(tmp) print(len(pphi)) #print(pphi) for k in pphi: pp=iroot(k,2)[0] pp=next_prime(pp) for i in range(100): flag=long_to_bytes(pow(c,invert(e,pp-1),pp)) print(flag) exit() pp=next_prime(pp) #b'chive{oH_11zy_p30b1eM_Fo3_Y0u!!}'
n =130823032626799224452148019344025608061409017976462166774679992766799718357920535935980876983571254896758319726956843139212788830476913001454998545653825290696492436161214853422265879037380706290530688595244797045788241743825760099936978094114772320832692543301259855843184737423582796490936667390065449150307 c =122953105834407050979933718031703750977998186903112777777073310509698093824373690792414682116583433136436812038369540800496491082382988156675797619093789603345734749277859167497030683286993302244087972139598554357992507029495039234588959439402736613308786156913068269204559388322577936927056254222544856583113 e = 0x3
def exp(n, e, c): k = 0 while 1: m1 = k * n + c m, t = gmpy2.iroot(m1, e) if t: print(m) print(k) print(libnum.n2s(int(m))) break k += 1 exp(n, e, c) #3562371680658530203399822296834436195305530479644786679754750303845462026492117621601616961933793938207332 #345567965 #b'chive{pADddin6_1s_fUN_R1gHt}this_is_not_hard'
最后一战
显然没有很常规,这里的m3与n3-1不互素,就从网上找,这里的m相当于e比较大,找到一个类似的脚本,模素数上开 m 次幂根
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
from Crypto.Util.number import * q = 165338063123514818523885615737501133739 p = 20297342154853718314952219089481624063 e = 65536 n = q*p c = 3024714280730674139248049746725214418740416860076557280072680498394712377473
for mp in Zmod(p)(c).nth_root(e, all=True): for mq in Zmod(q)(c).nth_root(e, all=True): m = crt([ZZ(mp), ZZ(mq)], [p, q]) try: flag = long_to_bytes(m) if flag.startswith(b'flag'): print(flag) print(mp) print(mq) except: pass
from pwn import * import re from time import sleep
# 连接远程服务 io = remote('chive.vaa.la', 33311) def interactive_after_clean(timeout: int = 0.05, no_show: bool = True): received = io.clean(timeout) if not no_show: print(f"[$]received:\n{received}") io.interactive()
# 定义接收选择题的函数 def recv_until_choice(): while True: try: line = io.recvline(timeout=5).decode().strip() print(f"[接收到内容]: {line}") if any(opt in line for opt in ['1.', '2.', '3.', '4.']): break except EOFError: print("[!] 远程服务断开连接!") io.interactive() break except Exception as e: print(f"[⚠️ 错误] 接收超时或其他错误: {e}") break
# 等待"接下来我会给你 50 道算数题" while True: try: line = io.recvline(timeout=5).decode().strip() print(f"[接收到内容]: {line}") if "接下来我会给你 50 道算数题" in line: break except EOFError: print("[!] 远程服务断开连接!") io.interactive() break except Exception as e: print(f"[⚠️ 错误] 接收超时或其他错误: {e}") break
# 开始答题 for i in range(50): try: # 接收并处理每道算数题 line = io.recvuntil('=').decode().strip() print(f"[题目{i+1}] {line}")
# 使用正则匹配加法、减法、乘法、除法 match = re.search(r'(\d+)\s*([+\-*/])\s*(\d+)', line) if match: a, op, b = match.groups() a, b = int(a), int(b)
# 根据操作符进行运算 if op == '+': answer = a + b elif op == '-': answer = a - b elif op == '*': answer = a * b elif op == '/': answer = a / b # 这里只做了浮点运算,若需要整除可以调整