SECCON2017WritesUP

12/9-10に開催されたSECCONに参加したのでWritesUPを記載します
今回は過去最高の4問が回答できた

# RunMe
以下のPythonコードが与えられる

```py
import sys
sys.setrecursionlimit(99999)
def f(n):
    return n if n < 2 else f(n-2) + f(n-1)
print "SECCON{" + str(f(11011))[:32] + "}"
```

fに数を代入していくと
f(8)=21,f(7)=13となるのでフィボナッチ数列の計算を行うプログラムとわかる。
但し、このまま実行しても再帰に時間がかかり答えが返ってこないので
以下の形式に変換すると回答できた

```py
def fib(n):
    a, b=0, 1
    for i in range(n):
        a, b = b, a+b
    return a
```

**FLAG**
**SECCON{65076140832331717667772761541872}**
ちなみにフィボナッチ数を計算するだけなので以下のサイトで計算するのも手
http://keisan.casio.jp/exec/system/1161228773

# Putchar Music
C言語のコードが渡され、映画のタイトルを答えろとの問題
コード自体は、何かを生成し続けるものに見えたが特に映画につながるヒントがなく
「one line of C program 、music」で検索すると以下の動画見つかる
https://www.youtube.com/watch?v=L9KLnN0GczI

動画内のコメント文を参照すると音が出ると分かったので
早速やってみる （音声ファイルをリダイレクトすることで音を出す仕組み）
gcc sig2.c -o sig2;a.out>/dev/audio
但し、動画内の方法で音を出すためには最近のLinuxに搭載されている
ASLRでは無理なのでOSSが搭載されている古いOSを利用する
（今回は以下のぺージを参照したので、CentOS6.5)
http://hidefumi-h.blog.so-net.ne.jp/2014-05-09

上記で設定するとテーマソングが流れるので回答できる
**FLAG**
**SECCON{STAR_WARS}**
~~映画タイトルの時点で想像できたが・・・~~


# Powerful-Shell
いわゆるシェル芸と呼ばれるPowershellのスクリプトを渡され、解読していく問題
試しに実行すると以下の文言と共に終了してしまう
![shell1.png](https://qiita-image-store.s3.amazonaws.com/0/156890/9ebed534-777d-e6a7-53e4-2b989a007872.png)


スクリプト内に終了条件があると判断し、if文を検索すると

```powershell:15113行目
If(Test-Path variable:global:psISE){"D\`eb\`u\`g\`g\`in\`g is \`pr\`o\`h\`ib\`it\`e\`d";Exit}
```


```powershell:15559行目
If(\$host.\"na\`m\`e" -ne "C\`on\`s\`o\`l\`e\`H\`o\`st"){"D\`eb\`u\`g\`g\`in\`g is \`pr\`o\`h\`ib\`it\`e\`d";Exit}
```

実行環境がPowershellコンソールでない場合（Powershell ISEなど）に終了
が存在するのでコメントアウト

スクリプト内を確認するとECCON変数にCHAR型で計算された値が代入され、スクリプトが実行される仕組み。
再度、実行すると管理者権限がないと表示されるので管理者権限で実行すると鍵盤が表示される
![shell3.png](https://qiita-image-store.s3.amazonaws.com/0/156890/2559fd01-9019-4002-7c24-68b80e0ee08d.png)

秘密のメロディを入力しろとあるが不明なので先ほどのECCON変数で作成されたスクリプトを確認する
確認すると以下の部分が該当すると思われる。
![shell4.png](https://qiita-image-store.s3.amazonaws.com/0/156890/4bf1d4a3-e9b7-bfbf-0770-57ed3e1638b4.png)

キー入力する度、stage1配列に代入。入力が終わった後、
Secret配列との比較を行い、全て正しい場合に正解の文書を表示される。
Secret配列には数字が代入されているため、キー入力時にどの数値になるかが分かればよい。
スクリプト内に\$keytone=@{'a'=261.63}の記載があるため、左記の内容で検索すると
基となったスクリプトが公開されている
  https://gist.github.com/Sh1n0g1/a01e5d5117ee08cee7c5164e0d7c80b1
上記の内容でsecretの中身を置き換えると
h,h,j,h,h,j,h,j,k,j,h,j,h,f
の順でキーボード入力することが分かる。
キーボード入力後、Enter　the password:と表示されるので再度スクリプト内を確認する。
![shell5.png](https://qiita-image-store.s3.amazonaws.com/0/156890/2a5b0364-5c7b-767b-c266-a53ef000f9b6.png)


text変数にはbase64でデコードされた文字列が代入され、それをデコードし、バイナリ形式に変換。
バイナリと鍵盤でキー入力したバイナリ値をXORした値で新しいスクリプトを作成し
実行している

ECCON変数で作成されたスクリプトの2行目～93行目をコメントアウトすることで
単独で実行できるようになるので、Enterthepasswordを表示しているスクリプトを確認する

<details><summary>Enterthepasswordを表示しているスクリプト</summary>
<div>

```powershell
\${;}=+\$();\${=}=\${;};\${+}=++\${;};\${@}=++\${;};\${.}=++\${;};\${[}=++\${;};
\${]}=++\${;};\${(}=++\${;};\${)}=++\${;};\${&}=++\${;};\${|}=++\${;};
\${"}="["+"\$(@{})"[\${)}]+"\$(@{})"["\${+}\${|}"]+"\$(@{})"["\${@}\${=}"]+"\$?"[\${+}]+"]";
\${;}="".("\$(@{})"["\${+}\${[}"]+"\$(@{})"["\${+}\${(}"]+"\$(@{})"[\${=}]+"\$(@{})"[\${[}]+"\$?"[\${+}]+"\$(@{})"[\${.}]);
\${;}="\$(@{})"["\${+}\${[}"]+"\$(@{})"[\${[}]+"\${;}"["\${@}\${)}"];
\$a="\${"}\${.}\${(}+\${"}\${(}\${|}+\${"}\${(}\${)}+\${"}\${(}\${)}+\${"}\${)}\${|}+\${"}\${)}\${&}+\${"}\${(}\${+}+\${"}\${&}\${@}+\${"}\${+}\${=}\${+}+\${"}\${|}\${)}+\${"}\${+}\${=}\${=}+\${"}\${[}\${]}+\${"}\${)}\${@}+\${"}\${+}\${+}\${+}+\${"}\${+}\${+}\${]}+\${"}\${+}\${+}\${(}+\${"}\${.}\${@}+\${"}\${[}\${]}+\${"}\${&}\${=}+\${"}\${+}\${+}\${[}+\${"}\${+}\${+}\${+}+\${"}\${+}\${=}\${|}+\${"}\${+}\${+}\${@}+\${"}\${+}\${+}\${(}+\${"}\${.}\${@}+\${"}\${.}\${|}+\${"}\${(}\${|}+\${"}\${+}\${+}\${=}+\${"}\${+}\${+}\${(}+\${"}\${+}\${=}\${+}+\${"}\${+}\${+}\${[}+\${"}\${.}\${@}+\${"}\${+}\${+}\${(}+\${"}\${+}\${=}\${[}+\${"}\${+}\${=}\${+}+\${"}\${.}\${@}+\${"}\${+}\${+}\${@}+\${"}\${|}\${)}+\${"}\${+}\${+}\${]}+\${"}\${+}\${+}\${]}+\${"}\${+}\${+}\${|}+\${"}\${+}\${+}\${+}+\${"}\${+}\${+}\${[}+\${"}\${+}\${=}\${=}+\${"}\${.}\${|}+\${"}\${+}\${.}+\${"}\${+}\${=}+\${"}\${)}\${.}+\${"}\${+}\${=}\${@}+\${"}\${[}\${=}+\${"}\${.}\${(}+\${"}\${(}\${|}+\${"}\${(}\${)}+\${"}\${(}\${)}+\${"}\${)}\${|}+\${"}\${)}\${&}+\${"}\${.}\${@}+\${"}\${[}\${]}+\${"}\${+}\${=}\${+}+\${"}\${+}\${+}\${.}+\${"}\${.}\${@}+\${"}\${.}\${|}+\${"}\${&}\${=}+\${"}\${[}\${&}+\${"}\${+}\${+}\${|}+\${"}\${(}\${|}+\${"}\${+}\${+}\${[}+\${"}\${.}\${(}+\${"}\${)}\${@}+\${"}\${]}\${+}+\${"}\${[}\${|}+\${"}\${[}\${|}+\${"}\${.}\${|}+\${"}\${[}\${+}+\${"}\${+}\${@}\${.}+\${"}\${+}\${.}+\${"}\${+}\${=}+\${"}\${|}+\${"}\${&}\${)}+\${"}\${+}\${+}\${[}+\${"}\${+}\${=}\${]}+\${"}\${+}\${+}\${(}+\${"}\${+}\${=}\${+}+\${"}\${[}\${]}+\${"}\${)}\${@}+\${"}\${+}\${+}\${+}+\${"}\${+}\${+}\${]}+\${"}\${+}\${+}\${(}+\${"}\${.}\${@}+\${"}\${.}\${|}+\${"}\${)}\${+}+\${"}\${+}\${+}\${+}+\${"}\${+}\${+}\${+}+\${"}\${+}\${=}\${=}+\${"}\${.}\${@}+\${"}\${)}\${[}+\${"}\${+}\${+}\${+}+\${"}\${|}\${&}+\${"}\${.}\${.}+\${"}\${.}\${|}+\${"}\${]}\${|}+\${"}\${+}\${.}+\${"}\${+}\${=}+\${"}\${|}+\${"}\${&}\${)}+\${"}\${+}\${+}\${[}+\${"}\${+}\${=}\${]}+\${"}\${+}\${+}\${(}+\${"}\${+}\${=}\${+}+\${"}\${[}\${]}+\${"}\${)}\${@}+\${"}\${+}\${+}\${+}+\${"}\${+}\${+}\${]}+\${"}\${+}\${+}\${(}+\${"}\${.}\${@}+\${"}\${.}\${[}+\${"}\${&}\${.}+\${"}\${(}\${|}+\${"}\${(}\${)}+\${"}\${(}\${)}+\${"}\${)}\${|}+\${"}\${)}\${&}+\${"}\${+}\${@}\${.}+\${"}\${.}\${(}+\${"}\${(}\${|}+\${"}\${(}\${)}+\${"}\${(}\${)}+\${"}\${)}\${|}+\${"}\${)}\${&}+\${"}\${+}\${@}\${]}+\${"}\${.}\${[}+\${"}\${+}\${.}+\${"}\${+}\${=}+\${"}\${+}\${@}\${]}|\${;}"　|&\${;}
```
</div></details>

更に難読化されているが、
1. \${}は特殊記号の変数宣言を行う
2. \$()は()内の式を先に評価してから結果を返す
を分かっていると
\${;}=+\$();～\${|}=++\${;};の部分は変数の宣言。
以降は宣言した変数を元にスクリプトを組み立てて最後に実行していると分かる
変数はWrite-Out等で該当変数を出力させて、代入されている値が分かるので
変換すると以下になる。
<details><summary>変換後のスクリプト</summary>

```powershell
\${;}=9;\${=}=0;\${+}=1;\${@}=2;\${.}=3;\${[}=4;
\${]}=5;\${(}=6;\${)}=7;\${&}=8;\${|}=9;
\${"}=[CHar]
\${;}=string Insert(int startIndex, string value)
\${;}=iex
\$a=[CHar]36+[CHar]69+[CHar]67+[CHar]67+[CHar]79+[CHar]78+[CHar]61+[CHar]82+[CHar]101+[CHar]97+[CHar]100+[CHar]45+[CHar]72+[CHar]111+[CHar]115+[CHar]116+[CHar]32+[CHar]45+[CHar]80+[CHar]114+[CHar]111+[CHar]109+[CHar]112+[CHar]116+[CHar]32+[CHar]39+[CHar]69+[CHar]110+[CHar]116+[CHar]101+[CHar]114+[CHar]32+[CHar]116+[CHar]104+[CHar]101+[CHar]32+[CHar]112+[CHar]97+[CHar]115+[CHar]115+[CHar]119+[CHar]111+[CHar]114+[CHar]100+[CHar]39+[CHar]13+[CHar]10+[CHar]73+[CHar]102+[CHar]40+[CHar]36+[CHar]69+[CHar]67+[CHar]67+[CHar]79+[CHar]78+[CHar]32+[CHar]45+[CHar]101+[CHar]113+[CHar]32+[CHar]39+[CHar]80+[CHar]48+[CHar]119+[CHar]69+[CHar]114+[CHar]36+[CHar]72+[CHar]51+[CHar]49+[CHar]49+[CHar]39+[CHar]41+[CHar]123+[CHar]13+[CHar]10+[CHar]9+[CHar]87+[CHar]114+[CHar]105+[CHar]116+[CHar]101+[CHar]45+[CHar]72+[CHar]111+[CHar]115+[CHar]116+[CHar]32+[CHar]39+[CHar]71+[CHar]111+[CHar]111+[CHar]100+[CHar]32+[CHar]74+[CHar]111+[CHar]98+[CHar]33+[CHar]39+[CHar]59+[CHar]13+[CHar]10+[CHar]9+[CHar]87+[CHar]114+[CHar]105+[CHar]116+[CHar]101+[CHar]45+[CHar]72+[CHar]111+[CHar]115+[CHar]116+[CHar]32+[CHar]34+[CHar]83+[CHar]69+[CHar]67+[CHar]67+[CHar]79+[CHar]78+[CHar]123+[CHar]36+[CHar]69+[CHar]67+[CHar]67+[CHar]79+[CHar]78+[CHar]125+[CHar]34+[CHar]13+[CHar]10+[CHar]125 | &iex
```

</details>
最後の変数部分を更に変換すると

```powershell
\$ECCON=Read-Host -Prompt 'Enter the password'
If(\$ECCON -eq 'P0wEr\$H311'){
	Write-Host 'Good Job!';
	Write-Host "SECCON{\$ECCON}"
}
```

となるのでP0wEr\$H311を入力すればよいとわかる。
![shell6.png](https://qiita-image-store.s3.amazonaws.com/0/156890/b575f87c-61ec-f4ad-f5b6-19169f17785d.png)

**FLAG**
**SECCON{P0wEr\$H311}**

# 感想
今回は初めて100点以上の問題を解答できた。業務で利用していた知識が初めて役に立ち
この様な問題が出ると取り組んでいて意義があると感じる。但し、以前から勉強していたPWN
に関してはまったく歯が立たず。。。