飽きっぽくすぐ他のことをしてしまうので、忘れないため・形にして頭に残すための備忘録。2019、手を付けてみたけど解けなかった問題や、新しく手を付けてみた問題の復習メモです。6/9(日)まで設けられているので、今からでもまだ間に合いますよ!競技時間中に解いた問題のwrite-upはこちら。kusuwada.hatenablog.com競技時間中に全完されている方のwrite-upもあったので、色んなwrite-upを参考にさせていただきました。いうツールを初めて使ってみたのですが、これ知ってればよかったなーという感じ。基礎部分の理解は別途したほうが良いけれども、とにかく早くシンプルな問題を解きたいときは、とても有効。flag!!https://score.beginners.seccon.jp/files/fc23f13bcf6562e540ed81d1f47710af_dump指定のurlにアクセスすると、またファイルが貰えます。wiresharkで開いてみます。なんと3000行もあります...!まず全部見るのは置いておいて、ちょっと文字列だけ取り出して怪しいところがないか探してみます。HTTP/1.122行目にあります。同じhttpプロトコルで通信している応答を探してみると、最後の方にありました。(text/html)ここでchunkで返ってきているhexdumpを拾い集めて、1ファイルにして出力してやると、なんか画像とか出てこないかなー?ということでやってみます。hexdumpの仕様理解のために下記を確認。@ITこの辺を参考に。ファイルを、1バイト単位、0埋め3桁の8進数+ブランクで出力、16回出力毎に改行する。これをバイナリとして書き出してみます。f.write(output)競技中に書いたスクリプトが上記。これ出てきたファイル、fileコマンドで見てみてもdataとしか表示されず。競技が終わって冷静にコードを見てみたら、これpython2の書き方じゃ。書かないといけないんじゃった。Qiita何度も参照している記事なのに...。T)ということで書き直したら無事、gzipファイルが生成されました。798720gzip形式だそうです!gzip形式として解凍すると今度はtarだと言われたので、更にtar形式で解凍します。Leakagehttps://score.beginners.seccon.jp/files/leakage_80a8c3c2bd63254a033ea21093944b1e.tar.gztarファイルが貰えたので解凍します。leakageという名前の実行ファイルをゲットしました。stripped試しに実行してみます。flagwrong引数を一つ取るそうです。radare2で解析してみます。variablesまずは使われている関数の一覧を確認し、mainの中身を確認します。出して終了するコードのようです。関数の中身を確認します。retこんな気になる文言が。encodeの方法は解読できていませんが、encode後のバイト列が入手できました。なってくれると嬉しいのですが。34こことマッチしているようですし、きっと34文字のflagに違いない。この34要素のリスト、xorをとったりshiftしたりしてみたけど、flagは出てこなかった。その先のsym.convert関数の処理が理解できれば解読できそうだったが、これを真面目に読むのは無理...。いうところで競技終了。他の方のwrite-upを読んで、動的に動かしながら解析するのが良いということがわかる。その中でも、ちゃちゃっと手早く解いた人達が使っているツールがangr。gdbのdebug機能を使ってやるのが勉強になる気がするけど、一人チームでCTFするにはちゃっと答えにたどり着けるツール情報も欲しい!ということで入れてみました。実は競技中もangrというワードはTwitter上で何度か見かけたので、復習時に見てみようと思っていたのでした。kanataさんのブログ記事でAngrについて「ほうほう」する。cat公式ページはこちら。claripy、こちらも試してみました。solvers.Usageもとてもシンプル。(0x882b0))b'ctf4b{le4k1ng_th3_f1ag_0ne_by_0ne}'これはいい・・・。これを使って解ける問題があったらしく、今後もかなり使えそう。Operationhttps://score.beginners.seccon.jp/files/linear_operation_a45530bbfc995ac99f30e026276674aa.tar.gzDLしたtarファイルを解凍すると、実行ファイルが出てきます。stripped実行してみます。radare2で解析してmain関数を見てみます。関数が大きすぎるらしくpdfコマンドでは見れない。代わりにpdrコマンドにしてちょ、と言われたので一応pdrコマンドで見てみたけど、人力解析する気をなくす長さ。使ってみたので、今回も引き続き使ってみます。(0x4005b1))b'ctf4b{5ymbol1c_3xecuti0n_1s_3ffect1ve_4ga1nst_l1n34r_0p3r4ti0n}'凄い。VM上でも4~5分で解けました。shellcoder途中からwarmupに変更になりました。20000入手したファイルは下記。stripped実行してみます。答えると怒られました。そんな変な文字使ってないんだけどな...。radare2で解析してみます。retなにやらbinshの文字列が見えます。これらの文字が入っていたらexitしてしまうようです。動かしてみて、Pwnの分野はpicoCTFにもなかったし「あまり解いてないなー」と放置していました。分野として出されていたっぽい。他の方のwrite-upを見てみると、なんとshellcodeを投げるとそのまま実行してくれたっぽい。いう文字列は使ってはいけないようです。実行ファイルの詳細を確認してみます。使えそうなshellcodeを探します。呼んだり、下記のようにページ内ワード検索で探しました。bytes以下のもので、binshの文字列がそのまま使われていないものを探します。今回はこちらのshellcodeが刺さりました。RSANだけなくしちゃったんだよなあ......。1337指定のサーバーに接続してみると、こんなのが出てきました。3246914397805984625089274034689097404626310943025860396127701658909512577669514664108630471844355750327164896341754712339996304322183994272592515057036982712509993468585150053739578221129634295335156008826646739783998613552816135149250751248457932543995048264634859702233101213624411123860565127483614505789936131097481582250280879883345717399260890559456693933197989248325942651641020812875856881085952684919373866250212831032592940854889972412169066460390028956648027648499201166953687232091133712983765570352801518662259212852804103694341950383858692240162079647626761015691553176471163587025139488215942149755954>何度か接続すると、そのたびに値が変わっているようです。16087737852679312943082579835574267808917098806166146477948390268311314495869597423139948769106893126211785455585840045916997202991917816782009212071321188120477266362607143640897212583925382246510294776980026710351920267715931578194642023066397300876433658336889193765162600728946506435849363159642338980333994545078796172371936842606384482259907112157726395098506280477904550192887364445098761849892453797359385715431531790060566968921040064078183374383999248626630815628933033564305381770162764154584360672510344097760176520813698801283104772684880144679500756733022628334968091288327601447320734125462521591796548>うーん、同じ平文mを異なるn1,n2,n3...で暗号化した暗号文c1,c2,c3...が得られているように見えるけど、nが与えられていないので、この条件だけでは厳しそう...。言えば最後、入力を求められているみたいなのでとりあえずEnter押してみます。17774810458571819467407763534846886965125517620396752931987750586426233720474536163034444932683783275869186318153195553816327509687354147300626845609662008894163150857079915178559820997234799801110496236843148336683137172848754208947320772000483006491556383278220075917393168418168899651059656373280723475427878763784266772317887251461857427950690144731432336023815705594595042004445467248298662607486419945921855858360071081134757821546305835537621313968950487786802983378272025237082009698923450089406819342358956698666226738949627627244652365877271549472071468662405248411352675107008230937961052036677926234100773おお。dを教えてくれました。うーん、これだけではわからん。ペアが複数わかることで何か解決する方法があるのだろうか??と「うーん?うーん?」しているうちに競技終了。他の方のwrite-upを読んでみると、他にもこちらの入力次第で色々返してくれるらしい...!色々つついて試さないと駄目だな。他の数値を入れていくと、1度の接続で3回まで試せますが、同じ接続では同じ値が返ってきました。783287662953421896822862713600395667991106305787806108558680505591530212731687573913653285500600751077250434477673605414913851550315982987952811144266797316490390223541368430502905157951886546000168953155282179519527731714834040527669327910723463315419376643719872949033550773409733901177484687388309935922248447862520286102115194478764273931229117968114605517339250149607822994519099927186843924399998446822343658774938241947831643260535148891310529619210517645720569176289091900001062954443920818615357242610813195984147890619767707360647612044982953871898768383598276447280170831336187916836966635271071291258113ここで、この値が何を返しているかがぱっとわかればよいのですが、これは未だにどうやったらわかるのかはわかっていない。返ってきている可能性がある。すると、の値が返ってきていたようです。いう同じ約数を持っていることになります。