from base64 import b64decode from itertools import product c = 'mhhnyw1lezviodq1ntkxltmwmditngjlny1hzgi5lwu4m2q1ntcymtblnx0=' table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-{}'
flag = b"" real_data = "" for i in range(0, len(c), 4): pos = [] for char in c[i:i+4]: pos.append([char.lower(), char.upper()]) cases = ["".join(k) for k in product(*pos)] for case in cases: if all(chr(char) in table for char in b64decode(case)): real_data += case flag += b64decode(case) break print(real_data) print(flag.decode())
from Crypto.Util.number import * from string import ascii_letters, digits from random import randint from secret import flag
assert flag.startswith("0xGame{") and flag.endswith("}") table = ascii_letters+digits MOD = len(table)
def affine(x, a, b): return a*x+b
def genKey(): a = [randint(1, 64) for _ in range(3)] b = [randint(1, 64) for _ in range(3)] while GCD(MOD, a[0]*a[1]*a[2]) != 1: a = [randint(1, 64) for _ in range(3)] return a, b
cipher = "" A, B = genKey() for i in flag: if i not in table: cipher += i else: cipher += table[affine(affine(affine(table.find(i),A[0], B[0]), A[1], B[1]), A[2], B[2]) % MOD]
table = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" MOD = len(table) # 62
# 已知的明密文对(前6个字符) plain_text = "0xGame" cipher_text = "t6b7Tn" plain_indices = [table.index(c) for c in plain_text] cipher_indices = [table.index(c) for c in cipher_text]
# 暴力破解 A_total 和 B_total found = False for A in range(1, MOD): if gcd(A, MOD) != 1: # 必须与62互质 continue for B in range(MOD): valid = True for i in range(6): encrypted = (A * plain_indices[i] + B) % MOD if encrypted != cipher_indices[i]: valid = False break if valid: found = True print(f"Found parameters: A_total={A}, B_total={B}") # 计算A_total的模逆 A_inv = pow(A, -1, MOD) # 解密整个密文 flag_chars = [] for char in full_cipher: if char in table: c_index = table.index(char) # 逆变换:p = A_inv * (c - B) mod MOD p_index = (A_inv * (c_index - B)) % MOD flag_chars.append(table[p_index]) else: flag_chars.append(char) flag = "".join(flag_chars) print("Decrypted flag:", flag)
if not found: print("No valid parameters found")
运行得到
最后flag为
1
0xGame{1b292822-33e1-46fe-be82-49ca3a11cce8}
equationSet
下载附件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
from Crypto.Util.number import * from secret import flag
e = 65537 m = bytes_to_long(flag.encode()) p, q, r = getPrime(512), getPrime(512), getPrime(512)
n = p*q*r c = pow(m, e, n) print(c) print(n) print(p+q+r) print(p*q+p*r)
from Crypto.Util.number import long_to_bytes import math
# 已知数据 c = 216719040256186298397028655750064798850021023231838775591251101297937953386321540642008911366410079301738663299175886582174049904795026196300416266896540788022341538256301122208968796109686704772520343054236258796389022513529783422276494540966067852471396816206074211421503474837485494701690098732037602480572789379332310254249433454320435936714104527518624688556709468603940992721211203289431590626844879607202468846406154353494833644211299572986462765136337085 n = 894056034566447301955142597300391580123962451796006680489889450143519689799314285318095469039568599921956768134381823459346832348860916689950158242252303475622211716237139024235824024970750590961940570708153855153193857928904289336079278818981027749293609409415157353473040730164425412538915371548967647539451957985983743912574170521482411003705228431178007985555653030638470361056437181743865661398118081730394253048131772698895385973554074901982345619898803547 s = 29655063393511915966933532346800235654775576930791631676606218430063696650865182051386041602150983593232007167167994217759277108630183882018065820737494389 t = 157435908314881832180551915807491465031852975585204961520048477243905914352236153380025750630661313386951309182682385078397602167079680531363808068256951034309833123469066541560541919868062902433154755910784757010236542324384311320841771330997309437932617770557924786221264121042797084835364061257880278193538 e = 65537
# 1. 求解素数 p D = s**2 - 4*t sqrtD = math.isqrt(D) if sqrtD**2 != D: raise ValueError("判别式不是完全平方数") p = (s + sqrtD) // 2 # 取正根(确保是整数)
# 验证 p 整除 n if n % p != 0: p = (s - sqrtD) // 2 # 尝试负根 if n % p != 0: raise ValueError("未找到正确的素数 p")
# 2. 求解 q 和 r qr_sum = s - p # q + r qr_prod = n // p # q * r
from Crypto.Util.number import * from gmpy2 import next_prime from functools import reduce from secret import flag
def F(x): if x == 1 or x == 2: return 1 return F(x-1)+F(x-2)
n = reduce(lambda a, b: a*b, [getPrime(4) for _ in range(4)]) r = getRandomNBitInteger(67) S = sum([F(i) % n for i in range(r)]) p = next_prime(S**16) q = getPrime(p.bit_length()) m = bytes_to_long(flag) c = pow(m, 65537, p*q)
# r = 6799657976717333 # n = 34969 # c = 182306974283951620352146026941583994848813143690343545292100780435573376889099600153592983212384957591086328477660614034391593564733860826251499298995355977799109267846836211477797049861348446512705981010295182077777939692478140339301301250656211795668782349225298841295102744088295274299888068087536135862146848855194234931032258224223054120694400807261402442809227521150204434199401928373883267697928229945582110688115412960868921538084717338343966490113059627708880297277412143561561837953806960309840302665509500602335832680764801782789278492075478763944213005349707521471401389317139473794212210077629296628421658105048387207038261321205 # N = 1885611999537620305525377668936000019248252379006235038175895811710218489750248037027959751027236326639084060685909621893589756343903429224938045802850975926055076789137326688384533999739909152386986919824268841500802585809839133132715892685629871188263336038221503698167753853207939360629026179572549702198037779413041272313618794196167670066872427987596564652249864272782397242041014605617282098654595635031878004275878165728021995744626212185694275937448739806439006047047376363093018124169182873374456718929377731991273039952515054850718253257895996999907977029169396644305213162133388169761391593110121229266422245167572929912914529689341
from Crypto.Util.number import * from gmpy2 import next_prime
def genFibonacci(): a = [1, 1] for i in range(2, 2**16): a.append(a[i-1] + a[i-2]) return a
def Legrend(a, p): if a == 1: return 1 if p % a == 0: return 0 if a % 2 == 0: return Legrend(a // 2, p) * pow(-1, (pow(p, 2) - 1) // 8) return Legrend(p % a, a) * pow(-1, (a - 1)*(p - 1) // 4)
def isPeriod(T, a): for t in range(T): p = t + T while p < len(a): if a[p] != a[t]: return False p += T return True
def Factor_n(n): a = [] for i in range(2**3, 2**5): if (not isPrime(i)) or (n % i): continue a.append([i, 0]) n //= i while n % i == 0: n //= i a[-1][1] += 1 return a
def Factor_x(x): a = [] for i in range(2, x): if x % i == 0: a.append(i) return a
def solve(a): per = [] for i in range(len(a)): prime = a[i][0] if Legrend(5, prime) == 1: fac = Factor_x(prime - 1) tmp = prime-1 else: fac = Factor_x(2*(prime + 1)) tmp = 2*(prime + 1) fib_mod = [(k % prime) for k in fib] for t in fac: if isPeriod(t, fib_mod): per.append(t*(prime**a[i][1])) break else: per.append(tmp*(prime**a[i][1]))
LCM = per[0] for i in range(1, len(per)): LCM = (per[i] * LCM) // GCD(LCM, per[i]) return LCM
r = 6799657976717333 n = 34969 c = 182306974283951620352146026941583994848813143690343545292100780435573376889099600153592983212384957591086328477660614034391593564733860826251499298995355977799109267846836211477797049861348446512705981010295182077777939692478140339301301250656211795668782349225298841295102744088295274299888068087536135862146848855194234931032258224223054120694400807261402442809227521150204434199401928373883267697928229945582110688115412960868921538084717338343966490113059627708880297277412143561561837953806960309840302665509500602335832680764801782789278492075478763944213005349707521471401389317139473794212210077629296628421658105048387207038261321205 N = 1885611999537620305525377668936000019248252379006235038175895811710218489750248037027959751027236326639084060685909621893589756343903429224938045802850975926055076789137326688384533999739909152386986919824268841500802585809839133132715892685629871188263336038221503698167753853207939360629026179572549702198037779413041272313618794196167670066872427987596564652249864272782397242041014605617282098654595635031878004275878165728021995744626212185694275937448739806439006047047376363093018124169182873374456718929377731991273039952515054850718253257895996999907977029169396644305213162133388169761391593110121229266422245167572929912914529689341
fib = genFibonacci() a = Factor_n(n) T = solve(a)
fib_mod = [(k % n) for k in fib] S = sum(fib_mod[:T]) * (r // T)+sum(fib_mod[:r%T]) p = next_prime(S**16) q = N // p m = pow(c, inverse(65537, (p - 1) * (q - 1)), N) print(long_to_bytes(m))
运行得到
最后flag为
1
0xGame{7d1e20ae-d6c3-4d1d-babf-fa8f8a40c844}
easyRSAC
下载附件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
from Crypto.Util.number import * from secret import flag
m = bytes_to_long(flag.encode()) e = 65537 p, q = getPrime(1024), getPrime(1024) d = inverse(e, (p-1)*(q-1)) x = 11*d+7*(p-1)*(q-1) c = pow(m, e, p*q)
print("n =", p*q) print("c =", c) print("x =", x)
# n = 15321211041844905603734344178124947500324300419514650914959277216026081094496518094622195813971694335738777589926626969243883848477814650916143749322154944235584863085124154540941941026813506509060939499627059712020664731558566028207969260861863294704292014958955493668692256998253634012942569080200336487172402729072437050952572508561453302097971258470685521456512378089846772560530301852104802168974905937732653119166440832834381675710869396094149006807933529429939569477709674581421481769103309376717894952118650888932952440197471338958967318775671821835706884032860123711415773758546392549257375305940969423099611 # c = 14896093236493033914781929755936872928003725648997746598164823180134348743474984136539422027221313199599273430548738399424773586673404519182726589878322104929749149555906399158136445184378100079558203687049497943904275695897824656260657349522646553949766831267321006314984113971129230701131171378457086851261467999754137290017989201512492586108768533159551545321805463224339252886492732021354821330371600069958523522302729848548167244423902572054475396534469987383265867036041513161170273368613864180696427386890714264902686976581317435011139081192227958859641684254938165261747405568369502852705979424383731908971282 # x = 265060901898485540806769085700708185460124724747068797929982044073895401490880169847709049380530156090772787935089173201664711759633269693627724735457902114209008145932150728406880988293457762401679305297063608204632708505031098047582175011825482347052645324085149631658741807382378778694666759557421043250548432429798543553950625554307402164142007388940921309688918410535907564996075660231557340541491155676279511654970843992008027830570227549010293790074386638365293013298327534604995316180405779571245069623638693068707267840181413082202552862853411080755107836252852929279422343700808788459217261282790226013328915
exp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
from Crypto.Util.number import * n = 15321211041844905603734344178124947500324300419514650914959277216026081094496518094622195813971694335738777589926626969243883848477814650916143749322154944235584863085124154540941941026813506509060939499627059712020664731558566028207969260861863294704292014958955493668692256998253634012942569080200336487172402729072437050952572508561453302097971258470685521456512378089846772560530301852104802168974905937732653119166440832834381675710869396094149006807933529429939569477709674581421481769103309376717894952118650888932952440197471338958967318775671821835706884032860123711415773758546392549257375305940969423099611 c = 14896093236493033914781929755936872928003725648997746598164823180134348743474984136539422027221313199599273430548738399424773586673404519182726589878322104929749149555906399158136445184378100079558203687049497943904275695897824656260657349522646553949766831267321006314984113971129230701131171378457086851261467999754137290017989201512492586108768533159551545321805463224339252886492732021354821330371600069958523522302729848548167244423902572054475396534469987383265867036041513161170273368613864180696427386890714264902686976581317435011139081192227958859641684254938165261747405568369502852705979424383731908971282 x = 265060901898485540806769085700708185460124724747068797929982044073895401490880169847709049380530156090772787935089173201664711759633269693627724735457902114209008145932150728406880988293457762401679305297063608204632708505031098047582175011825482347052645324085149631658741807382378778694666759557421043250548432429798543553950625554307402164142007388940921309688918410535907564996075660231557340541491155676279511654970843992008027830570227549010293790074386638365293013298327534604995316180405779571245069623638693068707267840181413082202552862853411080755107836252852929279422343700808788459217261282790226013328915 e = 65537 kphi = x * e - 11 for r in range(e): k = 7 * e + 11 * r if kphi % k: continue phi = kphi // k if len(bin(n - phi + 1)[2:]) > 1025: continue print(long_to_bytes(pow(c, inverse(e, phi), n)))
from pwn import* p = remote('49.232.142.230',16108) p.sendline(str(0x233300000000)) p.interactive()
运行得到
最后flag为
1
flag{50605a49bb7bd35233bb3a3ea4fd8f59}
easy stack
32位程序传参 read原型是 ssize_t read(int fd, void *buf, size_t count); attempts to read up to count bytes from file descriptor fd into the buffer starting at buf. 第一个参数是文件描述符,fd写0,表示标准输入 第二个参数是把数据写入的起始地址 第三个参数是可以写入的数据字节数 我们可以发现read的三个参数在栈最前面依次排列着
# 按值从小到大顺序写入(避免回绕) for i, value in enumerate(sorted(enumerate(values), key=lambda x: x[1])): idx, val = i, value[1] if val < current_count: # 处理回绕(0-255循环) needed = 256 + val - current_count else: needed = val - current_count # 添加格式化字符串部分 if needed > 0: fmt_str += f'%{needed}c' # 添加写入指令(偏移量从11开始) fmt_str += f'%{11+idx}$hhn' current_count = val