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=65537n=27272410937497615429184017335437367466288981498585803398561456300019447702001403165885200936510173980380489828828523983388730026101865884520679872671569532101708469344562155718974222196684544003071765625134489632331414011555536130289106822732544904502428727133498239161324625698270381715640332111381465813621908465311076678337695819124178638737015840941223342176563458181918865641701282965455705790456658431641632470787689389714643528968037519265144919465402561959014798324908010947632834281698638848683632113623788303921939908168450492197671761167009855312820364427648296494571794298105543758141065915257674305081267temp=gmpy2.iroot(n,2)[0]p=gmpy2.next_prime(temp)q=n//pprint("p =",p)print("q =",q)phi_n=(p-1)*(q-1)d=gmpy2.invert(e,phi_n)c=14181751948841206148995320731138166924841307246014981115736748934451763670304308496261846056687977917728671991049712129745906089287169170294259856601300717330153987080212591008738712344004443623518040786009771108879196701679833782022875324499201475522241396314392429412747392203809125245393462952461525539673218721341853515099201642769577031724762640317081252046606564108211626446676911167979492329012381654087618979631924439276786566078856385835786995011067720124277812004808431347148593882791476391944410064371926611180496847010107167486521927340045188960373155894717498700488982910217850877130989318706580155251854m=pow(c,d,n)print(long_to_bytes(m))

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

babyAES

Iv,c,key都給瞭,直接寫個解密腳本就行,白給類題目

from Crypto.Cipher import AESc=b'C4:\x86Q$\xb0\xd1\x1b\xa9L\x00\xad\xa3\xff\x96 hJ\x1b~\x1c\xd1y\x87A\xfe0\xe2\xfb\xc7\xb7\x7f^\xc8\x9aP\xdaX\xc6\xdf\x17l=K\x95\xd07'iv=b'\xd1\xdf\x8f)\x08w\xde\xf9yX%\xca[\xcb\x18\x80'key=b'\xa4\xa6M\xab{\xf6\x97\x94>hK\x9bBe]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 = 199533304296625406955683944856330940256037859126142372412254741689676902594083385071807594584589647225039650850524873289407540031812171301348304158895770989218721006018956756841251888659321582420167478909768740235321161096806581684857660007735707550914742749524818990843357217489433410647994417860374972468061110200554531819987204852047401539211300639165417994955609002932104372266583569468915607415521035920169948704261625320990186754910551780290421057403512785617970138903967874651050299914974180360347163879160470918945383706463326470519550909277678697788304151342226439850677611170439191913555562326538607106089620201074331099713506536192957054173076913374098400489398228161089007898192779738439912595619813699711049380213926849110877231503068464392648816891183318112570732792516076618174144968844351282497993164926346337121313644001762196098432060141494704659769545012678386821212213326455045335220435963683095439867976162p = 335215034881592512312398694238485179340610060759881511231472142277527176340784432381542726029524727833039074808456839870641607412102746854257629226877248337002993023452385472058106944014653401647033456174126976474875859099023703472904735779212010820524934972736276889281087909166017427905825553503050645575935980580803899122224368875197728677516907272452047278523846912786938173456942568602502013001099009776563388736434564541041529106817380347284002060811645842312648498340150736573246893588079033524476111268686138924892091575797329915240849862827621736832883215569687974368499436632617425922744658912248644475097139485785819369867604176912652851123185884810544172785948158330991257118563772736929105360124222843930130347670027236797458715653361366862282591170630650344062377644570729478796795124594909835004189813214758026703689710017334501371279295621820181402191463184275851324378938021156631501330660825566054528793444353g = 19x = 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 invertfrom Crypto.Util.number import *a = 3939333498b = 3662432446m = 2271373817state1 = 17362state2 = 20624c = 600017039001091357643174067454938198067935635401496485588306838343558125283178792619821966678282131419050878state1_ = 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]# 求出可能的seedfor 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 = 104984523for 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

" >使用以上payload,成功得到flag.php的base64加密後的結果

 

我們果斷解密一手base64,得到flag

動態flag,請自己參悟flag是什麼

EasyPHP

拿到題目,我們發現需要post字符串和數組拼接,即ctf[]=shumu(shumu可以改)

接下來,我們再來看一看,神奇的事情就發生瞭

動態flag,請自己參悟flag是什麼

SimpleRCE

看到源碼,我們大體就知道瞭考點是無字母數字繞過正則表達式,這裡我們用瞭取反,因為取反,用的基本是不可見字符,不會觸發到正則表達式,我們寫一個php腳本

雖然我們訪問會報錯,但是get數據之後就會大不相同

我們get一下,即" >

果不其然,ls被成功執行,接下來我們用" >

這裡可以看到我們前面有三個文件夾,所以我們需要ls ../../../即" >

看到瞭flag,那麼我們就用cat讀一下,即" >

成功讀取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 zlibimport structimport  binasciifile = 'flag.png'fr = open(file,'rb').read()data = bytearray(fr[12:29])crc32key = struct.unpack('>I',fr[29:33])[0]&0xffffffffprint(crc32key)n = 4096for 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 看什麼看!你以為我會嗎?

本文來自網絡,不代表程式碼花園立場,如有侵權,請聯系管理員。https://www.codegarden.cn/article/31362/