Attack All Around

今やCTFと競プロばかりだが、トビタテ生のアメリカ留学やTOEFL奮闘記

ångstromCTF 2021 writeup

2021年度初のCTFはångstromCTFに参加しました。前回のpicoCTFに続き解ける問題も多いけど悩まされる良いCTFでした。全く歯が立たないというよりこちらの方が良いですね。

 

 

 

Result

 

f:id:partender810:20210408103617p:plain

総合結果

 

結果は1430ptで158位でした! まあまあ頑張れたと思います。

 

Writeup

Misc

Sanity Check 5pt

Join our discord to talk to us and get the flag (clam might even say hi)! https://discord.gg/Dduuscw

As repentance for last year, the music video will be separate and on a strict opt-in basis. https://www.youtube.com/watch?v=dQw4w9WgXcQ

とりあえずDiscordに入れと、入ったけど分からない…。

結局、rolesチャンネルにあったメッセージに:三角の旗:マークのリアクション付けるとgeneralチャンネルに入れトピックにflagが書いてありました。これに気付くのに時間がかかり、他の問題を先に解いてました。

 

actf{always_gonna_give_you_up}

 

 

Survey 5pt

Thank you for participating in our CTF! We hope you had fun. Please fill out this survey to help us improve the competition for next year. We encourage each individual that participated in the CTF to submit a response.

This challenge does not affect time-based tiebreakers.

アンケートに答えて終わりです。

 

actf{roly_poly_fish_heads_are_never_seen_drinking_cappuccino_in_italian_restaurants_with_oriental_women_yeah}

 

 

Archaic 50pt

The archaeological team at ångstromCTF has uncovered an archive from over 100 years ago! Can you read the contents?

Access the file at /problems/2021/archaic/archive.tar.gz on the shell server.

今回は問題サイトにshellがあり、その中のarchive.tar.gzを探せという問題でした。

 

cd / でrootディレクトリに移動し、該当ファイルのあるディレクトリへ移動します。そしてtar.gzを解凍して終わり、と思いきや権限が無いよと怒られる。しかしこの中にどうやらflag.txtがあるようです。

 

なんとかして解凍せずに閲覧できないかと模索したら、その方法を発見!

【Linux】tar.gzを解凍せずに中身を参照する | ばちブロ

tar -zxOf archive.tar.gz flag.txt でOKです。

 

actf{thou_hast_uncovered_ye_ol_fleg}

 

 

Fish 60pt

Oh, fish! My dinner has turned transparent again. What will I eat now that I can't eat that yummy, yummy, fish head, mmmmmm head of fish mm so good...

ファイル:fish.png 

とりあえずこの写真を開いてみます。何も見えません…。 

 

うーん、背景透過の画像かなぁ。それをどうやったら見れるんだろう。と色々ググって試してみたけど何も分からず…。

 

そういやパワポに図を貼り付ける時にオプションでやると背景透過の画像でも背景が黒色になる時あったな、パワポに貼ってみるか!

 

出た。

 

f:id:partender810:20210407230921p:plain

これが想定解とは到底思えない

 

actf{in_the_m0rning_laughing_h4ppy_fish_heads_in_th3_evening_float1ng_in_your_soup}

 

 

Crypto

Relatively Simple Algorithm 40pt

RSA strikes strikes again again!

ファイル:source.py, output.txt

 

p, qが分かっているRSAです。やるだけですね。

 

actf{old_but_still_good_well_at_least_until_quantum_computing}

 

 

Exclusive Cipher 40pt

Clam decided to return to classic cryptography and revisit the XOR cipher! Here's some hex encoded ciphertext:

ae27eb3a148c3cf031079921ea3315cd27eb7d02882bf724169921eb3a469920e07d0b883bf63c018869a5090e8868e331078a68ec2e468c2bf13b1d9a20ea0208882de12e398c2df60211852deb021f823dda35079b2dda25099f35ab7d218227e17d0a982bee7d098368f13503cd27f135039f68e62f1f9d3cea7c
The key is 5 bytes long and the flag is somewhere in the message.

これが先程の問題と同じ点数とは…難易度が違う…。

 

ciphertextは16進数でかなりの桁数で、keyは5bytesなら単純にciphertext xor keyなら上位桁は変わらないのでは?ととりあえずlong_to_bytesしてみました。まあそんなんで解けるわけないですよね。

 

keyが5bytesならbrute forceできないしなぁ…とこの5bytesに注目しました。flagが平文にあるなら "actf{" という文字列があることが分かります。つまりxorして"actf{"となる部分があるはずなので、それを逆算してkeyの候補を絞ります。例えばciphertextの1byte目は"ae"です。aeを復号すると文字"a"になるのであれば、int("ae",16)^ord("a")がkeyの1byte目になります。となると次の"27"が文字"c"になって、と考えるとkeyの候補数は高々ciphertextの長さ程度です。

 

全て試して平文の中に"}"が含まれたものを出力していくと、その中にそれっぽいのを発見しました。

 

Congratulations on decrypting the message! The flag is actf{who_needs_aes_when_you_have_xor}. Good luck on the other crypto!

 

actf{who_needs_aes_when_you_have_xor}

 

 

Keysar v2 40pt

Wow! Aplet sent me a message... he said he encrypted it with a key, but lost it. Gotta go though, I have biology homework!

ファイル:source.py, output.txt

ふむ…難しいことしているな。outputの最後の方にflagっぽい文字列があるけど、どうやって復号するのかな。

 

あれ?これただの換字式暗号では?とquipquipに投げました。便利すぎるツールですね。ちゃんと平文と暗号文のアルファベットが全単射だったので上手くいったようです。

 

according to all known laws of aviation, there is no way a bee should be able to fly. its wings are too small to get its fat little body off the ground. the bee, of course, flies anyway because bees don't care what humans think is impossible. yellow, black. yellow, black. yellow, black. yellow, black. ooh, black and yellow! let's shake it up a little. barry! breakfast is ready! coming! hang on a second. hello? barry? adam? can you believe this is happening? i can't. i'll pick you up. looking sharp. use the stairs. your father paid good money for those. sorry. i'm excited. here's the graduate. we're very proud of you, son. a perfect report card, all b's. very proud. ma! i got a thing going here. you got lint on your fuzz. ow! that's me! wave to us! we'll be in row 118,000. bye! barry, i told you, stop flying in the house! hey, adam. hey, barry. is that fuzz gel? a little. special day, graduation. never thought i'd make it. three days grade school, three days high school. those were awkward. three days college. i'm glad i took a day and hitchhiked around the hive. you did come back different. hi, barry. artie, growing a mustache? looks good. hear about frankie? yeah. you going to the funeral? no, i'm not going. everybody knows, sting someone, you die. don't waste it on a squirrel. such a hothead. i guess he could have just gotten out of the way. i love this incorporating an amusement park into our day. that's why we don't need vacations. boy, quite a bit of pomp... under the circumstances. well, adam, today we are men. we are! bee-men. amen! hallelujah! students, faculty, distinguished bees, please welcome dean buzzwell. welcome, new hive city graduating class of... ...9:15. that concludes our ceremonies. and begins your career at honex industries! will we pick ourjob today? i heard it's just orientation. heads up! here we go. keep your hands and antennas inside the tram at all times. wonder what it'll be like? a little scary. welcome to honex, a division of honesco and a part of the hexagon group. this is it! wow. wow. we know that you, as a bee, have worked your whole life to get to the point where you can work for your whole life. honey begins when our valiant pollen jocks bring the nectar to the hive. our top-secret formula is automatically color-corrected, scent-adjusted and bubble-contoured into this soothing sweet syrup with its distinctive golden glow you know as... honey! that girl was hot. she's my cousin! she is? yes, we're all cousins. right. you're right. at honex, we constantly strive to improve every aspect of bee existence. these bees are stress-testing a new helmet technology. what do you think he makes? not enough. here we have our latest advancement, the krelman. actf{keyedcaesarmorelikesubstitution}

 

actf{keyedcaesarmorelikesubstitution}

 

 

sosig 70pt

Oh man, RSA is so cool. But I don't trust the professionals, I do things MY WAY. And I'll make my encryption EXTRA secure with an extra thicc e! You'll never crack it!

ファイル:output.txt

eが大きすぎるのでWiener's Attackですね。picoCTFでも同じ問題あったのでsolverコピペしてn,e,cだけ変えて終了です。

 

partender810.hatenablog.com

 

actf{d0ggy!!!111!1}

 

 

Home Rolled Crypto 70pt

Aplet made his own block cipher! Can you break it?

nc crypto.2021.chall.actf.co 21602

ファイル:server.py

このサーバは1を選ぶと任意の平文を暗号化してくれ、2を選ぶと「この平文を暗号化せよ」と言われ10回連続でサーバでの暗号化した結果と一致すればflagを出してくれます。

 

暗号化方式をざっくり言うと、まずkeyを96の長さで生成します。前1/3をk1, 真ん中1/3をk2, 残りをk3とし、平文をm(16 bytesとします)と置くと

c <- m & k1

c <- c ^ k1

c <- c & k2

c <- c ^ k2

c <- c & k3

c <- c ^ k3

としcが暗号文となります。平文が16bytes以上の場合は区切って同じように暗号化します。keyの値が分かれば簡単に暗号化できますね。

 

これって数学的に解くのかなとandしてからのxorに法則を見つけようとしたけど無理でした。

 

でもこれってbit演算だけだからk1,k2,k3が各々0,1である場合を出してみればいけるのでは?と考えたけど、結果からkeyは特定できず…。

 

でも各bitが他のbitに影響を及ぼさないから、全てのbitに対して0だった時の暗号文と1だった時の暗号文を記憶すればいけるのでは?となりました。つまり、平文のi bit目が0だった時に暗号文のi bit目が0か1かをans[2*i]に格納し、平文のi bit目が1だった時に暗号文のi bit目が0か1かをans[2*i+1]に格納しました。

 

1を選ぶのは2回だけで良くて、"0"*32と"f"*32を暗号化した結果を上記のようなans配列に記憶します。

 

次に2を選択し暗号文を2進数にして各bitを確認しans配列を用いて暗号文を生成します。これを10回繰り返して終了です。

 

actf{no_bit_shuffling_is_trivial}

 

 

Follow the Currents 70pt

go with the flow... 

ファイル:source.py, enc

keyをまず2bytesランダムで生成し、そこからzlib.crc32というのでkeyの長さを増やします。そのkeyとflagをxorした結果がencです。

 

zlib.crc32はチェックサムを計算しているようですが、詳しいことは分かりません(笑) ただ、最初のkeyの2bytesが決まれば、その後は一意に決まります。故にその2bytesをbrute forceしてkeyを作ってencとxorして、"actf"の文字列が含まれるのを出力して終わりです。

 

there are like 30 minutes left before the ctf starts so i have no idea what to put here other than the flag which is actf{low_entropy_keystream}

 

actf{low_entropy_keystream}

 

 

I'm so Random 100pt

Aplet's quirky and unique so he made my own PRNG! It's not like the other PRNGs, its absolutely unbreakable!

nc crypto.2021.chall.actf.co 21600

ファイル:server.py

第一にserver.pyについて、r1, r2(10進数でちょうど8桁)がこの乱数発生プログラムのseedになります。serverに"r"を送ると、getNum関数にて乱数を発生してくれます。r1の値を二乗すると16桁になります。その真ん中の8桁がr1(.seed)になります。r2についても同様です。そして、r1*r2を出力します。これは3回までやってくれます。

 

解法としては、r1*r2を素因数分解して8桁*8桁の形にします。自分はその作業が面倒だったので、素因数分解した際に片方が8桁の素数になるまでサーバとつなぎ直していました。

 

r1, r2が決まれば16桁の自然数の内真ん中8桁がr1(もしくはr2)となる平方数をbrute forceします(もっといい方法があるかも?)。gmpy2.irootで平方数かどうかチェックします。8桁をbrute forceするのでかなりの時間がかかりますが、サーバのコネクションは切れずに待っててくれます。

 

真ん中8桁がr1となる16桁の平方数はいくつか候補が出てきますが、次に乱数を発生した際にr1*r2の形なので、割り切れる候補が正しいr1の最初のseedになります。最初のseedが分かれば、次の乱数を予想するのは容易です。

 

最後に2回連続次の乱数を予想して当てればflagをくれます。

 

actf{middle_square_method_more_like_middle_fail_method}

 

 

Substitution 130pt

nc crypto.2021.chall.actf.co 21601

ファイル:server.py

これは個人的に物議をかm...失礼いたしました。

 

まずserver.pyの挙動の理解に時間がかかりました。flagのASCIIコードをm[0],m[1],...,m[n-1]とすると、valueが入力の値でlambda式とreduceを使って、

m[0]*pow(value,n-1) + m[1]*pow(value,n-2) + ... + m[n-2]*pow(value,1) + m[n-1] mod 691

を計算し出力してくれます。

 

ここからが長かった…。valueを0とすると125が返ってきてm[n-1]に該当します。chrすると"}"となるのでflagの最後の文字ということが分かります。ではここからどう他の文字を特定するのでしょう…。

 

こんな数学的な問題を扱うのは久しぶりな上、どうあがいても式が立てられない…。ググっても分からない…。

 

数学が得意そうなm1z0r3メンバーのAtCoder黄色ランク(上位数%)の凄腕に聞いてみました。

 

「それはラグランジュ補間をやるだけですね。」

 

なんだそれは。わざわざ解説記事も教えてくれたのに理解できないポンコツに成り下がり…。AtCoderでも全く同じ問題が出てたので、それをACしてた彼のソースコードをコピペして終了!

 

Submission #10506051 - AtCoder Beginner Contest 137

 

彼にこの問題の難易度聞くと、彼レベルでないと解けない程だと…。緑coderの僕には無理な話でした!なのになんで3桁solvesもあるの!?みんなプログラムスキルが高いのかググり力が高いのか…。

 

期間終盤でみんなが停滞している中、この問題correctになったことで1000pt台に乗ったのは嬉しかったです!

 

actf{polynomials_20a829322766642530cf69}

 

 

Oracle of Blair 160pt 

Not to be confused with the ORACLE of Blair. 

nc crypto.2021.chall.actf.co 21112

ファイル:server.py

出ました苦手なAES問題…。でも自力で解けたの本当に嬉しい!

m1z0r3の方、この問題勉強会で使うのであまり見ないよう…

 

このサーバは第一にkeyを32bytesランダムに決めます。次にwhile文に入り、入力をunhexlifyして、その結果"{}"が含まれていたらflagにreplaceしてくれます。7b7dを入力するとb"{}"になります。次に長さが16の倍数になるようpadしてivをランダムに決めます。そしてkeyとivを用いてAESのCBCモードでdecryptして出力します。

 

CBCモードと言ったらpadding oracle attackですよね。でも今回はpaddingを勝手にしてくれるので使えません。

 

そしてdecryptしてくれるのに全然気付かず、ずっとencryptを見ていました。

 

f:id:partender810:20210408004329p:plain

AES CBC decrypt

 

ここで、7b7dを送った時の返ってきた16進数と7b7d+"07"*7を送った時の返ってきた16進数の後半半分が一致していることが試して分かりました。その16進数の桁数の結果も踏まえて、flagの長さが25bytesということが分かりました。

 

上の図でCiphertextを左からc1, c2, c3 Plaintextをp1, p2, p3とすると、

p3 = enc(c3) xor c2

となります。ここでenc()とはkeyによって暗号化された値です。このサーバを使うとc2, c3は自分で決められp3は与えられることからenc(c3)を求めることができます。なぜenc(c3)を求めたいかというと、ここが分かると欲しいc2の値が分かります。

 

c2, c3は全て0としてenc(c3)を求めます。その後、7b7d + "07"*7 + "00"*16を送り付けます。c1, c2はflagとpaddingが該当し、c3は"00"*16です。enc("00"*16)は先程求めたので、貰った復号16進数の後ろ1/3がp3に該当するのを使うと

c2 = enc(c3) xor p3

とc2が求まり、long_to_bytesするとflagの後ろの部分とpaddingが見えました。

 

同じようにenc(c2)を求めます。c1 = "00"*16として送るとp2に該当する部分を利用し

enc(c2) = c1 xor p2 

 で求まります。その後、7b7d + "07"*7 + "00"*16を送り、

c1 = enc(c2) xor p2

でc1が求まり、flagの前半部分が分かりました。

 

これできたの本当に気持ち良かったです!苦手分野であるだけに喜びもひとしおです!

でもアメリカ大統領選挙のようなURLが問題文にあったのなんでだろう。

 

actf{cbc_more_like_ecb_c}

 

 

solverや問題はこちらから!

github.com

 

 

前回のpicoCTFに続いて(まだwriteupは公開で来てませんが)、結構crypto問題を解けたと思います(個人比)。3桁solvesのものをほとんど解けるようになったのは嬉しいなぁ。m1z0r3がもっと有名になると嬉しいですね!

 

それでは!

 

See you next time!

 

 

留学期間を終えて

こんにちは!Ken.Sです!

 

 

ついに…1年間の(オンラインがほとんどの)留学が終了しました!!

 

毎週研究室全体のミーティング、教授とは1,2週間に1度のペース、そして早稲田の方の研究室のゼミ(日本語, 英語)2つに参加させてもらい、50近くのパワポ資料作成を経て1つの論文を書き上げることが出来ました。

 

今回は、研究後記という形で書いていこうと思います。

 

 

留学前はブロックチェーンを使ってより公平なゲームを作ることができるのか?というResearch Questionで一年半研究してました。ブロックチェーンの改ざん不可能性の利用して、チートのできないブロックチェーンゲームを提案しました。ブロックチェーンを知らない方にとっては、いったい何の話だとなることでしょう…(笑) 

ブロックチェーン:暗号資産(仮想通貨)の取引を記録する技術

 

 

その後留学するためのTOEFLの対策で半年を費やし、去年の3月にアメリカへ出発しました。

 

 

アメリカに来てからは、どのようなゲームにブロックチェーンを取り入れると自分が提案したものよりさらにメリットの大きいものができるのか、を考えていきました。今あるオンラインゲームにおける潜在的な問題をブロックチェーンで解決できればいいな、といった感じでサーベイをしていました。特にブロックチェーンは取引に特化した技術だと思っているので、この特徴で解決できそうな問題を探していました。

 

そこで一つ見つけたのが、「ガチャ、ギャンブルではないか問題」。

ガチャは、ゲーム内通貨(魔法石etc)を払って、ゲーム内アイテム(SRキャラとかそんなやつ)を手に入れます。ゲーム内通貨はリアルマネーを払って手に入れることもできるのに対し、貰えるゲーム内アイテムの価値は毎回バラバラです。日本では改正資金決済法で言及されており、実際に「コンプリートガチャ」というものはユーザーの射幸心を煽りすぎるということで禁止されました。

 

アメリカ在住時の細かい話はこちらをどうぞ!

アメリカ留学始まってバタバタした話 - Attack All Around

第一回チキチキ!強制帰国レース - Attack All Around

I'll be back. - Attack All Around

 

自分でも見返してみたのですが、現地生活を事細かに書いててびっくりしてます(笑) この貴重な1ヶ月の気持ちを思い出すことができたので、ブログを書いててよかったなと思います。

 

 

帰国後2週間はこのように過ごしていました。この頃から自炊を手伝うようになり、今でもちょくちょく手伝っております。料理できる男子になりたいなと…。

2週間の自宅隔離の過ごし方。意識だけは高い大学院生の場合 - Attack All Around

 

 

日本に帰ってきてからは、ソーシャルゲームの問題や歴史、なぜ人はソシャゲにハマるのかなど調べていったのですが、色んな過程を経て既存のブロックチェーンゲームであるCryptoKittiesに注目しました。この時点でもう5,6月でした。

 

私生活の方では、トビタテの人達とひたすらオンラインで話してました。zoomで毎週のように話したりインスタライブをやってみたりオンライン脱出ゲームをやったり、自粛生活の中でも人と話す機会が多くて精神的にも助かっていました。トビタテのみんなありがとう!

 

 

夏にはソースコードを読み込んでデータをクローリングして公平性に欠けてるのでは?と気付き、そこを重点的に調べていきました。金融市場の公平性など色々サーベイしてたら半年かかり気付いたら冬。時間はかかりましたが、その分論文が書けるような成果がしっかりと出て良かったです。

 

夏休み期間になると週1で早稲田の研究室生とオンライン上で遊んでいました。人狼, Among us, boardgamearena, etc. この週1でも色んな人と話すというのが自分にとって本当にプラスに働いていました。研究でネガティブになっても、話せば晴れることが多くて気持ちを切り替えられました。

 

夏休みが明けても同様に遊んでいて、研究以外にも就活のストレスもあったので、いいリフレッシュになっていました。年末になると卒論修論学会などで研究室生も忙しくなりなかなか集まれなかったので、ドラクエⅣをアプリで遊んでいました。ゲームはいい気分転換になりました、やりすぎないようにするので大変でした(笑) 今はドラクエⅦをやり込んでます!なかなか進まない…。

 

 

12月に研究成果を論文にして、なんとか2月初旬の提出に間に合いました。

2月下旬に採択されたと知った時はこの研究だけでなく、2年半前に留学を決意した時から今までの過程までもが認められたような気がして、本当に嬉しかったです!!!

 

採択からは発表に向けた資料を作っていました。発表時間が短く、時間内に収めるのが本当に難しかったです。それに加えて英語での発表…。本番は緊張がすごかったですね(笑) 発表はともかく質問された時に何言ってるか理解できずに困惑してました…。

 

改めてこの一年を書いてみたら、色々紆余曲折があったなと思います。研究が一筋縄ではいかないことも含めて良い経験になりました。

 

コロナ禍で研究するための時間を確保するの比較的簡単かと思うのですが、家での作業が増える分OFFへのスイッチが難しいと感じました。そのスイッチが私は上手く働いてくれたので、今回の採択に繋がったのかなと思います。4月からはまた大学院生に戻りますが、今後とも切り替えを大事にして良い成果をあげたいなと思います。

 

f:id:partender810:20210331110712p:plain

去年の帰国後、一番見たかったのは日本の桜。今年も綺麗ですね。



 

 

 

改めまして、この一年私と関わってくださりました全ての方に御礼申し上げます。

 

それでは!

 

 

See you next time!

 

 

 

 

 

 

 

 

 

 

 

 

 

utctf 2021 writeup

こんにちは!Ken.Sです!

今回はutctfのwriteupです

 

UTCTF

 

m1z0r3は9779ptで72位でした

 

 

 

Beginner

 

Cipher Gauntlet

Can you make it through all of the encodings and ciphers?

ファイル:secret.txt 

 

中を見ると8bitの整数がたくさんあるので、まあASCIIだろうとchrしてみる。

 

そうすると以下のような文章が!

Uh-oh, looks like we have another block of text, with some sort of special encoding. Can you figure out what this encoding is? (hint: if you look carefully, you'll notice that there only characters present are A-Z, a-z, 0-9, and sometimes / and +. See if you can find an encoding that looks like this one.)
TmV3IGNoYWxsZW5nZSEgQ2FuIHlvdSBmaWd1cmUgb3V0IHdoYXQncyBnb2luZyBvbiBoZXJlPyBJdCBsb29rcyBsaWtlIHRoZSBsZXR0ZXJzIGFyZSBzaGlmdGVkIGJ5IHNvbWUgY29uc3RhbnQuIChoaW50OiB5b3UgbWlnaHQgd2FudCB0byBzdGFydCBsb29raW5nIHVwIFJvbWFuIHBlb3BsZSkuCm15eHFia2Rldmtkc3l4YyEgaXllIHJrZm8gcHN4c2Nyb24gZHJvIGxvcXN4eG9iIG1iaXpkeXFia3pyaSBtcmt2dm94cW8uIHJvYm8gc2MgayBwdmtxIHB5YiBrdnYgaXllYiBya2JuIG9wcHliZGM6IGVkcHZrcXt4eWdfaXllYm9fenZraXN4cV9nc2RyX21iaXpkeX0uIGl5ZSBnc3Z2IHBzeG4gZHJrZCBrIHZ5ZCB5cCBtYml6ZHlxYmt6cmkgc2MgbGVzdm5zeHEgeXBwIGRyc2MgY3liZCB5cCBsa2NzbSB1eHlndm9ucW8sIGt4biBzZCBib2t2dmkgc2MgeHlkIGN5IGxrbiBrcGRvYiBrdnYuIHJ5em8gaXllIG94dHlpb24gZHJvIG1ya3Z2b3hxbyE=

 

後半は明らかにbase64ですね、デコードしてみましょう。

New challenge! Can you figure out what's going on here? It looks like the letters are shifted by some constant. (hint: you might want to start looking up Roman people).
myxqbkdevkdsyxc! iye rkfo psxscron dro loqsxxob mbizdyqbkzri mrkvvoxqo. robo sc k pvkq pyb kvv iyeb rkbn oppybdc: edpvkq{xyg_iyebo_zvkisxq_gsdr_mbizdy}. iye gsvv psxn drkd k vyd yp mbizdyqbkzri sc lesvnsxq ypp drsc cybd yp lkcsm uxygvonqo, kxn sd bokvvi sc xyd cy lkn kpdob kvv. ryzo iye oxtyion dro mrkvvoxqo!

 

rot13ぽい文章が出てきました。途中にはflagがありそうですし、最初の単語はcongratulations! のようですね。

 

rot13しても文章にならない…。最初の文字がzになったのでもう3つシフトしてみたら(つまり上記の文をrot16したら)flagがでました。

congratulations! you have finished the beginner cryptography challenge. here is a flag for all your hard efforts: utflag{now_youre_playing_with_crypto}. you will find that a lot of cryptography is building off this sort of basic knowledge, and it really is not so bad after all. hope you enjoyed the challenge!

 

utflag{now_youre_playing_with_crypto}

 

Sizzling Bacon

My buddy Francis is really into Bacon. He loves it so much that he gave me this encoded bacon-themed flag (he said he was inspired by the sound of sizzling bacon).

sSsSSsSSssSSsSsSsSssSSSSSSSssS{SSSsSsSSSsSsSSSsSSsSSssssssSSSSSSSsSSSSSSSSsSSsssSSssSsSSSsSSsSSSSssssSSsssSSsSSsSSSs}

 

とりあえず{}が見えるので換字暗号だろうと予想。{の文字の前には30文字あり今回のフォーマットはutflagなので、暗号文5文字が平文1文字になるのだろう。暗号文を5文字区切りで見たら平文aに該当しそうな暗号文21~25文字目がSSSSSでした。Sが0でsが1となる2進数でord('a')+(その2進数)とすれば解けるのでは?となりました。f,gに該当する部分もこの考え方で齟齬はありませんでした。あとはこれに沿って復号します。

 

それにしてもなぜベーコン?ベーコンを炒める音でこの暗号を思いついたのはなぜ?

追記:こんな暗号があるんですね 

Bacon's cipher - Wikipedia

 

utflag{crispybaconcipher}

 

 

Various Vernacular

This flag was intercepted. wmysau{foeim_Tfusoli}

Unfortunately, it seems to be encrypted. Additional encrypted text was also found.
Hkgxologflutleiaymt xgf Azutgkrftmtf ltmntf ERW wfr ELW wfmtk Rkweq.

 

HINT : The plaintext may not necessarily be in English. 

 

とりあえずwmysauがutflagなるんだろう。その後は???って感じでした。これが本当にbeginnerか?

ヒントを見ると英文が暗号化されたわけではなさそうなところが、さらに突き放された気分…。

 

換字式暗号だろうということから、なんとかquipquipというものがあることを思い出し、Cluesにwmysau=utflagと入れたらドイツ語の文章が出てきました(出てきた文をDeepLに入れて判明)。英語以外もやってくれるとかquipquipしゅごい。

https://www.quipqiup.com/

あとは辞書を作って完成です。

 

utflag{nicht_English}

 

 

Cryptography

 

Small P Problem

My buddies Whitfield and Martin were trying to share a secret key between themselves, and I was able to eavesdrop on their conversation. I bet I could probably figure out their shared secret with a little math...

p = 69691
g = 1001

A = 17016
B = 47643
Note: submit either the shared secret or the shared secret wrapped in utflag{}

 

うーん、これはなんだろう。gとpがあるのでElGamalっぽくy=pow(g,x,p)でyがA,Bに該当するんだろうととりあえずxを計算してみたらA,Bともに出てきました。

A = pow(g,12552,p),

B = pow(g,7919,p)

 

さてここからが分からない。秘密鍵ってこの12552と7919じゃないのか?utflag{125527919}と提出してもincorrectでした。

 

ここで少しうなって時間かけて、とりあえず上の2問を先に解きました。

 

自分が知らない暗号方式があるのでは?と、「暗号 g p A B」でググる初心者振り。そしたらDiffie-Hellman鍵共有を見つけてこれだ!!となりました。

www.slideshare.net

知ってました、知ってたんですけどね…。というかあんなググり方でヒットする検索エンジンすごい。

秘密鍵 = pow(g, 12552*7919, p) = 53919

 

utflag{53919}

 

illegal Prime

The NSA published the ciphertext from a one-time-pad. Since breaking one-time-pad is so easy, I did it for you.

To avoid legal trouble I can't tell you the key. On an unrelated note I found this really cool prime number.

ファイル:challenge.txt

まずillegal primeってなんだ?ところから入りました。

illegal primeとは、機密情報を含む素数のことです。例えば、100...00(電話番号10桁)00...01のような素数があったとして、私はこんな素数を見つけました!とその素数を公開します。その電話番号を持つ人にとっては迷惑な話です。電話番号以外にも機密情報を公開するのは違法ですが、素数として公開すれば法をかいくぐることができますねというお話です。

この記事が分かりやすくてオススメです。

違法素数を小学生でもわかるように例えで説明する | 数学の星

 

ということで、challenge.txtのpに情報が隠されているのだろうと踏んで探してみました。結果、long_to_bytes()したらkeyらしきものが見えました。

b'k = 5a0b05d9831438ac8561d2b0a42be1cf5613db21deb9a443e21c4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f'

このkと与えられたcをどうしたらいいのかで悩み、中断…。k+cとかk-cとか考えてました。この記事のせいだ。

Physical One-time Pad

 

結局kとcのxorをlong_to_bytesでOKでした。悔しい。

 

utflag{pr1m3_cr1m3s____!!!}

 

 

Forensics

 

SHIFT

I just tried to download this flag, but it looks like the image got messed up in transit...

ファイル:SHIFT.png

解いてる人が多いのとPNGファイルの扱いが苦手なのでやってみました。

 

画像を見ると、文字が斜めになっていそうな感じです。画像の幅や高さを変えたらできるのかな?とか思っていました。

 

結局PILの使い方を先輩に教えてもらって、ピクセルを上手くずらすことができました。

画像の下の部分にいくにつれてよりずらすことで、斜めになった文字を直せました。

f:id:partender810:20210313161555p:plain

結果

utflag{not_when_i_shift_into_maximum_overdrive}

 

OSINT part2

Find the origins of the linked file found in part 1. 

HINT : Downloading and uploading the file might give more straight forward results

HINT : The solution involves an everyday tool used to find things.

 

とりあえずpart1はチームメイトが解いてたので、それを基にやってみました。part1のflagはある方のツイートにあったとのことで、それを見に行きました。すると、そのツイートに対してリプライがあり、画像ファイルがありました。問題文よりこの画像ファイルを発信源を探すのだろうと、画像検索。そしたら一発でした。

 

Tobias Maier

 

utflag{r3v3rs3d_t0_0r1g1nal}

 

solverなどはこちらです!

GitHub - ksbowler/UTCTF2021

 

次はLINE CTFに参加しようと思います!

それでは!

 

See you next time!

 

zer0pts CTF 2021 writeup

こんにちは、Ken.Sです!

 

久しぶりにCTFのwriteupです。今年初めて書くので拙い文章なのはご了承ください…。

 

https://2021.ctf.zer0pts.com/index.html#/

 

 

Crypto

 

war(sa)mup

Do you know RSA? I know.
author:theoldmoon0602
warsamup_05d9e1f890f75cc7aadf145af49fddbb.tar.gz

 

とりあえず中を覗いて見ると、平文mを色々パディングしておりそれをm'とすると、公開鍵に加えm'を暗号化したものとm'//2を暗号化したものを与えられています。

m'を2で割ったものは上位ビットが同じだからFranklin-Reiter Related Message Attackができるのでは?とチームメイトが発見。ここで私は起床しました。昨日は朝3時に論文発表していたんです。近日その模様が公開されるので乞うご期待!

 

そのチームメイトがこのサイトを使えばいけるのでは?となり早速読んでみる

Crypton/exploit.sage at master · ashutosh1206/Crypton · GitHub

 

そもそもこの攻撃をよく知らないのでここらでお勉強。

SageMathを使ってCoppersmith's Attackをやってみる - ももいろテクノロジー

InterKosenCTF 2020 - padrsa - HackMD

 

今回m1は平文をパディングしたもの、m2はm1//2となっています。

つまり、m1 = 2*m2 or m = 2*m2+1と上記サイトのa,bが分かります。Xornetさんのwriteupより考えると、

 

g2(x) = (x)^e - c2 = 0 mod n -> g2(x) = (x-m2)h2(x) mod n

g1(x) = (2*x)^e - c1 = 0 mod n もしくは

g1(x) = (2*x+1)^e - c1 = 0 mod n

-> g1(x) = (x-m2)h1(x) mod n

 

となります。h1(x),h2(x)はsageにぶん投げて求めてもらいます。

 

そして、先程載せたgithubのコードをsagemathにぶん投げます。

output.txtをコピペしてパラメータを定義し、このように実行します。

franklinreiter(c1,c2,e,n,2,1)

resultをそのまま表示させて、あとはpythonで2倍して1加えたものをlong_to_bytesすればflagが出てきました。

 

ほとんどコードを丸パクリしただけなので、写真でご勘弁…。

f:id:partender810:20210306133943p:plain

 

zer0pts{y0u_g07_47_13457_0v3r_1_p0in7}

 

他にも、easy pseudo random や janken vs yoshiking などを解いたんですけど歯が立たず…。公式writeupはこちらです。

 

hackmd.io

 

それでは!

 

See you next time!

「水曜どうでしょう」は全ての都道府県を訪れているのか?

こんにちは!Ken.Sです!

 

留学から帰国しステイホームが続いている中、契約しているNetflixで見つけハマった「水曜どうでしょう」。今回はそのどうでしょうについて語りたいと思います!どうでしょう知らない方は是非この記事の前に実物を見てください!

 

 

~ルール~

・サイコロや絵ハガキの旅は目的地をカウント(新幹線などで通過した県は除く)

・カブ企画は通過した県もカウント

対決列島は鹿児島決戦までに繰り越した県はカウントしない

・泊まった都道府県はカウント

・他は車など乗り物から降りて撮影してたらカウント(深夜バスでのSAは除く)

 

 

下の図は、初めてその都道府県を訪れた時の企画(略称)を記してます!

 

f:id:partender810:20210210000805p:plain

都道府県制覇(?)

 

都道府県制覇してました!!

 

怪しいとことしては千葉県、山梨県佐賀県…。

 

千葉県は成田空港があるので経由では何回も訪れているでしょう!

山梨県対決列島で通過しただけなので、本当に微妙です…。他の企画でも経由で訪れたことはなさそう? SAであれば深夜バスの時に訪れているかもですね。

佐賀県はサイコロ3でハウステンボス訪れた際の経由で鳥栖駅などで訪れていますね。

 

 

いずれ山梨県に注目した(?)企画が出ると良いですね!

ここ違うよ、とかあればコメントください!

 

 

それでは!

 

See you next time!

 

 

 

 

「米」

こんにちは! Ken.Sです!

 

2020年も残すところあと一日となりました。多くの人がそうであったように、私も今年は激動の一年となりました。初めて経験したことや新しく始めたことが多かった2020年、ありきたりではありますが振り返りたいと思います。

 

f:id:partender810:20200323000025p:plain

ここにいたはずの場所

 

今回のタイトルの「米」。これは、個人的今年の漢字です。

  • 米国に留学した
  • 米国の米が合わず、帰国したら日本の米のおいしさに感動し、高校からほとんど変わらなかった体重が激変した。
  • 「八十八」種類と言っていいくらいの経験と、「八十八」ほど成長をすることができた。

 

特に三点目が私の今年を象徴しています。今年は本当に多くの事を経験しました。先にも書いた「初めて経験したことや新しく始めたこと」を軸に思い返してみます。

 

毎年年末年始で忙しかったことはなかったのですが、去年から今年にかけては留学受入のためにTOEFL受験対策でひたすら英語を勉強した年越しとなりました。年明けすぐに受験した回で何とか達成しました!勉強してた半年は長~~く感じましたが、これで留学へのスタートラインに立ててほっとしました。

 

 

  • 留学&一人暮らし 3月

この一ヶ月は辛くも貴重な経験をできた一ヶ月でした。今まで一ヶ月の間一人で過ごした経験はなく、特に海外でというのはしんどかったです(笑)

 

研究を進める、というのは日本とアメリカでやる場所が違うだけでした。が、一人でなく研究室で研究するとなると、言語の壁を大きく感じました。いくらTOEFLで勉強したとはいえ実践となると難しいものがありました(笑) 今もその壁は感じますが、大変な思いをすればするほど深い経験になると思っているので、苦労したいと思います!

 

もう一つの一人暮らしについてですが、これがつらかった…。言語の壁もそうですし、食生活も変わりました。奨学金が多いわけではないので、貧乏生活でした…。自炊も初めての経験で、どういったものが必要で保存の仕方はどうでetc...はほとんど知らず、googleのある時代に生まれて本当に良かった!! 

 

ただ、経験の無さが如実に現れており…。朝はコーンフレーク、昼はサラダのみ、夜は冷凍食品のサイクルで、料理と言ってもキャベツを角切りする程度でした(笑)  味に飽きたということはあまりなかったのですが、色んなのを作れる技量があったらどれだけよかったことか… 買い物にも立地がそこまで良くはなく、坂の上り下りがつらかったです。

 

アメリカでやりたかったことはほとんど叶えられず仕舞いでしたが、経験値としては良いものを得られたと思います。

 

 

  • オンライン留学&お金をもらって研究するということ 4月~

日本に戻ってからは、多くのトビタテ生と交流したり日本のご飯を堪能したりであまりネガティブにはならなかったです。むしろ、年々新しく交流する方は減っていく一方で、同世代でしかも同じ留学を考えていた方達と携わることができたのはこの一年で一番良かったことです。

 

研究としては、またしても場所が変わっただけといった感じで悪影響はなかったです。

 

いつもと違うのは、奨学金をもらってオンラインで留学を続けるということです。研究のモチベーションにもなりますし、責任感も芽生えます。身を引き締めて留学を続けたいと思います!

 

 

  • 料理 4月~

アメリカでの食生活の反省から、次行けるようになった時にはもう少し作れるように…と始めた料理ですが、モチベーションは段々下がっており(笑) いずれは一人暮らしをするはずなので、ちゃんと勉強したいと思います。

 

 

研究の息抜きに、と好きだったプログラミングをちゃんと勉強しだしました。のほほんと3月まではやっていたのですが、4月に弊研究室に大物が現れて…。上位数%に該当するレベルの方で、もはや先生ですね。教わりながらどんどんモチベーションが上がっていき…ランクが上がるのに爽快感を得ながら続けています!

 

 

  • CTF本格始動 5月~

こちらも息抜きです(笑) 4月から今日まで、研究競プロCTFの3つしかやってないですね(笑) こちらはコンピュータセキュリティコンテストで、主に暗号問題を解いています。簡単に言うとちゃんと暗号化してデータを扱ってないから元通りに復号できちゃうよ頑張れ、って感じです。これも楽しいんですよね!

 

研究室に配属してから研究室での勉強会は参加していたのですが、ちゃんとコンテストに参加するのは今年からです。今まではボウリングやTOEFLで参加できず…だったのですがもったいないなって思ってます(笑)

 

 

  • ブログ 1月~

最後に今年始めたものとして、このブログがあります。思ったことを軸に、最近はCTFのwriteupや数学で面白かった問題などを紹介してます。書いていて多くの方に読んでいただきアクセス数が多いと嬉しいですし、また他の方のブログで紹介された時は格別でした!今後も続けていきますので、これからもご拝読お願いします!

 

 

新しい経験を基に2020年を振り返ってみました。去年も大変でしたが、今年はそれを上回る一年となりました。しかし多くの事を経験できたのは、今年の一番の良かったことだと思っています。来年もいつまでステイホームが続くか分かりませんが、家にいながら自分の成長に繋がることを続けていけたらなと思います!

 

 

それでは!良いお年を!

 

 

See you next year!

 

 

 

 

 

m1z0r3CTF 2020 作問してみた

こんにちは! Ken.Sです!

 

今回は私が所属しているCTFチームのm1z0r3でチーム内CTFを行ったので、私が作問した問題を公開してみます!! writeupは最後にリンクを貼っておきますので、そちらを確認していただければと思います。

 

flagの正誤判定用のサイトとかは用意できないので、以下にスクリプトを書いておきます。正しいハッシュ値であったらOKということで許してください…。スコアサーバ代わりなので、このハッシュをクラックするとかbruteforceするとかはこの問題の想定ではないので控える用お願いします。

flag format はm1z0r3{ [a-z], [A-Z], [0-9], !, ?, _, - }です。ファイルはgithub上に載せています。

 

該当ファイルはこちらから! problemディレクトリに入っています! solverには解答が入っているので、解き終わったら見てみてください。

GitHub - ksbowler/m1z0r3CTF2020

 

correct.py

------------------------------------------------------

import hashlib
flag = "m1z0r3{test_flag}"
print(hashlib.sha256(flag.encode()).hexdigest())

------------------------------------------------------

 

解いてみた感想を是非聞きたいので、挑戦してくださった方、コメント頂けると大変嬉しいです!!!

 

 

 

Searchable Encryption (crypto)

nc ys5441.tk 51696

ファイル:server.py

難易度:warmup

 

flag hash : a3bf8e2dc06862d61b962d820cdb55c74d00f6acfd005485f0ff323aea13fe57

 

almost EDO (crypto)

There are a lot of ways to encrypt FLAG.

ファイル:problem.py, data.txt

難易度:medium ~ hard

 

flag hash : 9b4795f58a2926828ac32246a6e7ad22d17d3e74aac009bed36daf8ce7c22f16

 

ヒントとして、最後には背景が青色のサイトを参考にしました。

 

Let's play Nimmt! (misc)

Do you know Nimmt?

nc ys5441.tk 51608

難易度:easy

 

flag hash : e45e1e8037fc55588d45d3c96c3e156bbfe577a7a684848ddb087418867ccd09

 

Nimmtのルールはここから!

Play board games online from your browser • Board Game Arena

6枚目はダメ!定番カードゲーム「ニムト!(6 Nimmt!)【放課後さいころ倶楽部 第4話】 - 親子ボードゲームで楽しく学ぶ。

 

Sum Min and Sum Max (misc)

Tsubasa was interested in the method of calculating bowling scores. He wants to find the maximum and minimum game score for a limited number of strikes and spares in a game. However, he does not yet fully understand the score calculation. Please find the following instead of him.

flag is m1z0r3{(answer Q1)_ (answer Q2)}.

Q1: The sum of the minimum score in all possible combinations of number of strikes and number of spares in a game. In other words, the answer to Q1 is: (minimum value when there are 0 strikes and 0 spares) + (minimum value when there are 0 strikes and 1 spare) + ...

Q2 : The sum of the maximum score for all possible combinations of strikes and spares in a game, with the minimum value in Q1 being the maximum value. Note, however, that tsubasa does not like the word 'miss', so both questions require that you knock down at least one pin every time he throws a ball.

難易度:medium

 

flag hash : f53843cd76b3e6f4f6fffe9e54f7e3ca345f6ef07efb44d9ce916ee8a22345c2

 

 

 

writeupはこちらから!

 

 

partender810.hatenablog.com

 

 

感想を是非お待ちしております!!

 

それでは!

 

See you next time!