はまやんはまやんはまやん

hamayanhamayan's blog

DCTF 2021 Writeups

CTFtime.org / DCTF 2021

Welcome

Sanity Check

トップページに書いてあるので頂いておこう。dctf{welc0m3_t0_dCTF}

Misc

Encrypted the flag I have

f:id:hamayanhamayan:20210515112206p:plain

フォントを解析して何が書いてあるかを抜き取れという問題。
フラグはdctf{から始まるんだよなぁ…と思いつつ見ると、ちょうど{がふたみたいな記号になっていて、末尾もふたみたいな記号なので、フォント解析という方向性は間違っていなさそう。
あと、先頭の文字はdであることもわかったので、先頭の文字だけ切り出して、適当に調べて出てきたwww.whatfontis.com - What Font Isで判定してみると、Aurebesh Font | dafont.comであることが分かる。
あとは、対応表を見ながら文字起こししていけば答え。

dctf{mastercodebreaker}

Dragon

f:id:hamayanhamayan:20210515112929p:plain

かわいいドット絵のファイルが与えられる。それ以外にヒントもないので、とりあえず色々試す。

  • strings ダメ
  • binwalk ダメ
  • exiftool ダメ

ふむ。青い空を見上げればいつもそこに白い猫使ってみるか…と思いながらポチポチやっているとフラグが出てくる。

f:id:hamayanhamayan:20210515113106p:plain

dctf{N0w_Y0u_s3e_m3}

Don't let it run

pdfファイルが与えられる。pdfファイルの解析といえばpeepdfなので、解析してみよう。

$ python2 peepdf.py dragon.pdf -i
Warning: PyV8 is not installed!!
Warning: pylibemu is not installed!!
Warning: Python Imaging Library (PIL) is not installed!!

File: dragon.pdf
MD5: a85c21b3e834fd47f8c09aa62017f8a9
SHA1: bee4c92dbe47325b96d8520c20e8b9f0b29cb7e8
SHA256: f2e9ba45ecac5a32df93a5ef6d38d95d15d5d7f5c2b219f18edb014afc953d79
Size: 295461 bytes
Version: 1.7
Binary: True
Linearized: False
Encrypted: False
Updates: 0
Objects: 10
Streams: 5
URIs: 0
Comments: 0
Errors: 0

Version 0:
        Catalog: 1
        Info: 4
        Objects (10): [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        Streams (5): [6, 7, 8, 9, 10]
                Encoded (4): [6, 8, 9, 10]



PPDF> object 3

<< /Type /Action
/S /JavaScript
/JS var _0x4ac9=['663aCYhYK','9qwaGGO','log','1PtCftm','1068uRYmqT','dctf{pdf_1nj3ct3d}','768577jhhsbr','717342hAzOOQ','722513PAXCbh','833989PQKiti','1447863RVcnTo','125353VtkXUG'];(function(_0x3b1f6b,_0x1ad8b7){var _0x566ee2=_0x5347;while(!![]){try{var _0x2750a5=parseInt(_0x566ee2(0x16e))+-parseInt(_0x566ee2(0x16d))+parseInt(_0x566ee2(0x16c))+-parseInt(_0x566ee2(0x173))*-parseInt(_0x566ee2(0x171))+parseInt(_0x566ee2(0x172))*-parseInt(_0x566ee2(0x16a))+parseInt(_0x566ee2(0x16f))*parseInt(_0x566ee2(0x175))+-parseInt(_0x566ee2(0x170));if(_0x2750a5===_0x1ad8b7)break;else _0x3b1f6b['push'](_0x3b1f6b['shift']());}catch(_0x5764a4){_0x3b1f6b['push'](_0x3b1f6b['shift']());}}}(_0x4ac9,0x8d97f));function _0xa(){var _0x3c6d20=_0x5347;console[_0x3c6d20(0x174)](_0x3c6d20(0x16b));}var a='bkpodntjcopsymlxeiwhonstykxsrpzy',b='exrbspqqustnzqriulizpeeexwqsofmw';_0xb(a,b);function _0x5347(_0x37de35,_0x19ac26){_0x37de35=_0x37de35-0x16a;var _0x4ac9ea=_0x4ac9[_0x37de35];return 
_0x4ac9ea;}function _0xb(_0x39b3ee,_0xfae543){var _0x259923=_0x39b3ee+_0xfae543;_0xa();}
 >>

jsコードが抜き出せましたね。これを真面目に解析するか…と思いきやべた書きしてある。dctf{pdf_1nj3ct3d}
これはもしかして…

$ strings dragon.js | grep dctf
var _0x4ac9 = ['663aCYhYK', '9qwaGGO', 'log', '1PtCftm', '1068uRYmqT', 'dctf{pdf_1nj3ct3d}', '768577jhhsbr', '717342hAzOOQ', '722513PAXCbh', '833989PQKiti', '1447863RVcnTo', '125353VtkXUG'];

これでもいいですね。

Hidden message

f:id:hamayanhamayan:20210515115619p:plain

画像が与えられる。できることを一通り試すとフラグが回収できる。zstegで抜き出せる。

$ zsteg fri.png
b1,rgb,lsb,xy       .. text: "dctf{sTeg0noGr4Phy_101}"
b3,g,lsb,xy         .. text: "I@4I)$Xl"
b3,abgr,msb,xy      .. text: "v\rWv)WvM"
b4,r,lsb,xy         .. text: "\nfb@DHfBHH"
b4,r,msb,xy         .. text: "E`@Q'g3@D@tr"
b4,g,msb,xy         .. text: "ND@&B$rp"
b4,b,lsb,xy         .. text: "D\"$ \"\"\"$bN"
b4,b,msb,xy         .. text: "DDD$Fr0U3p@f"
b4,rgb,lsb,xy       .. text: "HDd(\"b(Dd\""
b4,rgb,msb,xy       .. text: "GpD@FdD#"
b4,bgr,lsb,xy       .. text: "H$b(\"dH$`"
b4,bgr,msb,xy       .. text: "t@@DFd$#"
b4,rgba,lsb,xy      .. text: "`OP/S/b/b?"
b4,abgr,msb,xy      .. text: "O@OdOdO2/"

Web

Simple web

f:id:hamayanhamayan:20210515124514p:plain

チェックを入れてSubmitしてもフラグはもらえなかった…
通信をみてみると、

POST /flag HTTP/1.1

flag=1&auth=0&Submit=Submit

こんな感じだったので、auth=1にしてみよう。

POST /flag HTTP/1.1

flag=1&auth=1&Submit=Submit

HTTP/1.1 200 OK

There you go: dctf{w3b_c4n_b3_fun_r1ght?}

Very secure website

ソースコードがもらえるので見てみよう。

 <?php
    if (isset($_GET['username']) and isset($_GET['password'])) {
        if (hash("tiger128,4", $_GET['username']) != "51c3f5f5d8a8830bc5d8b7ebcb5717df") {
            echo "Invalid username";
        }
        else if (hash("tiger128,4", $_GET['password']) == "0e132798983807237937411964085731") {
            $flag = fopen("flag.txt", "r") or die("Cannot open file");
            echo fread($flag, filesize("flag.txt"));
            fclose($flag);
        }
        else {
            echo "Try harder";
        }
    }
    else {
        echo "Invalid parameters";
    }
?> 

ユーザー名が分からないが、適当にadminとしてみたら、Try harderと帰ってきたので、adminでよさそう。
パスワード部分は比較相手が0eから始まっているのでmagic hashを使って比較をtrueにする。
hashes/tiger128,4.md at master · spaze/hashes · GitHub
ここから好きなものを持ってきてパスワードにすればmagic hashが得られてフラグが手に入る。
dctf{It's_magic._I_ain't_gotta_explain_shit.}

※ magic hash:phpでは0e数字だけ == 0e数字だけが数値比較と考慮されて0 == 0となってtrueになることを利用したもの。