网络知识 娱乐 Dest0g3 520迎新赛

Dest0g3 520迎新赛

MISC

Welcome to fxxking DestCTF

关注微信公众号,得到flag

Dest0g3{W31c0m3_t0_DestCTF2022!}

Pngenius

题目是一张PNG图片,很难不让人联想到隐写术,我们使用stegsolve打开

在R0G0B0发现了Password for zip,猜测图片包含ZIP,使用foremost进行分解

分解后发现有密码,使用刚刚解出来的密码解压,得到flag

Dest0g3{2908C1AA-B2C1-B8E6-89D1-21B97D778603}

EasyEncode

下载附件,发现是一个有密码的ZIP文件,我尝试了下伪加密,发现并不是,那么只能进行爆破,通过爆破得到密码

使用得到的密码进行解密,得到一串Morse

我们扔进在线网站解密一波,得到一串16进制

将16进制写入文件,发现存在unicode

我们解码一手unicode,得到一串URL编码后的密文

 使用URL进行解码,得到一串base64

解密base64,得到flag

Dest0g3{Deoding_1s_e4sy_4_U}

你知道JS吗

下载发现存在doc特征,故修改后缀为doc打开

打开后我们发现存在是字体混乱

我们直接换一个字体,发现存在base64特征

解密base64,得到如下内容

存在URL特征,我们直接使用URL解码一波,发现如下特殊字符

根据经验,这是brainfuck加密过的,我们直接解密,得到如下字符

看来是16进制,我们写入文件,发现flag

Dest0g3{86facac9-0a5d-4047-b702-86cb37ab77b2}

StrangeTraffic

下载附件,使用小鲨鱼打开这个流量包

追踪TCP,得到如下内容

将内容改为hex转储

发现如下内容,每一个循环的结尾都存在base64一部分

为我们是无脑的工具人,这里就不需要什么脚本辅助了,直接手撸一波,得到密文

RGVzdDBnM3szMUE1QkVBNi1GMjBELUYxOEEtRThFQS0yOUI0RjI1NzEwOEJ9

解密base64,得到flag

Dest0g3{31A5BEA6-F20D-F18A-E8EA-29B4F257108B}

EasyWord

解压压缩包,得到如下文件

看看hint.txt,发现password.docm的密码存在掩码攻击,且密码为6位

使用如下脚本获取docm文件的hash

以下脚本来源于

https://raw.githubusercontent.com/magnumripper/JohnTheRipper/bleeding-jumbo/run/office2john.py

获取到hash,版本之类的,我们去查一下发现2010版本的office的解密代码为9500,删除冗余,得到

使用kali自带的hashcat进行掩码攻击

查看桌面生成的mima.txt,得到密码

使用该密码打开word,发现使用了宏命令

 我们查看宏,发现被加密

先把这个docm的文件解除密码、

然后另存为成doc文档,使用notepad打开

将DPB修改为DPx(区分大小写),然后保存后再次打开,忽略所有的警告,但提示错误

我们重新设置一个密码

点击确定后保存,然后使用notepad打开,将DPx改回DPB,至此,破解密码已完成

再次打开后我们就可以编辑这个宏了,对代码进行简单的分析

我们如下图修改代码

这样相当于反向加密,我们调试时可以修改If为1让程序执行语句

接下来经过调试,我们发现只有这一行是输出最终提示的

我们将它改为1,其它改为0,看看效果

成功输出到了最终的密码(中间省略了一些调试过程,有兴趣的人可以去试试)

随后我们将源码还原到修改前,然后运行,输入密码,得到密码

压缩包密码:2zhlmcl,1hblsqt.

这里问候一下出题人,为什么解压密码后面的是个感叹号呢?

解压得到flag

Dest0g3{VBScr1pt_And_Hashc4t_1s_g00d}

4096

果断启动一波容器,进入容器,在JS中找到一串base64

Base64进行解码,得到另一串base64

 再次解码,得到后半段flag

我们在容器中将favicon.png下载下来,然后使用foremost进行文件分离

使用耳朵听一下wav,发现前面是按键音,中间是SSTV,后面也是按键音,我们用AU处理

将中间的SSTV删除后让两段拨号音拼接

然后使用demf2num进行拨号音识别,得到74958097831

考虑到是拨号,我们将它进行reserve操作,得到出题人手机号13879085947

然后我们听一下中间的SSTV,本菜因为电脑没有声卡,被迫用手机了(软件名:Robot36)

我们按照题目指示的方法,将出题人手机号进行md5,加密,得到最终的解压密码

使用以下密码对压缩包进行解压,得到如下图片

实在是太套了,我们使用gaps+手撸拼出原图(因为gaps精准度堪忧)

把这些base64拼在一起,得到前半段flag

随后我们将前半段flag和后半段flag进行拼接,得到最终的flag

Dest0g3{ed4d114f-9ee4-4ee7-b673-971d81f8b177}

Python_jail

下载题目拿到附件解压

先看看hint

看到中间的空白字符,再结合是一门语言,根据经验想到了无字天书

将password进行无字天书运行,得到密码:a8e15220-7404-4269-812e-6418557b7dc2

URL: https://vii5ard.github.io/whitespace/

使用该密码解压SECRET1.zip,得到一张图片,将它使用stegslove打开

最终在R0G0B0发现Zmxh开头的字符串,疑似flag进行base64编码

解base64得到flag

flag{b5bcfc87-5ca6-43f1-b384-57d09b886ca9}

codegame

下载附件,修改后缀为zip,解压

打开KEYcode

根据经验得知,这段代码是LOLCODE,LOLCODE在线运行

 

URL: https://www.dcode.fr/lolcode-language

运行得到QEFPFPQEBMXPPTLOA,这便是ZIP的密码,我们将Treasure.zip中的docx解压

后缀改为.zip,解压得到fllllllllll1ag.txt

这是emojiAES,同样用QEFPFPQEBMXPPTLOA进行emojiAES解密即可

 但是我们发现解不出来,其实这是出题人留下的坑,我们点击Advanced,调整一下

最终得到了一串16进制(Rotation:4

将这段16进制使用16进制编辑器打开,得到flag

 flag{9f68f334-017a-4201-92df-dddcc145334d}

rookie hacker-2

非预期解!!!(应该)

使用破空flag查找工具,写一条正则(ip正则:d+.d+.d+.d+)

然后递归一下Memory.dd,冗余数据战术性不看,结合docker数据是172开头,且172.18.0.2和172.18.0.3是相邻ip,并且在文本中也是相邻的,所以猜测ip就是这俩,结果还真对了,这里给破空flag查找工具打call!

Dest0g3{172.18.0.2_172.18.0.3}

被污染的二维码

首先根据附件名称,修改后缀为zip后解压

先看flag1的16进制,发现是个png文件,但是有意外收获

这里其实都没啥,意外收获就是这个PNG图片为了防止我们使用PS等软件打开,多了一个IDAT块,不清楚是什么用,但是binwalk可以把它分离

我们先修改后缀为png,发现是个反转颜色的二维码,我们使用stegslove反色一下

暂时没什么信息,我们binwalk一下这张图片,发现在里面有一个密码

 

看来是有什么东西需要密码,但是flag1已经处理完了,我们看看flag2,发现是个7Z文件

 

但是实际上这个7z的文件头损坏了,正确的应该是377ABCAF,而它是377AAFBC,将BCAF换位,得到正确的文件

 

将后缀改为7z,然后使用密码解压,得到密文,但是密文长度有问题,猜测有零宽存在

 

我们解密零宽,零宽有很多种,都试试就好了,最后发现是这个Unicode Steganography with Zero-Width Characters (330k.github.io)

 

这里师傅们一定要注意下面的选项

紧接着,我们根据解出来的N-ZA-M猜测是rot13算法,对解出来的长度66字符进行rot13

根据经验判断是base64,解密一下,得到部分flag

那么我们接下来的任务就是找到这四位字符,看来只能处理flag1中的二维码了,我们用QRazyBox加手撸补一下,这里的图片大小是315*315,但是二维码是21*21,所以每15*15代表二维码的一个像素,我们浅浅把我们已知的区域补充一波

(这里运用了推理手法,因为墨水是黑色,只要是15*15像素内存在白色,就一定是白色)

但是经过爆破发现没什么用(乱码了),那就只能继续补下面的灰色,我们瞎蒙一下

这里蒙的肯定不对,但是要知道,这个神奇的玩意是可以大幅度纠正错误的,我们点击tools

点击之后,往下翻,发现它提取出来了

最终的flag出来了

Dest0g3{dcfdffa4-ce19-45cb-902b-df7a152516c7}

CRYPTO

babyRSA

看到q的生成规则,很容易联想到pq相差非常小,使用平方差遍历法直接一把梭哈pq,然后求phi,求d,解密m。脚本如下:

from Crypto.Util.number import *

from gmpy2 import *

e=65537

n=27272410937497615429184017335437367466288981498585803398561456300019447702001403165885200936510173980380489828828523983388730026101865884520679872671569532101708469344562155718974222196684544003071765625134489632331414011555536130289106822732544904502428727133498239161324625698270381715640332111381465813621908465311076678337695819124178638737015840941223342176563458181918865641701282965455705790456658431641632470787689389714643528968037519265144919465402561959014798324908010947632834281698638848683632113623788303921939908168450492197671761167009855312820364427648296494571794298105543758141065915257674305081267

temp=gmpy2.iroot(n,2)[0]

p=gmpy2.next_prime(temp)

q=n//p

print("p =",p)

print("q =",q)

phi_n=(p-1)*(q-1)

d=gmpy2.invert(e,phi_n)

c=14181751948841206148995320731138166924841307246014981115736748934451763670304308496261846056687977917728671991049712129745906089287169170294259856601300717330153987080212591008738712344004443623518040786009771108879196701679833782022875324499201475522241396314392429412747392203809125245393462952461525539673218721341853515099201642769577031724762640317081252046606564108211626446676911167979492329012381654087618979631924439276786566078856385835786995011067720124277812004808431347148593882791476391944410064371926611180496847010107167486521927340045188960373155894717498700488982910217850877130989318706580155251854

m=pow(c,d,n)

print(long_to_bytes(m))

Dest0g3{96411aad-032c-20a8-bc43-b473f6f08536}

babyAES

Iv,c,key都给了,直接写个解密脚本就行,白给类题目

from Crypto.Cipher import AES

c=b'C4:x86Q$xb0xd1x1bxa9Lx00xadxa3xffx96 hJx1b~x1cxd1yx87Axfe0xe2xfbxc7xb7x7f^xc8x9aPxdaXxc6xdfx17l=Kx95xd07'

iv=b'xd1xdfx8f)x08wxdexf9yX%xca[xcbx18x80'

key=b'xa4xa6Mxab{xf6x97x94>hKx9bBe]F'

cipher = AES.new(key,AES.MODE_CBC,iv)

m=cipher.decrypt(c)

print(m)

Dest0g3{d0e5fa76-e50f-76f6-9cf1-b6c2d576b6f4}

ezDLP

看到题目不难发现g的值非常之小,使用Pohlig-Hellman算法直接解

Sagemath的discrete_log可以直接求解,脚本如下

y = 199533304296625406955683944856330940256037859126142372412254741689676902594083385071807594584589647225039650850524873289407540031812171301348304158895770989218721006018956756841251888659321582420167478909768740235321161096806581684857660007735707550914742749524818990843357217489433410647994417860374972468061110200554531819987204852047401539211300639165417994955609002932104372266583569468915607415521035920169948704261625320990186754910551780290421057403512785617970138903967874651050299914974180360347163879160470918945383706463326470519550909277678697788304151342226439850677611170439191913555562326538607106089620201074331099713506536192957054173076913374098400489398228161089007898192779738439912595619813699711049380213926849110877231503068464392648816891183318112570732792516076618174144968844351282497993164926346337121313644001762196098432060141494704659769545012678386821212213326455045335220435963683095439867976162

p = 335215034881592512312398694238485179340610060759881511231472142277527176340784432381542726029524727833039074808456839870641607412102746854257629226877248337002993023452385472058106944014653401647033456174126976474875859099023703472904735779212010820524934972736276889281087909166017427905825553503050645575935980580803899122224368875197728677516907272452047278523846912786938173456942568602502013001099009776563388736434564541041529106817380347284002060811645842312648498340150736573246893588079033524476111268686138924892091575797329915240849862827621736832883215569687974368499436632617425922744658912248644475097139485785819369867604176912652851123185884810544172785948158330991257118563772736929105360124222843930130347670027236797458715653361366862282591170630650344062377644570729478796795124594909835004189813214758026703689710017334501371279295621820181402191463184275851324378938021156631501330660825566054528793444353

g = 19

x = discrete_log(mod(y, p), mod(g, p))

print(x)

可以得到输出

627467212751652661100750674849894892358409405070345081253130721039787502632741519936253501608002590652971133

print之后使用Crypto库的long_to_bytes直接求解flag

Dest0g3{07ed2a6f-182f-a05d-c81e-1318af820a78}

ezStream

脚本如下,思路在注释里

from gmpy2 import invert

from Crypto.Util.number import *



a = 3939333498

b = 3662432446

m = 2271373817

state1 = 17362

state2 = 20624

c = 600017039001091357643174067454938198067935635401496485588306838343558125283178792619821966678282131419050878

state1_ = state1 <> 16,seed_new



# 爆破低16位得到可能的state1的真实值

# for i in range(2**16):

#     t = state1_ + i

#     if (a * t + b) % m >> 16 == state2:

#         print(t)

t_list = [1137839988,1137855425,1137870862]

# 求出可能的seed

for i in t_list:

    seed = (i - b) * invert(a,m)%m

    print(seed)

seed_list = [1315807869,710396196,104984523]



c_bytes = long_to_bytes(c)

print(len(c_bytes))



key_list = []

seed = 104984523

for i in range(47):

    key,seed = next(seed)

    key_list.append(key%10)



for i in range(45):

    print(chr(key_list[i+2]^c_bytes[i]),end='')



# 这道题并不需要求seed,拿到t_list之后递推就可以了

RESERVE

simpleXOR

拿到题目,使用IDA打开,观察函数,就是道签到题,随便写个脚本xor一下

这里贴下脚本

a=[179,145,130,128,195,155,206,117,207,156,154,133,133,205,184,132,170,125,189,187,177,181,150,113,141,158,134, 191, 115,168,163,156,131,101,158,87]

for i in range(len(a)):

    print(chr((a[i]^0xf7)-i),end="")

Dest0g3{0bcgf-AdMy892-KobPW-hB6LTqG}

hi

v6是密文,v5是输入的flag[i]*23,可以直接查看x,flag长度是45,我们放一下

enflag=[0x97, 0x64, 0x48, 0xC6, 0x1C, 0x7A, 0x8E, 0x9F, 0x46, 0xBD,

  0x60, 0xE7, 0x82, 0xF3, 0xEE, 0x69, 0x49, 0xF7, 0x0E, 0xE3,

  0xE2, 0x17, 0xC0, 0xB9, 0x2C, 0x39, 0x30, 0xA4, 0x48, 0x01,

  0x41, 0x98, 0x39, 0xA9, 0xB5, 0xE5, 0x11, 0x74, 0x0E, 0xE8,

  0xAC, 0xFD, 0x8B, 0xA5, 0x6D

]



x=[  0x7B, 0x51, 0xF3, 0x5A, 0xCC, 0x39, 0xF9, 0x92, 0x1C, 0x9E,

  0x58, 0x69, 0x9D, 0xF7, 0xFD, 0x4A, 0x3E, 0xFB, 0x1D, 0x2C,

  0x4D, 0x0C, 0x70, 0xB1, 0x3B, 0x8D, 0x25, 0xED, 0x91, 0xB1,

  0x73, 0x8D, 0x82, 0xE6, 0xE7, 0x50, 0x20, 0x61, 0x62, 0x3C,

  0x00, 0x3A, 0xA6, 0x9D, 0x32]



for i in range(45):

    for j in range(0,128):

        v5=23*j

        if(v5+x[i])&0xff==enflag[i]:

            print(chr(j),end="")

Dest0g3{f982cd79-d7a3-0874-aa0b-a5b37e4445c8}

WEB

phpdest

 

拿到题目,我们使用伪协议配合多级符号链接的办法进行绕过

/proc/self指向当前进程的/proc/pid/,/proc/self/root/是指向/的符号链接,所以我们可以用上述方法进行绕过,接下来放出payload

?file=php://filter/convert.base64-encode/resource=/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/var/www/html/flag.php

使用以上payload,成功得到flag.php的base64加密后的结果

 

我们果断解密一手base64,得到flag

动态flag,请自己参悟flag是什么

EasyPHP

拿到题目,我们发现需要post字符串和数组拼接,即ctf[]=shumu(shumu可以改)

接下来,我们再来看一看,神奇的事情就发生了

动态flag,请自己参悟flag是什么

SimpleRCE

看到源码,我们大体就知道了考点是无字母数字绕过正则表达式,这里我们用了取反,因为取反,用的基本是不可见字符,不会触发到正则表达式,我们写一个php脚本

<?php



$system=$_GET['q'];

$command=$_GET['p'];

echo '[*] (~'.urlencode(~$system).')(~'.urlencode(~$command).');';

虽然我们访问会报错,但是get数据之后就会大不相同

我们get一下,即?p=ls&q=system

果不其然,ls被成功执行,接下来我们用?p=pwd&q=system来执行pwd

这里可以看到我们前面有三个文件夹,所以我们需要ls ../../../即?p=ls ../../../&q=system

看到了flag,那么我们就用cat读一下,即?p=cat ../../../flag&q=system

成功读取flag

动态flag,请自己参悟flag是什么

ezip

进入题目,我们发现我们的老婆就在里面,在网页的源代码打开一下我们的老婆

我们发现我们的老婆的文件尾有很奇怪的base64,复制一下并解密,得到了源码

然后我们进行简单的代码审计,发现它会解压ZIP,然后删除ZIP除去图片的所有文件

但是实际上,ZIP可以用特殊手段刷出”/”,从而使得无法解压

新建一个文件,名为1,然后扔进压缩包,然后再把php一句话木马扔进压缩包

通过这种手段刷”/”,使得网站无法正常识别即可

紧接着,打开中国蚂剑尝试连接

连接成功之后添加数据,正常打开

 回到根目录发现flag无法正常打开,但是flag是有大小的,这里大概率是权限问题

我们使用nl命令读取,得到flag

动态flag,请自己参悟flag是什么

BLOCKCHAIN

Where is flag?

下载附件,用文本编辑器打开,访问区块链

发现只有一个没有报error,我们访问它

我们点击State,将里面的所有hex改为text

这里可以看到,flag已经出来啦,手动拼一下,得到最终flag

Dest0g3{0n1y_u5e_priv4t3_i45_n0t_s4f3_1n_B1okCh4in!}

Easy predict

下载附件,用文本编辑器打开,访问区块链

直接看一看State,并将可以展开的全部展开,将hex改为text

接下来往下翻,可以看到很多有意义的字符串

将它们按照英语语法拼一下,得到flag

Dest0g3{thi5_1s_4_sup3r_e3ea5y_pe1d1ct_r1ght?}

AI

OCR

拿到题目,发现是一道很奇怪的图片

校验图片CRC,发现CRC不正确,大概率是宽高被改了

我们使用脚本爆破一下CRC,这个脚本百度一大堆,我们贴一下我们百度到的

import zlib

import struct

import  binascii



file = 'flag.png'

fr = open(file,'rb').read()

data = bytearray(fr[12:29])

crc32key = struct.unpack('>I',fr[29:33])[0]&0xffffffff

print(crc32key)

n = 4096

for w in range(n):

    width = bytearray(struct.pack('>i', w))

    for h in range(n):

        height = bytearray(struct.pack('>i', h))

        for x in range(4):

            data[x+4] = width[x]

            data[x+8] = height[x]

            #print(data)

        crc32result = zlib.crc32(data)

        if crc32result == crc32key:

            print(crc32key)

            print(width,height)

            print(data)

            newpic = bytearray(fr)

            for x in range(4):

                newpic[x+16] = width[x]

                newpic[x+20] = height[x]

            fw = open(file+'.png','wb')

            fw.write(newpic)

            fw.close

运行之后,我们的脚本就会帮我们自动还原图片的宽高

看到这里,明白题目为什么叫OCR了,原来这里才是需要OCR的地方,我们OCR一波

377ABCAF271C000451FCF397500200000000000062000000000000001D9C97C8E004D002485D0022194A676D2FDE351A055C168F9710364AE2D581126E378F3B4C47E15E2E80B74234B849430A221F40C086E06B24ADAAC47F32CB62CADD154B50723E65E50CDF99CC2B953916AD2204D70C15FB493BD4C2E1F93902FB3563190ACEE58CC01621BB2AAAB6EED8CE892FEF5F0927E2C4BCD7C188277D09D0357995A2FB65D31CD99C853D7BAF52EAD8555920D1672B4A3B713917E98FB324AD225A3FA2AFAC1435FFE31ED0C0CEF0CA0B68C0CCCA81C458680D7C75139429D282984933F7ACFDFB127321D9F4EFC0FEAAE92F985D3C457E90AFBC4DA9D11B23E507A0953036A2EC1D75D69CD1F6A9F0790B1AB02D6C2AFFDF66A2E7E56A1070FBCD316813E12DF9E26FC4813D419792A65960D4D97EDFA7A978A0385C04CF36EFDE3B07DF9B9405253EAA838149910F2571FAA4A8E085D1567C5C17C9B3400F91FBFE6B47E052BA07097C9D77803D3A45E3477FE324603179C7CA6A128CDC0F7E834812618AD4C79934226637E9300C5595E355139A2ECF661A5F63750A6A0035ACF52417AF3A1C1FEA14471D074C27F81C719D98717F4ECD32918BD15C18AB93769E94DDEFD3B6FAF4DDD6628BA44BDEF574FCCD5589334EA8063D7B27A2F0600FC864D010A7F0CEC9B9395434878D01943887194342F9D34FC8F12DD4556ED5A5A36667F9319A0395DB9A445B94C44771B406F962B1CFC8535BA0D3EE3DDDEB876C95092AAB192B168A732F3A7B9E8156C403C583983F5527A0D6C5D6928481D56955474046D9FC17A2DE21F3D6FC4C69644E7C6A141BE948A417A33D62C6FF6DFAC702A0FC101748D9A9C64A6A0000010406000109825000070B010001212101000C84D100080A0196EAFE6000000501190A0000000000000000000011190044006500730074003000670033002E00740078007400000019020000140A0100B547E05F6654D8011506010020000000000000

然后我们将这串16进制写入文件中,得到一个7Z

解压这个7Z,得到如下txt

将中间那段base64解密,得到flag

Dest0g3{34512098-3309-7712-8865-783460221647}

The correct flag

打开附件,全选,发现大量没有显示但是有文字的地方

 复制到一个txt文档里面,观察

 

 看到如此杂乱,再结合是AI,我们想到了词频分析,浅浅的百度一个脚本

使用前不要忘记删除装饰题目的信息

import string

 

def stats_words(filename):

    """统计文章中单词的频数"""

    # 读取文章中的内容

    with open(filename,encoding="utf-8") as fbj:

        contents = fbj.read()

    # 解析成单词列表

    words = contents.split()

    # 去除重复的单词

    words_set = set(words)

 

    # 用于存放单词和频数的字典

    words_dir = {}

    for key in words_set:

        words_dir[key] = 0

 

    # 开始统计单词的频数

    for word in words:

        if word in words_set:

            words_dir[word] += 1

 

    return words_dir

 

file_name = "test.txt"

# 文章中的标点符号要去除

words_dir = stats_words(file_name)

words_dir = sorted(words_dir.items(), key=lambda x: x[1], reverse=True)

print(words_dir)

我们打开一下flag.txt,并搜索’D(因为flag为Dest0g3{})

这里我们可以看到D后面跟的最多的字母就是e,所以我们猜测flag如下

De st 0g 3{

用类似于上面的检索办法,拿到一个字符串后面跟的最多的字符串

我们发现,有De,st,却还有一个es,这让我想到了贪吃蛇

参考一下,得到:Deesstt00gg33{{22998877NNWWqqSSddIIll11}}D

去除冗余就能得到flag了,上面一定要复制文本得到,不能手拼,因为:

有一个可恶的出题人欺负我不分|1l这三个字符

Dest0g3{2987NWqSdIl1}

PWN

看什么看!你以为我会吗?