LoginSignup
1
2

More than 5 years have passed since last update.

SECCON2017WritesUP

Last updated at Posted at 2017-12-16

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

RunMe

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

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となるのでフィボナッチ数列の計算を行うプログラムとわかる。
但し、このまま実行しても再帰に時間がかかり答えが返ってこないので
以下の形式に変換すると回答できた

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

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

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

秘密のメロディを入力しろとあるが不明なので先ほどのECCON変数で作成されたスクリプトを確認する
確認すると以下の部分が該当すると思われる。
shell4.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

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

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

Enterthepasswordを表示しているスクリプト
\${;}=+\$();\${=}=\${;};\${+}=++\${;};\${@}=++\${;};\${.}=++\${;};\${[}=++\${;};
\${]}=++\${;};\${(}=++\${;};\${)}=++\${;};\${&}=++\${;};\${|}=++\${;};
\${"}="["+"\$(@{})"[\${)}]+"\$(@{})"["\${+}\${|}"]+"\$(@{})"["\${@}\${=}"]+"\$?"[\${+}]+"]";
\${;}="".("\$(@{})"["\${+}\${[}"]+"\$(@{})"["\${+}\${(}"]+"\$(@{})"[\${=}]+"\$(@{})"[\${[}]+"\$?"[\${+}]+"\$(@{})"[\${.}]);
\${;}="\$(@{})"["\${+}\${[}"]+"\$(@{})"[\${[}]+"\${;}"["\${@}\${)}"];
\$a="\${"}\${.}\${(}+\${"}\${(}\${|}+\${"}\${(}\${)}+\${"}\${(}\${)}+\${"}\${)}\${|}+\${"}\${)}\${&}+\${"}\${(}\${+}+\${"}\${&}\${@}+\${"}\${+}\${=}\${+}+\${"}\${|}\${)}+\${"}\${+}\${=}\${=}+\${"}\${[}\${]}+\${"}\${)}\${@}+\${"}\${+}\${+}\${+}+\${"}\${+}\${+}\${]}+\${"}\${+}\${+}\${(}+\${"}\${.}\${@}+\${"}\${[}\${]}+\${"}\${&}\${=}+\${"}\${+}\${+}\${[}+\${"}\${+}\${+}\${+}+\${"}\${+}\${=}\${|}+\${"}\${+}\${+}\${@}+\${"}\${+}\${+}\${(}+\${"}\${.}\${@}+\${"}\${.}\${|}+\${"}\${(}\${|}+\${"}\${+}\${+}\${=}+\${"}\${+}\${+}\${(}+\${"}\${+}\${=}\${+}+\${"}\${+}\${+}\${[}+\${"}\${.}\${@}+\${"}\${+}\${+}\${(}+\${"}\${+}\${=}\${[}+\${"}\${+}\${=}\${+}+\${"}\${.}\${@}+\${"}\${+}\${+}\${@}+\${"}\${|}\${)}+\${"}\${+}\${+}\${]}+\${"}\${+}\${+}\${]}+\${"}\${+}\${+}\${|}+\${"}\${+}\${+}\${+}+\${"}\${+}\${+}\${[}+\${"}\${+}\${=}\${=}+\${"}\${.}\${|}+\${"}\${+}\${.}+\${"}\${+}\${=}+\${"}\${)}\${.}+\${"}\${+}\${=}\${@}+\${"}\${[}\${=}+\${"}\${.}\${(}+\${"}\${(}\${|}+\${"}\${(}\${)}+\${"}\${(}\${)}+\${"}\${)}\${|}+\${"}\${)}\${&}+\${"}\${.}\${@}+\${"}\${[}\${]}+\${"}\${+}\${=}\${+}+\${"}\${+}\${+}\${.}+\${"}\${.}\${@}+\${"}\${.}\${|}+\${"}\${&}\${=}+\${"}\${[}\${&}+\${"}\${+}\${+}\${|}+\${"}\${(}\${|}+\${"}\${+}\${+}\${[}+\${"}\${.}\${(}+\${"}\${)}\${@}+\${"}\${]}\${+}+\${"}\${[}\${|}+\${"}\${[}\${|}+\${"}\${.}\${|}+\${"}\${[}\${+}+\${"}\${+}\${@}\${.}+\${"}\${+}\${.}+\${"}\${+}\${=}+\${"}\${|}+\${"}\${&}\${)}+\${"}\${+}\${+}\${[}+\${"}\${+}\${=}\${]}+\${"}\${+}\${+}\${(}+\${"}\${+}\${=}\${+}+\${"}\${[}\${]}+\${"}\${)}\${@}+\${"}\${+}\${+}\${+}+\${"}\${+}\${+}\${]}+\${"}\${+}\${+}\${(}+\${"}\${.}\${@}+\${"}\${.}\${|}+\${"}\${)}\${+}+\${"}\${+}\${+}\${+}+\${"}\${+}\${+}\${+}+\${"}\${+}\${=}\${=}+\${"}\${.}\${@}+\${"}\${)}\${[}+\${"}\${+}\${+}\${+}+\${"}\${|}\${&}+\${"}\${.}\${.}+\${"}\${.}\${|}+\${"}\${]}\${|}+\${"}\${+}\${.}+\${"}\${+}\${=}+\${"}\${|}+\${"}\${&}\${)}+\${"}\${+}\${+}\${[}+\${"}\${+}\${=}\${]}+\${"}\${+}\${+}\${(}+\${"}\${+}\${=}\${+}+\${"}\${[}\${]}+\${"}\${)}\${@}+\${"}\${+}\${+}\${+}+\${"}\${+}\${+}\${]}+\${"}\${+}\${+}\${(}+\${"}\${.}\${@}+\${"}\${.}\${[}+\${"}\${&}\${.}+\${"}\${(}\${|}+\${"}\${(}\${)}+\${"}\${(}\${)}+\${"}\${)}\${|}+\${"}\${)}\${&}+\${"}\${+}\${@}\${.}+\${"}\${.}\${(}+\${"}\${(}\${|}+\${"}\${(}\${)}+\${"}\${(}\${)}+\${"}\${)}\${|}+\${"}\${)}\${&}+\${"}\${+}\${@}\${]}+\${"}\${.}\${[}+\${"}\${+}\${.}+\${"}\${+}\${=}+\${"}\${+}\${@}\${]}|\${;}" |&\${;}

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

変換後のスクリプト

\${;}=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


最後の変数部分を更に変換すると

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

となるのでP0wEr\$H311を入力すればよいとわかる。
shell6.png

FLAG
SECCON{P0wEr\$H311}

感想

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

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2