今日はなにの日。

気になったこと勉強になったことのメモ。

今日は、redpwnCTF2021参加したの日。

目次

とある日

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に参加して楽しかったです。

問題が溶けるともっと楽しいと思います。

これからもっと頑張らないといけないと思った今日このごろ。