yoshikingのがんばる日記

あたまよくないけどがんばります

近状報告??

こんにちは.

このブログでは,今までイベントの時しか更新しなかったのですが,適当なことも更新してみます.

この前の更新は,SECCONにでた話でした. それからは,お正月ゴロゴロしたり,InterKosenCTFの運営だったり,nanoHardeningしたり,卒論を提出したりしました.

こんな感じのことをつらつら書いていきます.

InterKosenCTFやったよ!

1月18~20日にInterKosenCTFを開きました. 実は最初は参加者として出るつもりだったのですが, ふるちゅき (@theoldmoon0602) | Twitterptr-yudai (@ptrYudai) | Twitter からどうしても問題の情報を聞いてしまう(同じ研究室)ので運営になりました. といっても,まだ作問をする力が微塵もないので,問題のテスターとかペンギンの絵(デフォルトアイコン)をかいたりしました.

f:id:y05h1k1ng:20190215183218p:plain:w100

当日の運営も大したことはしてないです. ほかのメンバーは夜通し質問の対応などしてましたが,僕は遅くても深夜2時とかには寝てました. すいません...あんまり夜更かしは得意じゃないんです...

そんなこんなで,無事終えて,評価も上々で,なんもしてないけどハッピーでした. 成績優秀チームには商品があったのですが,それなりのお金が飛んで行ったのはアンハッピーでした.

あと,TokyoWesternsの人たちが出てたのは,びっくりしましたね. 唯一の全完チームで,チョー強かったです. ほかにも強い人がたくさん出ていて,うひゃーと思っていました.

今更ですけど,お疲れさまでした. 参加者の皆様や運営メンバーには感謝です.

運営メンバーの記録

こっちの方がきちんと書かれているよ

スラスト (@thrust2799) | TwitterInterKosenCTF の運営に参加しきれなかった話 (spaceship Write Up) - すらすと’s 生活の跡

ふるちゅき:InterKosenCTFを開催した - ふるつき

ptr-yudai:InterKosenCTFを開催しました - CTFするぞ

nanoHardeningを初めてやってきた

2月13日にセキュリティマイスター道場(SecDojo)が開催するnanoHardeningというプチHardeningをしてきました. Hardeningとは,サーバーが与えられて安全に運営する大会です(たぶん). 運営から攻撃が仕掛けられるので,webアプリケーションを落とされないよう頑張ります.

これもふるちゅきとptr-yudaiの3人で参加しました. 参加者は22~3人で,6チームで競いました.

結果から言うと1位でした(拍手)!!

僕がしたことは,アプリケーションが落ちていないか確認してました. ptr-yudaiが前に参加していたので,何をすればよいかはっきりしてました. また,僕は運用チェック,ptr-yudaiはログ解析,ふるちゅきはソース修正といった感じに担当を分けていて,それもよかったと思います. これは身内で固まったので,それぞれのできることが分かりきちんと担当を分けられました. ほとんどの参加者は始めましての状態のチームだったので,身内で固まったのは勝ちに行ってましたね...

よく置くファイルの場所とか全然しらないので,その辺の知識を付けないとなーと思います.

卒論提出したよ

つい最近,なんと最終版の卒論を出しました. うへぇー,大変だった.

このブログを書こうと思ったのも,これが大きな要因です. 卒論だすと,気持ちが軽いです!!

おわり

色々ありましたが,大体のイベントでは,僕の実力がよわよわじゃん!と思うことがほとんどですね. 頑張っていこうと思います.

これからは,セキュリティミニキャンプin福岡が近いです. とても楽しみです. あとは,せっかくの春休みですしバイトしようかなと思ってます. コーディング力とか上げたいです.

ブログにはCTFのwriteupとかイベントごとしか書かないかなと思ってましたが,適当に書いてみました. ここまで,読んだ方ありがとうございます!

ではでは

SECCON 2018 国内決勝 参加記

12/23にSECCON 国内決勝にinsecureとして出場しました. メンバーはtheoldmoon0602, thrust2799, ptr-yudaiと僕です. 結果は1191ptで5位でした.(←スゴイのでは...!!!)

f:id:y05h1k1ng:20181224232833j:plain

僕自身は今年の夏にCTFを始めた初心者なんですが,このような経験をさせてくれたチームメンバーには感謝です. 国内決勝が始まるまでは,難しくて手も出ずに終わると思っていたのですが,少々仕事をしたので書いていきます.

松島

途中から公開された問題です. ポーカーで遊べる問題で,フルハウスを出すと100pt,フォーカード以上で300ptがもらえます.

問題が公開されてから遊んでたらフルハウスがでて100ptいただきました. 運も実力のうちということで,功績にしておきます.

バイナリの解析はtheoldmoonとptr-yudaiに任せて,解法のめどが立つまで遊んでましたが結局フォーカードは出ませんでした. 具体的な解法は,ptr-yudaiのwriteupにかかれています. SECCON 2018 国内決勝に参加しました - CTFするぞ

この問題は,ただ遊び続けることでフォーカードを出したチームもいるみたいですね. 懇親会で作問者の方とお話しをしたんですが,「リアルカジノでフォーカードはでないよ!!リアルカジノ行ってみろ!!」って泣いてました.

天橋立(XSS HELL)

各チームがXSSの問題(alert('XSS')を呼ぶと正解)を投稿し,解きあう問題でした. 解かれずに残った問題のタイトルが5分おきにチェックされて,タイトルにチームトークンがあればそのチームにdefense pointが入る仕組みでした. この仕組みであることを理解するのに,時間がかかりました.

theoldmoon0602がハッシュを実装している間,ぎりぎりに問題を投稿して,点を取ろうとしましたが,defense flagの表示バグにより取れませんでした. 表示バグに関しては,thrustが解決策を見つけたため,割と序盤でdefense pointがもらえていました.

yharimaの方が作ったsha256スクリプトがほとんどのチームで使われてました. theoldmoon0602の独自スクリプトも途中で解かれて,2ptほど落としました. 誰が解いたんですかね?解いた方を観測していないです. 解かれた後はすぐにyharimaのスクリプトを拝借し,更新しました(すいません).

あと,独自で実装していたTeam Enuの問題も解かれていました. 懇親会の時に知ったのですが,yharimaの方が1時間ほどかけて解いたみたいです.

タイトルの自動更新スクリプトをうまく書けなかったので,最後まで手動で更新していました(よわい).

懇親会

ご飯おいしかったです. あと,オレンジジュースを死ぬほど飲みました.

始めに,yharimaのチームの方々とお話しをしてXSS周りの話が楽しかったです. 松島の作問者の方ともお話しをすることができました. 裏話(リアルカジノで大金を溶かした話とか)を聞けて面白かったです. st98プロともお話しできて,よかったです(文部科学大臣賞おめでとうございます!). 最後には親方ともお話ししてました. 宮島の問題は国際でも出されていたみたいですね.

感想

楽しかったです!!! 来年も参加できるように精進していきたいです.

懇親会でお世話になった方々とも,またどこかでお会いしたらよろしくお願いします.

最後になりましたが,運営の方々や参加者の皆様,お疲れさまでした. ありがとうございます.

チームメンバーのwriteup

theoldmoon0602 : furutsuki.hatenablog.com

thrust : thrust2799.hatenablog.jp

ptr-yudai : ptr-yudai.hatenablog.com

KOSEN セキュリティコンテスト 2018 writeup

初めに

insecure (theoldmoon0602, ptr-yudai, thrust2799, yoshiking)のyoshikingです.初CTF大会でした.喜ばしいことに優勝することができ,問題もいくつか解けたのでwriteupを書き公開します.

まったくの初心者だったので,ふるちゅき,ptr_yudaiに手取り足取り教えてもらいながら大会まで過ごしてた(雑魚すぎて,出ていいのか心配だった).Binary,Cryptoのそれなりに作業のいる問題なら解けるようにはなっていた.その他は100点問題がとれるか怪しいぐらい. 当日の役割としては,

  • 100点,200点の簡単な問題をする.
  • 1日目終了前に問題回収

があった.想定外なこととしては,

  • 100点で詰まる問題があったこと
  • 250,300点を解くことができたこと

であった.前者は精神的につらかったが,後者ほどうれしいものはない.わからない問題はslackで聞いたり,投げたりしてた(CTFやっててこれが楽しい). 結果Sampleを入れると,計9問・1050点取れた.            ↑うれしい↑

[Sample 100] Sample

問題文読んで書くだけ コピペのイメトレしたのに,自分で書くタイプで焦った. SCKOSEN{HEISEI}

[Binary 100] ログインしたい!

stringsで見るとダミーが入っているのがわかる. BinaryはIDAに投げる人なので,とりあえず投げてみると丁寧にコメント付きでフラグが書かれていた. SCKOSEN{P@SSW0RD!}

[Crypto 250] CMA

同一のnに対して異なるeを使って暗号化していることがわかる. これはCommon Modululs Attackの問題!! 1度やっていたのですぐに分かった.スクリプトを拾ってきてやるだけ.

import sys
import gmpy

def common_modulus_attack(c1, c2, e1, e2, n):
    gcd, s1, s2 = gmpy.gcdext(e1, e2)
    if s1 < 0:
        s1 = -s1
        c1 = gmpy.invert(c1, n)
    elif s2 < 0:
        s2 = -s2
        c2 = gmpy.invert(c2, n)
    v = pow(c1, s1, n)
    w = pow(c2, s2, n)
    m = (v * w) % n
    return m


if __name__ == '__main__':
    n = 697163747851313647585741051919071934545446813933803170069649318117710559741210942309828241413263057968917367783060498296976406236461105296155872343571465472571458861455067943431963600687028800873742137584796596162852671170321697375137596904939924266950341607689713670672118861922189869749313273790341949200887765536277607202964483007525837769344152685034136427995188789763316790283650418355485611911540613443291913015856221839541953433869506428199350315358438153142712432137030241041940194404554373526201816932093974336555692936225008805384205412065546229270153670267913485827127776342936704461533651887371495137078804092288438820479915530913133685413995201477157911998466715170295889089190163534335185024200648168611627442411240282585983100044974700889722041194576592581393367784749969933205292309980776102812865667772951149214877778939122394260160986401623585657051274220294040090019412172040635492538084358633197149142173638583232433297436812690635124286045064742069131774809951385200031432769100867496441664774312653371054082059690183370714830054453221456661636409939136078443635982854375609945486839364432796111524521897673385822201325354075200389425782052099305379822860801432433657644088520709280693673417006526206092542930693
    e1 = 28403731
    e2 = 17150467

    #m = long(sys.argv[1])
    c1 = 356570759721166632854477278136799769492343774718439393193117041958287753557806400469740119600912444471121902469051737507634649973684992907421275845928357480837967204554088377730592973371461640845998778351602473613321498651731821845302151273084971224273919757029367585943268081303597349083018680088246668756520417644436194270614866936538244276510376182333795743199343849396915141369807021966264988584828864056008833401505714143397103523465182025513664272858386121988541325005026429639663742091030924985561148699137540555122356726817211341134736753357393808849095516976817586308844713289098537749192345758473823827509850497061989710557199001358459265390635376010604140991653777868568674113486103285794018233006577917206881034620106651544317119711055161893664457852905424982102754338070105734468236013581966640100258303195145669292904518034140213634639091769696481494825204998756719477488782589658443127751934619249004503187492247836069895615545526963774623546554267330467769806735640763462197407817166248860338588483389322089500631811886698267849923510602086439495468328324214070248032200162537433610668578321215695335281853976740430016175221699089098481172034255657391707404351888360402839834243393219733520928567848871537851592051426
    c2 = 575669665394963010438730844982706572279940953775084248493601352360353309463275817992767774795096407449419307507851144274577099379018722595834759584704006210908691450019272337607837959554493442466861874815821863073107471255902560481117004800315377873346287001444012552513063060796973028053013198499075430428452043304001191963057019440616815261548859525344231653286940357861588916952568607246006604702921318217575792576131436784963000249683695410291596075586154404188340172352441795237607740139409951995478116830822121083558308839245131140182773648330192322781141945473918170059521013325445190105385074502168806722940697164735139327947024502146556639414077407288877676048797361313676919317108174952942797955152717288281437971632282265010292963726153425441787656528527218493771925055052819889303710037993913193139749174960393128306067334527665804381704806070824786160213833105655536689787789552021836106110140198210399516241831181759041647693498251693612072390279270182844839334010795635506069552968998283558623684235164319889076092996389488377136513116055439381428605713467948520990739117352288882824718186997747849925566388008159205097327659787362273526326331055816821724603964108517089642955453424633029933595047255845252090385141400

    #print m
    m =  common_modulus_attack(c1, c2, e1, e2, n)
    print hex(m)[2:].decode('hex')

[Crypto 300] RSA?

冪乗のない世界らしい n, e, cがもらえる.

300は無理だろうと手を出さずにCrypto200の旅行の写真をやっていたが,となりのスラスト君に聞かれて手を出したら案外解けた. スラスト君が冪乗じゃないなら乗算ではと言っていたのをもと計算してみた.


c=m*e \bmod{n}

m=c*d  \bmod{n}

ここからmが欲しいので非常に簡単な計算である.上の式をeで割ってやると


m = c *e^{-1} \bmod{n}

となるので,mは簡単に求まる. pythonインタープリタでやるのみ

>>> (n, e) = (746149315120445105644911779735002615257864427638948809430146775899763900845401478319781237412694334410613686368021055483040278357991481684487813129494944899522460397699493087246505218096960286204364461639918177320793843718724747574381859928496072509749639870292090503328557688115529251888351927498428567126853657063832878452773780418783149866919316163560203180423276894765325460041738451797385343149303272504850808939009366426995340204717301911359661640524141292447180118808883848024348018576236114084330353144353115672904820149103681022683146560799116848906807498625698939954475819479000937838859292276566046219449122782347075051511004009561691484747596362940386608213329221089677679229620860810111092211338341215804260360529582967128623164620534814690277276443932913145186024258511492440354889009304938979173562941458331119511296138076261503871542382962671556195928643434506282416038086486816450594938254170549974935406839221438655021923764949572023494832426904174630809785240917462806646302389526945618245684059655484996935724994381587851879888451272335891503968849596157334527192713715105054266039301159419016747298458532769985135446278269957364121043506362499497443274900182869320930776855669486054000707293632271709427175565301,825821)
>>> n
746149315120445105644911779735002615257864427638948809430146775899763900845401478319781237412694334410613686368021055483040278357991481684487813129494944899522460397699493087246505218096960286204364461639918177320793843718724747574381859928496072509749639870292090503328557688115529251888351927498428567126853657063832878452773780418783149866919316163560203180423276894765325460041738451797385343149303272504850808939009366426995340204717301911359661640524141292447180118808883848024348018576236114084330353144353115672904820149103681022683146560799116848906807498625698939954475819479000937838859292276566046219449122782347075051511004009561691484747596362940386608213329221089677679229620860810111092211338341215804260360529582967128623164620534814690277276443932913145186024258511492440354889009304938979173562941458331119511296138076261503871542382962671556195928643434506282416038086486816450594938254170549974935406839221438655021923764949572023494832426904174630809785240917462806646302389526945618245684059655484996935724994381587851879888451272335891503968849596157334527192713715105054266039301159419016747298458532769985135446278269957364121043506362499497443274900182869320930776855669486054000707293632271709427175565301L
>>> e
825821
>>> c = 34196057544535966582914714160221953732017949669815971420694645835609518260754242418191180642793
>>> m = c / e
>>> c % e
0L
>>> m
41408558930489738796803077374179094176604796523479024414122002026600823012195430266596733L
>>> hex(m)
'0x53434b4f53454e7b457874656e6465645f4575636c696465406e5f406c6730726974686d7dL'
>>> hex(m)[2:-1]
'53434b4f53454e7b457874656e6465645f4575636c696465406e5f406c6730726974686d7d'
>>> from binascii import hexlify
>>> from binascii import unhexlify
>>> unhexlify(hex(m)[2:-1])
'SCKOSEN{Extended_Euclide@n_@lg0rithm}'

pythonの[:]で文字の抽出できるの強い. CMAと同じように.decode('hex')したいけど怒られる(無知). 何とかして変換する.

SCKOSEN{Extended_Euclide@n_@lg0rithm}

感想

本当に楽しい2日間でした.ここまで,教えてくれたチームメイトに感謝です. また,運営の方々や先生方ありがとうございました.

次はSECCON!!!!頑張ります.

チームメイトのWriteup

furutsuki.hatenablog.com

ptr-yudai.hatenablog.com

thrust2799.hatenablog.jp

SECCON Beginners 2018 名古屋 参加記兼Writeup

追記

 Crypto 300 Find primes と Rev 200 Disassemle it.のwriteupを詳しく書きました.プロに感謝.協力:ptr-yudai

twitter.com

 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

 2018年11月24日にSECCON Beginnersに参加しました.現地で開かれるイベントに1人で参加するのは,初めてで緊張しました.当日の内容としては,

  • CTFとは
  • Crypto講義
  • Web講義
  • Reversing講義
  • CTF演習
  • 交流会

となっていました.各講義が1時間ずつあり,CTF演習が1時間半でした.

 以下,時系列+Writeupです.

 7時前の高速バスに乗り,名古屋へ向かいました.バスは非常に空いていて快適でした.朝ごはんを食べたり,映画(銀魂)を見たりしていました.銀魂面白い...

 9時半には名古屋駅についていました.大体1時間は暇をするのですが,カフェに入るわけでもなく名古屋駅をウロチョロしてました.

  10時15分から45分までに会場入りだったので,30分に入ったら7,8割の方がすでに着いていたので驚きました.一番前の登壇者に近いところの席で,謎の緊張をしてました.

CTFとは

 「CTFってこんなの!」だったり「セキュリティに関わるとは」でした.

Crypto講義

 いよいよ講義です!最初の講義はWebの予定だったのですが,環境の不具合でCryptoが1番手でした.

 数学的な事象やRSAについてやりました.CryptoからCTFを始めた人間なので,この辺はeasyでしたね.最後の方にでてきた,数学的に脆弱な話は非常に勉強になりました.

 ここでお昼休憩です.味噌カツをたべました.カツが柔らかくてとても美味しかったです.ご飯を食べた後名古屋テレビ塔を見たんですが,案外歩いていてWeb講義3分前に会場入りしました.早歩きして暑いし,会場自体も暑くてくたくたでした.

Web講義

 主にXSSについてやりました.WebはSQLインジェクションを知っている(できるわけではない)程度なので学ぶことが非常に多かったです.

 実際に用意していただいたWebサイトに攻撃する演習が3つあったので,非常に楽しく学ばせてもらいました.

Reversing講義

  親方と呼ばれる講師の方がすごくおもしろかったです.独特の進め方やあふれ出る優しさがありました.

 講義内容としては,アセンブリを書いたり,読んだりしました.アセンブリを読むことはこれまでCTFをやっていると当然あるんですが,書くのは初めてで新鮮でした.x86だとレジスタの名前を覚えたりしないといけないので,そのあたりがツライという感じです.

CTF演習

 ついにCTF!演習です.まってました.時間が予定より15分すぎているらしく,1時間15分間の演習になりました.

 問題構成としては

  • Misc 2問
  • Web 4問
  • Crypto 4問
  • Reversing 3問

でした.(たぶん)

 先ほどにも述べたようにCrypto始まり人間なので,Cryptoから解きました.3問はすぐに通せました.競技中多分僕のことだと思うのですが,運営の方がCryptoから解くのは珍しいとおっしゃているのを聞きました.

 そのあと,Misc1問(もう1問はWelcomなので最初に通しました),Web2問,Reversing2問を通しました.残り15分くらいで最後のCryptoを取り掛かりましたが,間に合いませんでした.

 結果,1300点で2位でした(歓喜).とてもうれしいですが,1位の方も1300点で悔しい面もあります.1~3位にはTシャツがプレゼントされたので賞品ゲットです.

f:id:y05h1k1ng:20181125220854j:plain

交流会

  こういった場は初めてで,だれに話しかけるでもなくお菓子を食べていました(コミュ障).幸運にも話しかけてくださった方とお話ししてました.お仕事をされている方で,学生以外の方とお話しするのは新鮮でとても楽しかったです.こういう場で色々な人とお話しできる人スゴイ!という感想です.

 名古屋駅で迷子になりつつ,ハンバーグを食べました.帰りは新幹線で快適でした.

 

Writeup

 記憶の限り書きます.タイトルは適当だったりしなかったりします.点数も保証できないです.

Misc 100 welcom問題

 生存確認ですね.flagを入力します.

Misc 200 てけいさん問題

 Webブラウザ上で100問簡単な計算をすれば,flagが手に入ります.スクリプトを書いてやる方法と自力でやる方法があります.僕は後者でした.

Web 100 do alert

 入力フォームがあるサイトだったと思います.XSS脆弱性があるのはわかったのですが,cookieを抜いてもソースを読んでもわからなくてとても焦りました.時間がないので一回問題を離れてから,また戻ると題名を見てalertを呼ぶことに気づきました.alertを呼ぶとflagが書いてあります.

Web 200 ACカンパニー

 講義で行ったのと同様に,自分のサーバーにcookieが付いた情報を送らせるとflagがわかります.

Web 200 AOカンパニー(ACとAO逆かも)(未正解)

 こちらは,ACの強化版で<script>タグがはじかれます.tagの制限ですね.それを避けるために,<body onload = hoge>を使って送ったり,<ScRipt>など大文字を使って認識させる方法があるようです.

Web 200 難しいやつ(未正解)

 これもscriptが効かないやつです.こちらはCSPによる制限だと思うのですが,解説をわすれました.

Crypto 100 計算問題

 pythonとかで計算すれば終わりです.ctf4b{計算結果}です.

Crypto 100 素因数分解問題

 大きな数が与えられ,因数分解したものを足したものがflagになります.僕は素因数分解をするとき,Wolfram|Alphaに投げます.数字を入れたら,factor欄にでてきます.

www.wolframalpha.com

Crypto 200 RSA問題

 p, q, n, e, cが与えられたと思います.φ(n) = (p - 1)*(q - 1)から求め,e*d=1(mod φ(n))より拡張ユークリッド互除法でdを求めます.最後にm = c ^ d mod n を計算すればmが求まるので,整数型から文字列に変換するとflagを得ることができます.

Crypto 300 RSA問題2(未正解)

 problem.txtとgenerate.pyが渡されます.ploblem.txtには10個(n, c)の組がかかれています.generate.pyでは,まずpとqを10回生成していると思いきやqは9回しか生成されておらず,q[9]にp[0]が入っているようです.

 しかし,それぞれのp, qの配列はシャッフルされているため,どのnの組が脆弱なのかわからないです.そのため,gcd(n_i, n_j) != 1 となる組を見つけて,片方の素数を求めます.そうすると,もう片方はnから割ると当然出てきます.

 ここまですると,p, q, n, e, cを持っているので,前問と同様に計算するとflagが手に入ります.

 解答例です.

(n0, c0)=(16957289914746280840429335573760118821785565382213284245632721162928100428392604680974776835738982243384696559883457403297360690405038981254461282859278400801935964943065535069527216743323521359577441744303884868733140345776399073546832581113742237088777300141881218791557310027358774446073633381331075564114385765953105644267630467032666923067692353823082305107820487257208482092559748829831030082077587590885393631430881219085475948747507830969893106951288170365944945373349763319585902213789630527474439091673161053730922403260419075804847896878855848773961267747082464363244631388565628356625806218546952317975359L, 989496307816835299715675382269217554554750037155652211046696144689979610475302652070679352630051091287563830286989708337827721167862798381874858366078984107554814064581771163372811968926481822450183326085870027514703185765368603386859280601791864370360095600753682967708568872624772560488214723111323040449164237065974133990559688878663652422064124347842724767688643198816463464048580172113248673164090282823286256986748899244034955501232255565075349480205999564221782792789241218302288664919155766179746923479463557900153950838281522000118046699546038964684261892008980220968961401888434200709467050214841922267342L)
(n1, c1)=(25819015400471124982210706137027240241034073735719233521746358314058985289034874446714533967126325292495086425927855598359464190292249468101762380719215280737734720674924038277986566542315402569905190890841332354741243483697760716173424707757657737683496080271448513262278216039950583067129289848595931859281859813892945450874460027645945668222085356540252991357883967546399114983517507442494735759172325570265137413739575395644450737710010338270743965138167956435652597946525045311746540900109007792727554733757235877245500471509921939879409394449524796683291354028478119948884689018875477786297487926821020709652397L, 13127788382623510648415146731299041208586843754120533597374417213630513109692206166578127103783257489307141090324517589312609661592161185919005712225449506028261962715289627940484933133448253801510028158840989459313213191740238139777757489929655968835694505406211570867367602892158887482188633298008900810555580898765590922439053707545495224807907279656915697114947355406656751870421597360341737406678431317067284888791826815111752799324956297497778985809864104642043267200340341506610652872499424702817137562863651142986000686034636397791353408141153026931105554284255519638968660052225074393834555801212955490082450L)
(n2, c2)=(23203514436239386141884720808951888606243429254418529685411124599189790670515750636981772606252925469026142674382148624921977894267006031492038153725489876962403180371473102530102732599653989201101910451173626525262021510742483000431313391431411389217949450701194799706943650674879814926160972152842487844095947738084961383398977224634488523329920497781757661425124260607004266320389214826410788340421934149343160673898878401828315023436893415970661781909813540223355786068382291673103798099913917541672200530219362247882103018247007666297106535132966052056660371881554314640924323417090740930552878117330055763533961L, 10641876953514494363551365488914263576588859578224118582010329856969670782205947350332340630609455117095461657997138155352385701347202338478420098239900105535084531626029893016140334363672567686504771708982888684340529755427706617414673068132495859361216975564167820421835597772595449178648016931188305573541002413800977713752784586950267879696000170572444615986634865896739814073627224781642998021099369930740049800949061107309656150548892166959729071353329416262316064864847178125325367790081174657678979091199289266270020110158559403638369050036498811722833582681635181135436986622103598208970781207235420837980907L)
(n3, c3)=(10739951406376888453373595970368895939085518556205122504389142190571425259444274592331872479720965685648625081498621932585373200499737563820590549310514639541806343465399409084152047631302544536980138481104560487079306026439790265075511517430596491586078474107275700095834847896378307454215376396816620222961081268324588503919856635255734001567619205101469255529221538748141184929222665709301706487875256307507619873969921043772676874433291553409269916957326836575434550248677901201933067640816803771441333891062618666777214848819625426582383353352434374962850201397226137561440111051998895431073038084812273716922811L, 2633046605858973272874866190097783850037495187205339799541884286769006185811450931575659592563094341209541520094949041023251402890919630456837060602406561305055003196334606479136828052517261166856664201159399411487951193906572951215455011025998723832294339475217866953983851405164142791552324159396973412582523341489403603019210587219695283713411638136003429055460337373150224221051813868693197712413768776054318269601743436333981777598309182576209354514607094235587240235598804149828505812708502294390903332575993239866228126610163137626196298704625893474301338483386584378947624663990975601899273807093780907078440L)
(n4, c4)=(23043732782117171630504708066652580255218223285448736233862004767031157022551029154681706702125359570979053589966288568147369143238350600727125383566604003992432734057654837880509412011222450545247301765662852703278605858799500120181940669157998775200987850861633095219330626857925428568624843350296428538676821930664566049943759458135007962210965211948761167701037891271584142129264784270709840407713311092651444829407164416664078136309932669292184170151602380897989115302984322987343494406138530454028689978574364097315219357666767922579067233606583648048683549795206385992488922265831460451790821616659846429700097L, 10931689448179385708865903970431824622910408534551486240528327574135559158224843160260948287295698847939527662244523122042301217080514591388395954667214774291407107946582378130795255620946976226304591512953162166181391636002635439777598863504199372489230413578784684949780658915513875430511187072911172614252818530304720307055733909607695985967036925947763941546971353835032853461514298328399199655444734385735529012833771237905941917077719268712001826275189787057057669994951439667526134943796382299141740230144424308066685999601362036305710162576518195085111656147413407884458205613676049692677459784703620650152471L)
(n5, c5)=(25777285952415632797722200624855349231711905041729390542578955040759603563031114437847761134678204601414885198013702958635493993228088047080858349744842636260416468840278495124107197201549084913780959037605003845440472903883929158116317300427301965628531731206534486043482800267466877536858724268011217307084000780182441466363880218141787846169154661036901521611866302250600719633568220722801376686209732840817116137137130038418418064400566160300175483555442400343996428568055898751213408840547534547753283781655182434550784692589168222361194293702020337885787384629690560111437398514600367018904403519880456644034169L, 15183347436255901172653444093654882241645656514117218122542616493404371019354653544001395461721777039431568306857095968428356120138692862075597863788318985927150690557422696660084914455912193118819396553111650849949963997837817382499028321988091991392880370364375528085339524728224588626945295988475311679748574092758434178309894577982855925882505073968191884699772921404192762546347829387518804350010665361529311329497508454311036153242338463623480060686327850022208891482240144426465107674826156779127590013508867255003106297824561203826033205802386489368434203217516897661621187389939204863196206760024006254388067L)
(n6, c6)=(25912551492128156147424983618616156346139568635430022756713579587236722029807121299834484950340996778306546184870069782092781016105665660669268258756146089200513739448525652869408721930260865665024055512790707742997778322231541841387842142188780356531780895420647776940980830323173740724124781947544205990773922794994948988416016045318076754309213677359774482673570907482176977232232331290374566297579564094941783569735538467742671097814325839374289768538115075903520579034674800462143745613339123820537961817134922930955929878654632558096505557548631217302515944743129546652695383043714244335283990194344555433636461L, 6381149824243576246890596785075416932683725948858576484067870674313111356325130408760677718441060758865213666368538356410986126703634106749349433777510811035082265918729356278352841467795590132534468683624965386472121647576194710370670174025746210297431039904090967816394489446692517443313718267612343242855544892046383842322881842714780445278902664144950947144415540918697005310966739098328879069341489427128843704406618009532505040978366427273781348062822695917372581563531068758642268285592241448089079572452002228321902749728314336473495793303096257984852066069320324024349387123571725305504436724711917115280649L)
(n7, c7)=(21013660901328555043521892792726651630068448385756476629816519420928433901730090580343554254274168571933388305497612434195000868523920406256313599983682561540017371088759906332553564219030895826246325583925604282795339474818299487154027610195272661988356377217782373882455277677391509593571426025897618129780846958063335043808591446148681825299724751076008357827596098669027806852710726041529831287337124143459246409522830466428747770709211046536439546680919050446699917111932099469390371405669108004066848377019555240530444890067208306495608325909125477765667794012345800146833739920404614906377032006467252942125603L, 1849156339349334458556115274502451542686762682819003504705355377307795849959448204078225194210128922868787714956418522426062832090894302335316689929794139091123790764794799306571369932642297573448593386107812879842257412104310703564927345672616715385636458142445648015609759384847101204473577140207885695901323512579167246851942376987598364032766976828242852972171527224198222854593513209074869849197880531016290408862415598257373349750252531968686340915352891646111117012186735253060837509320091457970192514842131226697076052431817247577597741883558886386389856358783734602676213819395453918999498362625917535755481L)
(n8, c8)=(16801342853472832654711980645231823148067315040411930949916494002684835382717880961363166802206132221902622084077414315582387845677254836788807095590297321070183172414136355330110354516092197064511155106321020685125588233867014456208514615197539193317057385330657135329226978886894446596315998262329794632126040848757972673716252823371503738773461533670159914306494605735712429908857205570754091468034866126596140982379338036684520598151403446040786061115272680592563913885831984455299062850127724715770797588349561522498930428214511087789809823067766558950508466995179010477526194016484537536320684202524625272155923L, 7080129942159770057281566853545462783037000574338249170868417773457390228448426701506830324609510093809471683351544389812490139975659276659157784814857132828437101098119329461906501274651877753583096657904010005436183296037802539551761564411427131944432752690309853958839597663534522187280194032127628116190309253788696092922662486229913123506240488361832534461510064118636739021591186252079477360673677357507882296220783822169894483476114654305767388453794217331816566829860331366657726840728655926006224917075382941339207511396075849283564737465470464399767222443871436659178760728352758432083060975224160789642701L)
(n9, c9)=(16662809244691807937337192862982248939964810620293386418947298459896349257827712550356255343917283628498553091541944868052019843944145196517960523005290045554686345748727111518764032304894423859134002071909020999644048665484557322406119183093004397760676236872628175310528585349317181338926446117810946069447747918050061094770298804519161422806402843209223054885149187389037090405718819096986535117457348643541750918579470281133938864966217602627229911010215560071369339728185019808670758037809765739181833747772679059056437265018722439379766802278614058826362862184348844023997364797626443444801041293284265790353011L, 9452829040785942453564770029265291960343587652422164259351490417519161892568291556129273171643404623607539641074829341727673487585898909197266622432245581213734777758036815430612775129434853441238480023232235232680447159369793995589805936194256148863132520006914366707039886303383598942879552730954690038898216709177036259063976039358953957462417318766651629331941709689012438085650782602411300337915265082167837842323841584539930625242640648631590345418736979670621849725873322650068775429769932957236524804566078294718457722084994915092537371846014564919740676779009989537219942052485900134760882271732962796826887L)

e = 65537
n = [n0, n1, n2, n3, n4, n5, n6, n7, n8, n9]
c = [c0, c1, c2, c3, c4, c5, c6, c7, c8, c9]

def xgcd(b, a):
    x0, x1, y0, y1 = 1, 0, 0, 1
    while a != 0:
        q, b, a = b // a, a, b % a
        x0, x1 = x1, x0 - q * x1
        y0, y1 = y1, y0 - q * y1
    return b, x0, y0

def gcd(a, b):
    if a < b: a, b = b, a
    while b != 0:
        c = a % b
        a, b = b, c
    return a

for i in range(10):
    for j in range(10):
        if(i >= j):
            continue
        print '------------------n{0}, n{1}-----------------'.format(i, j)
        p = gcd(n[i], n[j])
        if(p != 1):
            print('find p!')
            q = n[i] / p
            if((q == 1)or(p == 1)):
                continue
            phi = (q-1) * (p-1)
            _, d, _ = xgcd(e, phi)
            d = d % phi
            m = pow(c[i], d, n[i])
            print(hex(m)[2:-1].decode('hex'))

            break
    if(p != 1):
        break
        

ctf4b{GCD_IS_GOD}

 はてな初心者で見たまま編集なので,ソースコードが見にくいです.すいません.Markdownに初めからすればよかった...

 

Rev 100 bin1 (bin~は問題ファイル名で題名ではないです)

 stringsとgrepすればでてきました.

Rev 200 bin2

 IDAで解析しました.何やら配列に文字コードらしきものが1文字ずつ入っていたので,1文字ずつデコードしながらルーズリーフに書きました.

Rev 200 bin3(未正解)

 IDAで解析すると,処理が非常に分かりやすかったです.gdbで解析している方がいてプロ!!という感じでした.

 ファイルを実行すると入力を求められ,「SECCON」と入力すると正解でそれをとてつもない回数行うとflagがでるようです.3つの方法をプロ(ptr-yudai @ptrYudai)から教わったので,書きます.

 0x7FF回まわしているので,python -c 'print("SECCON\n" * 0x7FF)' | ./bin3でflagがでます.この方法はstack overflowで使ったことがあるので,悲しいです.

 pwntoolsを使った方法もあります.僕は解説時にこの方法で一瞬でとけるじゃんと思ったのですが,前の方法が一番簡単ですね.recvuntilで行儀よく書こうと思ったんですが,バイナリがsetbufをしていないとpwntoolsでは出力を受け取れないみたいです.


    from pwn import *
    
    p = process("./bin3")
    for i in xrange(0x800):
        p.sendline("SECCON")
    p.interactive()

 最後に一番驚いた解法は,内部の処理を解析して実装する方法です.flagの出力はrbp+var_D8が出力されています.SECCONと入力してあっていれば,var_D8にカウンタ分足しています.また,var_D8の初期値は2です.これをコードに書くと,


    flag = 2
    cnt = 0
    
    while cnt <= 0x7FF:
        flag += cnt
        cnt += 1
    
    print("ctf4b{" + str(flag) + "}")

 

 ctf4b{2096130}でした.非常に面白い問題でした.

感想

 初1人CTFだったのですが,2位になれてよかったです.自信にもなりました.しかし,反省点も多いです.Miscのてけいさんやrev bin2はもっと素早く解く方法があったので確実に実力不足でした.

 あとは,一通り解いた後残り15分で1問というときに,rev bin3をやってもよかったなと思います.解説の時に初めて見たんですけどIDAだと処理がすぐに分かったので,解けたかなと後悔してます.実際には,Cryptoの最後を解いたんですけど,間に合わなかったです.うーんくやしい.

 やっぱり,素早く解ける問題に時間をかけたのが元凶ですね.精進します.

 最後に,運営の皆様,参加者の皆様,ありがとうございました.楽しかったです.beginnersにまた参加して今度は1位といいたいところですが,今回2位のやつが次回も参加するのは...という気持ちです.また,何かの機会に再びお会いできれば幸いです.ありがとうございました.