import base64 a=b'VlxRV2t0II8kX2WPJ15fZ49nWFEnj3V8do8hYy9t' b=base64.b64decode(a) flag="" for i in b: flag+=chr((i-16)^0x20) print(flag) #flag{D0_4ou_7now_wha7_ELF_1s?}
Segments
shift_f7,即可看到flag。
Endian
ida打开,发现array数组的值和0x12345678做异或。
脚本:
import binascii a=[0x75553A1E, 0x7B583A03, 0x4D58220C, 0x7B50383D, 0x736B3819] flag=b"" for i in a: hex_string=str(hex(i^0x12345678))[2:].encode() #print(hex_string) flag+=binascii.unhexlify(hex_string)[::-1] print(flag) #b'flag{llittl_Endian_a'
from Crypto.Util.number import * from flag import flag
defgen_prime(n): res = 1
for i inrange(15): res *= getPrime(n)
return res
if __name__ == '__main__': n = gen_prime(32) e = 65537 m = bytes_to_long(flag) c = pow(m,e,n) print(n) print(c) # 17290066070594979571009663381214201320459569851358502368651245514213538229969915658064992558167323586895088933922835353804055772638980251328261 # 14322038433761655404678393568158537849783589481463521075694802654611048898878605144663750410655734675423328256213114422929994037240752995363595
n=17290066070594979571009663381214201320459569851358502368651245514213538229969915658064992558167323586895088933922835353804055772638980251328261 e = 65537 phi=(P1-1)*(P2-1)*(P3-1)*(P4-1)*(P5-1)*(P6-1)*(P7-1)*(P8-1)*(P9-1)*(P10-1)*(P11-1)*(P12-1)*(P13-1)*(P14-1)*(P15-1)
d = gmpy2.invert(e, phi) m = pow(c, d, n) flag = long_to_bytes(m) print(flag) #b'flag{us4_s1ge_t0_cal_phI}'
Small d
超大的e,低解密指数攻击。
源码
from secret import flag from Crypto.Util.number import *
p = getPrime(1024) q = getPrime(1024)
d = getPrime(32) e = inverse(d, (p-1)*(q-1)) n = p*q m = bytes_to_long(flag)
c = pow(m,e,n)
print(c) print(e) print(n)
# c = 6755916696778185952300108824880341673727005249517850628424982499865744864158808968764135637141068930913626093598728925195859592078242679206690525678584698906782028671968557701271591419982370839581872779561897896707128815668722609285484978303216863236997021197576337940204757331749701872808443246927772977500576853559531421931943600185923610329322219591977644573509755483679059951426686170296018798771243136530651597181988040668586240449099412301454312937065604961224359235038190145852108473520413909014198600434679037524165523422401364208450631557380207996597981309168360160658308982745545442756884931141501387954248 # e = 8614531087131806536072176126608505396485998912193090420094510792595101158240453985055053653848556325011409922394711124558383619830290017950912353027270400567568622816245822324422993074690183971093882640779808546479195604743230137113293752897968332220989640710311998150108315298333817030634179487075421403617790823560886688860928133117536724977888683732478708628314857313700596522339509581915323452695136877802816003353853220986492007970183551041303875958750496892867954477510966708935358534322867404860267180294538231734184176727805289746004999969923736528783436876728104351783351879340959568183101515294393048651825 # n = 19873634983456087520110552277450497529248494581902299327237268030756398057752510103012336452522030173329321726779935832106030157682672262548076895370443461558851584951681093787821035488952691034250115440441807557595256984719995983158595843451037546929918777883675020571945533922321514120075488490479009468943286990002735169371404973284096869826357659027627815888558391520276866122370551115223282637855894202170474955274129276356625364663165723431215981184996513023372433862053624792195361271141451880123090158644095287045862204954829998614717677163841391272754122687961264723993880239407106030370047794145123292991433
(python2的脚本)
# -*- coding: cp936 -*- import gmpy2 import time
# 展开为连分数 def continuedFra(x, y): cF = [] while y: cF += [x / y] x, y = y, x % y return cF
def Simplify(ctnf): numerator = 0 denominator = 1 for x in ctnf[::-1]: numerator, denominator = denominator, x * denominator + numerator return (numerator, denominator)
# 连分数化简 def calculateFrac(x, y): cF = continuedFra(x, y) cF = map(Simplify, (cF[0:i] for i in xrange(1, len(cF)))) return cF
# 解韦达定理 def solve_pq(a, b, c): par = gmpy2.isqrt(b * b - 4 * a * c) return (-b + par) / (2 * a), (-b - par) / (2 * a)
def wienerAttack(e, n): for (d, k) in calculateFrac(e, n): if k == 0: continue if (e * d - 1) % k != 0: continue
phi = (e * d - 1) / k p, q = solve_pq(1, n - phi + 1, n) if p * q == n: return abs(int(p)), abs(int(q)) print 'not find!'
time.clock() c = 6755916696778185952300108824880341673727005249517850628424982499865744864158808968764135637141068930913626093598728925195859592078242679206690525678584698906782028671968557701271591419982370839581872779561897896707128815668722609285484978303216863236997021197576337940204757331749701872808443246927772977500576853559531421931943600185923610329322219591977644573509755483679059951426686170296018798771243136530651597181988040668586240449099412301454312937065604961224359235038190145852108473520413909014198600434679037524165523422401364208450631557380207996597981309168360160658308982745545442756884931141501387954248 e = 8614531087131806536072176126608505396485998912193090420094510792595101158240453985055053653848556325011409922394711124558383619830290017950912353027270400567568622816245822324422993074690183971093882640779808546479195604743230137113293752897968332220989640710311998150108315298333817030634179487075421403617790823560886688860928133117536724977888683732478708628314857313700596522339509581915323452695136877802816003353853220986492007970183551041303875958750496892867954477510966708935358534322867404860267180294538231734184176727805289746004999969923736528783436876728104351783351879340959568183101515294393048651825 n = 19873634983456087520110552277450497529248494581902299327237268030756398057752510103012336452522030173329321726779935832106030157682672262548076895370443461558851584951681093787821035488952691034250115440441807557595256984719995983158595843451037546929918777883675020571945533922321514120075488490479009468943286990002735169371404973284096869826357659027627815888558391520276866122370551115223282637855894202170474955274129276356625364663165723431215981184996513023372433862053624792195361271141451880123090158644095287045862204954829998614717677163841391272754122687961264723993880239407106030370047794145123292991433 p, q = wienerAttack(e, n)
part 1 of flag: ZmxhZ3tkYXp6bGluZ19lbmNvZGluZyM0ZTBhZDQ= part 2 of flag: MYYGGYJQHBSDCZJRMQYGMMJQMMYGGN3BMZSTIMRSMZSWCNY= part 3 of flag: =8S4U,3DR8SDY,C`S-F5F-C(S,S<R-C`Q9F8S87T`
a=0 for i inrange(0,20): if (256-154+256*i)%6==0: a=(256-154+256*i)//6 print(a) break b=0xdd-(ord('f')*a)%256 print(b) c="dd4388ee428bdddd5865cc66aa5887ffcca966109c66edcca920667a88312064" i=0 flag="" while i<len(c): c1=c[i]+c[i+1] c2=int(c1,16) i+=2 for j inrange(33,128): if (a*j + b) % 256==c2 : flag+=chr(j) break print(flag)
babyaes
源码
from Crypto.Cipher import AES import os from flag import flag from Crypto.Util.number import *
defpad(data): return data + b"".join([b'\x00'for _ inrange(0, 16 - len(data))])