目次
とある日
redpwnCTF2021に参加しました。
はじめてCTFに参加した備忘録と、WriteUpを合わせて書きました。
はじめに
redpwnCTF
redpwnCTFは、redpwnCTFチームが主催するサイバーセキュリティコンテストです。トップチームに配布する賞金は4000ドル以上あります。詳細については、ランディングページを確認し、Discordサーバーに参加してください。
メンバー
- 2名
問題の振り分けは行わず好きな問題を好きに解いた感じで進めました。
最終順位
- オープン部門:593位
- 全チーム:715位
解答数
全8問
- misc:3
- rev:1
- crypto:2
- web:2
- pwn:0
Solved
misc/sanity-check
flag{1_l0v3_54n17y_ch3ck_ch4ll5}
問題の説明書きにflag
があり、flag
の動作チェック問題です。
misc/discord
flag{1_l0v3_54n17y_ch3ck_ch4ll5}
専用のdiscodeサーバーのrulesの説明書きにみたいところにある。
ruleを確認をするための問題ですね。
web/inspect-me
flag{inspect_me_like_123}
inspect-me.mc.axで、デベロッパーツールで検索すればすぐに見つかりました。
misc/compliant-lattice-feline
flag{n3tc4t_1s_a_pip3_t0_the_w0rld}
nc mc.ax 31443
実行したら、flag
が返ってくる。
web/orm-bad
flag{sqli_overused_again_0b4f6}
SQLインジェクションの問題。
SQLインジェクションで調べてヒットした条件式を送信。
1' or '1' = '1'--
crypto/scissor
flag{surround_this_flag_with_flag_format}
import random key = random.randint(0, 25) key = range(0, 25) for key in range(0, 25): alphabet = 'abcdefghijklmnopqrstuvwxyz' shifted = alphabet[key:] + alphabet[:key] dictionary = dict(zip(alphabet, shifted)) print(''.join([ dictionary[c] if c in dictionary else c for c in "egddagzp_ftue_rxms_iuft_rxms_radymf" ]))
ダウンロードした、Pythonファイルを少し変更した。
15行目を、暗号文に変更した。
実行すると、下記の結果が得られる。
はじめは、できていないと思ったけど、よくよく見ると英文になっている文章が一つだけあった。
egddagzp_ftue_rxms_iuft_rxms_radymf fheebhaq_guvf_synt_jvgu_synt_sbezng giffcibr_hvwg_tzou_kwhv_tzou_tcfaoh hjggdjcs_iwxh_uapv_lxiw_uapv_udgbpi ikhhekdt_jxyi_vbqw_myjx_vbqw_vehcqj jliifleu_kyzj_wcrx_nzky_wcrx_wfidrk kmjjgmfv_lzak_xdsy_oalz_xdsy_xgjesl lnkkhngw_mabl_yetz_pbma_yetz_yhkftm molliohx_nbcm_zfua_qcnb_zfua_zilgun npmmjpiy_ocdn_agvb_rdoc_agvb_ajmhvo oqnnkqjz_pdeo_bhwc_sepd_bhwc_bkniwp proolrka_qefp_cixd_tfqe_cixd_clojxq qsppmslb_rfgq_djye_ugrf_djye_dmpkyr rtqqntmc_sghr_ekzf_vhsg_ekzf_enqlzs surround_this_flag_with_flag_format tvsspvoe_uijt_gmbh_xjui_gmbh_gpsnbu uwttqwpf_vjku_hnci_ykvj_hnci_hqtocv vxuurxqg_wklv_iodj_zlwk_iodj_irupdw wyvvsyrh_xlmw_jpek_amxl_jpek_jsvqex xzwwtzsi_ymnx_kqfl_bnym_kqfl_ktwrfy yaxxuatj_znoy_lrgm_cozn_lrgm_luxsgz zbyyvbuk_aopz_mshn_dpao_mshn_mvytha aczzwcvl_bpqa_ntio_eqbp_ntio_nwzuib bdaaxdwm_cqrb_oujp_frcq_oujp_oxavjc cebbyexn_drsc_pvkq_gsdr_pvkq_pybwkd
rev/wstrings
flag{n0t_al1_str1ngs_ar3_sk1nny}
od -Ax -tx1z wstrings
実行すると、flag
らしき文字があったので、それをいい感じに編集。
多分正式な方法ではないと思います。
crypto/baby
python2系のみ実行できます。
RSA暗号で調べると様々なやり方が出てきます。
def _exgcd(m, n): if n > 0: y, x, d = _exgcd(n, m % n) return x, y - m / n * x, d else: return 1, 0, m N = 228430203128652625114739053365339856393 E = 65537 C = 126721104148692049427127809839057445790 p = 12546190522253739887 q = 18207136478875858439 d = _exgcd(E, (p - 1)(q - 1))[0] % ((p - 1)(q - 1)) P = pow(int(C), int(d), int(N)) print("%x" % P).decode("hex")
Couldn't solve
いい感じのところまで行ったが解けなかった問題。
the-substitution-game
Pythonの問題で、文字置換を正しく行って例文を正解の文章にする。
レベル6まであって、レベル5で躓いた。
レベル1 initial => target レベル2 oid => y hello => goodbye レベル3 aaaaaaaaaaaaaaaaaaaaaaaa => a aaaaaaaaaaaaaaaa => a aaaaaaaaa => a aaa => a aa => a レベル4 gggggggggg => gg ggggggggg => gg ggg => gg gg => ginkoid
レベル5は、回分判定を行う問題だった。
連続してる0,1を、少なくしたり、別の文字に置換したりしたが全くできなかった。
beginner-generic-pwn-number-0
とある変数の値を変更するフォーマットストリング攻撃を利用した問題だった。
変数を出力してみたり、gdb
や、コンパイル前のソースコードを見たり行ったがわからなかった。
CTFが終わってもやってると、
%11$ld
で該当変数が取得できることがわかった。
全体的にpwnの知識が足りなため結果として解くことができなかった。
CTFに参加して...
率直に難しかったです。
一定のレベル以上の問題は、どうやって解くのかが全くわからない状態でした。
pwnカテゴリーの問題は、知識がないため苦戦に苦戦しました。
自分が持っている技術や知識の範囲外の問題が多数なので力の無さを実感しました。
WriteUp
CTF問題の回答をそう呼びます。
CTFtimeで、参加者がWriteUpを上げてるのが確認できます。
この機能はものすごく便利だと思いました。
WriteUpを見て解けなかった問題を確認すると自分では思いつかなかった方法でやっていて圧巻でした。
〆
二日間ですが、初めてのCTFに参加して楽しかったです。
問題が溶けるともっと楽しいと思います。
これからもっと頑張らないといけないと思った今日このごろ。