yoshikingのがんばる日記

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

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位のやつが次回も参加するのは...という気持ちです.また,何かの機会に再びお会いできれば幸いです.ありがとうございました.