yharimaとして参戦。序盤は上位にいたものの後半とけねーとなり21位でフィニッシュ。
readme
読み込めるファイルに制限があるスクリプトを攻略する問題。/home/ctf/flag
にフラグがあるもののファイルパスにctf
が含まれていると実行できない。
それを回避するためにうまくフラグのあるディレクトリにアクセスできないかを考え、/proc
で動いているプロセス自身の情報を利用してファイルを読み込む。
実行プロセスのカレントディレクトリが/home/ctf/server
らしいということが環境変数をみるとわかったのでそれを使うとフラグが取れた。
$ echo /proc/self/environ | nc readme.quals.beginners.seccon.jp 9712
File: ...PWD=/home/ctf/server...
$ echo /proc/self/cwd/../flag | nc readme.quals.beginners.seccon.jp 9712
File: ctf4b{m4g1c4l_p0w3r_0f_pr0cf5}
mask
入力した文字列に定数をマスクして、その値がプログラム内に埋め込まれた文字列に合致するかを判定するバイナリを解析する問題。入力する文字列がフラグになるのでそれを突き止める。
aからzの文字を入力して以下のような換字表を作り、埋め込まれた文字列も持ってきて人力でフラグを取った。
abcdefghijklmnopqrstuvwxyz
a`adede`a`adedepqpqtutupqp
abc`abchijkhijk`abc`abchij
ctf4b{dont_reverse_face_mask}
atd4`qdedtUpetepqeUdaaeUeaqau
c`b bk`kj`KbababcaKbacaKiacki
yakisoba
入力した文字列をいろいろ処理して条件にあっているかどうかを判定するプログラムが渡される。めんどくさかったのでangrで自動処理。
まずは正解のメッセージが出力される処理の実行アドレスを突き止める。そしてangrのGithubのトップにあったコード持ってきてアドレスをちゃちゃっと書き換え実行するとフラグが出てくる。
import angr
project = angr.Project("./yakisoba", auto_load_libs=False)
@project.hook(0x4006d9)
def print_flag(state):
print(state.posix.dumps(0))
project.terminate_execution()
project.execute()
ghost
GhostScriptのソースコードが渡される。実行すると標準入力から文字列が読み込まれ、文字列が数値に加工される。問題ファイルには加工後の文字列が記されたoutput.txt
が渡されるので、その値になるように入力する文字列を特定する問題。
GhostScriptを調べて他の言語に置き換えるのもいいが、あまりドキュメントもなくめんどくさくなったのでブルートフォースで解析。
from pwn import *
def check(flag):
p = process('gs chall.gs', shell=True)
p.sendline(flag)
p.recvline()
p.recvline()
p.recvline()
r = p.recvline().decode('utf-8').strip()
p.close()
return r
worddic = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_}!?.,-/'
flag = 'ctf4b{'
found = True
with open('output.txt') as f:
l = f.read().strip()
for i, s in enumerate(l.split(' ')):
if i < len(flag):
continue
if not found:
print('Ooooops...')
break
found = False
for c in worddic:
r = check(flag + c).split(' ')[-1]
if r == s:
flag += c
found = True
break
print(flag)
sneaky
スネークゲームをするプログラムが渡される。問題文を読むと高得点取るとフラグらしい。
真面目にやっても仕方ないのでバイナリ解析して得点を管理する部分を突き止め初期得点を書き換える。