ニュース

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

kanataほぼ8年前に追加

昨年は時間をみて、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回シェル芸勉強会及びエクシェル芸勉強会に参加させて頂きました!

kanataほぼ8年前に追加

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

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

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

その他、知見メモ

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

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

kanataほぼ8年前に追加

難読化シェル芸

Obfuscation Shell Script One Liner

難読化シェル芸とは

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

例えばこんなの

普通の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

コマンドの間に無視される文字を挟み込む

''''''''''''''''''''''''''''''''''''''''''''''''''d''''''''''''''''''''''''''''''''''''''''''''''''''a''''''''''''''''''''''''''''''''''''''''''''''''''t''''''''''''''''''''''''''''''''''''''''''''''''''e''''''''''''''''''''''''''''''''''''''''''''''''''
Sat Sep 21 20:00:59 JST 2019
d""a$()t``e
Sun Apr 19 10:43:58 JST 2020

無駄なブレース展開

$ echo {{{{{{{{{a..c},},},},},},},},}
a b c

evalを使って実行

コマンド置換と同様。まとめ中

manに載っていないsedのeオプションを使って実行

sedのeオプションは、引数のコマンドを実行してくれるのでこれを利用する。
eオプションは通常、manに載っていない。sedを熟知していないとやはり何しているか解りにくい。

gnu.org の説明
https://www.gnu.org/software/sed/manual/sed.html#sed-commands-list

echo|sed 'e date'
20171029日 日曜日 10:50:50 JST

難読化技法

フェイク(無駄な命令)

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

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

以下の条件で後続のコマンドが実行されるため、さらに難読化に利用できる

: date # dateは実行されない

$(:) date # dateは実行される
2017102日 月曜日 20:06:55 JST

`:` date # dateは実行される
2017102日 月曜日 20:07:03 JST

フェイク(前半処理の無視)

処理結果をパイプで渡しても、それを使わなければ実質、無視できる処理となる。
以下は、前半処理を無視して、dateを実行する例

$ echo hoge |grep hoge|date
2018114日 日曜日 17:20:12 JST

より複雑な難読化を考えるなら、処理の後半も無駄な処理にして、間に本当にやりたい処理を間に入れる方法が考えられますね。

base64によるエンコード

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

dateの難読化

$(echo ZGF0ZQ==|base64 -d)

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

$(echo OigpeyA6fDomIH07Og==|base64 -d)

日本語base64難読化シェル芸

たいちょー氏の難読化シェル芸LTスライド
https://www.slideshare.net/xztaityozx/ss-76402430

"うんこ"からコマンドを錬成するのが最近のトレンド

うんこでEmacsを起動するのできた
https://twitter.com/sh_takuma/status/869007508643258368

うんこでVimを起動するのできた
https://twitter.com/grethlen/status/869162016362987520

https://www.slideshare.net/xztaityozx/base64-77639861

破壊的難読化シェル芸

https://www.slideshare.net/xztaityozx/ss-79171721

ダブルシンク難読化シェル芸

https://www.slideshare.net/xztaityozx/ss-80555814/

base64からのシーザー暗号

古典暗号(ROT13)を使って難読化

echo 44TT44XG44TGPt== |tr A-Za-z N-ZA-Mn-za-m|base64 -d
うんこ

ROT47で暗号化すると数字も暗号化の対象になって偽装できるのでなお良い

echo "ccvvccz%ccv%r8ll"|tr '!-~' 'P-~!-O'|base64 -d
うんこ

スペースを使わない

IFS変数がスペースの代わりとして使える。

$ date$IFS'+%s'
1546743417

計算による文字の難読化

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

vの出力

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

Aの出力

printf '%X\n' $((0x5 * 2))
A

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

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)
1

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

man asciiから文字列を得る

調査中

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

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

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

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

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

サンプリングシェル芸

上記(システムが普遍的に抱えている不変な情報から文字を得る)の発展した形をシェル芸の上田先生がまとめてくださいました嬉しい

サンプリングシェル芸
https://b.ueda.tech/?page=sampling_shellgei

難読化シェル芸の手法の一つに、思わぬところから文字を拾って(サンプリングして)コマンドの文字列にするというものがあります。音楽のサンプリングみたいなものです。文字を拾う方法にもいろいろあるので、まとめてみました。

パイプレス

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

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

SJIS文字コードのダメ文字を利用したパイプ難読化

文字コードのSJISには、その文字を構成するバイト(2Byte目)に制御文字を含んているものがある
これらはダメ文字と呼ばれ、Linuxで扱う時は注意が必要でした。大きくは、以下の2種類があります

  • 2byte目が0x5c \ のダメ文字
    • ― ソ Ы Ⅸ 噂 浬 欺 圭 構 蚕 十 申 曾 箪 貼 能 表 暴 予 禄 兔 喀 媾 彌 拿 杤 歃 濬 畚 秉 綵 臀 藹 觸 軆 鐔 饅 鷭 纊 犾 偆 砡
  • 2byte目が0x7c | のダメ文字
    • - ポ л 榎 掛 弓 芸 鋼 旨 楯 酢 掃 竹 倒 培 怖 翻 慾 處 嘶 斈 忿 掟 桍 毫 烟 痞 窩 縹 艚 蛞 諫 轎 閖 驂 黥 僴 礰 埈 蒴

SJISのポは"|"が含まれているポ系ダメ文字であり、難読化に応用できる

$ eval $(__=$(nkf -sLux <(echo ポ));echo echo ZGF0ZQo=${__:1}base64 -d${__:1}bash)

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

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

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

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

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

tacの代替

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

$ echo abcd|grep -o .|sed '1!G;h;$!d'
d
c
b
a

touchの代替

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

$ sed 'w filename' /dev/null

treeの代替

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

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

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

深淵

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

echoの代替

Hello Worldコレクション

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

catの代替

$ echo "$(<hoge.txt)"
$ curl file:/%65%74%63/%70%61%73%73%77%64 # cat /etc/passwd と同じ

curlは、更にURLエンコードにより難読化できる

lsの代替

echo *
printf %s *

tacの代替

seq 10 | dc -f- -ef

dcコマンドを読める人は少ない

記号難読化

以下、参照

記号と1,2,A,zでだけで作る難読化シェル芸

ここから隊長さんが究極の難読化に昇華してくれた。いまやJavaScriptやPowerShellの最先端の難読化手法に追いついている。以下

超・記号オンリー難読化シェル芸

これにより難読化シェル芸の、難読化手法の一つが完成するに至った。歴史的瞬間。

数字・英字を全く使わない記号難読化

不可能と思われていた完全記号化がなんと完成…!!

記号と英字2文字だけでbash - Ryoto Saito's Blog
https://www.ryotosaito.com/blog/?p=178

記号だけでシェルは操れた - Ryoto Saito's Blog
https://www.ryotosaito.com/blog/?p=194

全く別のアプローチによる完全記号難読化

新たなる刺客

34C3 CTF: minbashmaxfun - writeup
https://hack.more.systems/writeup/2017/12/30/34c3ctf-minbashmaxfun/

その驚くべき手法

$ ${!#}<<<${!#}\<\<\<\$\'\\${##}$#${##}\'

これは、以下と等価

$ bash <<< bash \<\<\< \$\'\\${##}$#${##}\'

そして、以下とも等価

$ bash <<< $'\101'

これは最終的にAを実行することと等価

$ A
-bash: A: コマンドが見つかりません

この考えに基づけば、全ての数字・アルファベットを生成することができる

ポイントは ${!#} と ${##} の特殊変数

以下の内容となっている

$ echo ${!#}   # 34C3 CTFの環境では"bash"が返ってきたようです。若干の環境依存があります。
-bash
$ echo ${##}
1

これは、以下のように解釈できます。

  • ${#変数名}は、格納されている文字列の長さを返す。
  • ${#} は引数の数(ワンライナーだと0になります)
  • よって、${##}は、"0"という文字の長さ1を返す。
  • ${!} は最後にバックグラウンドで行ったコマンドのプロセス番号(バックグラウンドで実行していなければ空)
  • よって ${!#} は ${0} と等価となる。

驚くべき手法です。これまでに考えてきた手法と組み合わせることもできます。
この点はまだまだ研究の余地がありそうです!

難読化シェル芸に使えそうなテクニック集

難読化シェル芸に使えそうなテクニック集
https://scrapbox.io/jiro4989/%E9%9B%A3%E8%AA%AD%E5%8C%96%E3%82%B7%E3%82%A7%E3%83%AB%E8%8A%B8%E3%81%AB%E4%BD%BF%E3%81%88%E3%81%9D%E3%81%86%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF%E9%9B%86

神 of 神

hiro氏作の難読化シェル芸の解読
https://hackmd.io/@EjC746Q1REWEpEC57LOAXA/rJ4niQJfr

たいちょーの雑記 - 難読化dateコレクション-3-$[]利用
https://xztaityozx.hatenablog.com/entry/2020/01/16/224643

難読化シェル芸の解読
https://qiita.com/eggplants/items/3994a502ce2659b4a17f

Unicode結合文字難読化

echo "d͜͜͏̘̣͔͙͎͎̘̜̫̗͍͚͓͜͜͏̘̣͔͙͎͎a͜͜͏̘̣͔͙͎͎t̜ͪ̅̍̅͂͊e " |tr -cd 'a-z'|bash
2018318日 日曜日 17:06:41 JST

Unicodeゼロ幅スペース難読化

アンチデバック技法(耐タンパー性の確保)

思いついたんだけど、公開していいか、悩んでいる。

難読化シェル芸ツール

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

インストール

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

HTJSA{DGFDIHJKH}ASQQMXBKUXXSdfgeOGCYTSAADSGUFTu}IUYTPDGHSGJUOUO}ASDGFSGJKHLQZSN}

もっとすげぇ難読化シェル芸ツール

隊長さん作成のツール

xztaityozx/nandokuka 難読化シェル芸は砕けない
https://github.com/xztaityozx/nandokuka

0x6d61さん作成のツール

0x6d61/obfsh.rb 難読化shell芸を手助けするscript
https://gist.github.com/0x6d61/7ebfe4393ba3a3564313b48684e7b7fb

node-bash-obfuscate
https://www.npmjs.com/package/bash-obfuscate

難読化解除ツール

Flerken
https://github.com/We5ter/Flerken/blob/master/README.md

Windows (CMD and Powershell) and Linux (Bash) commandsが対象。WebUIもある。

Memo

PowerShellとJavaScriptは別ページにした方がいいかもなー。情報量が多い。

PORTSWIGGER - Unearthing Z͌̈́̾a͊̈́l͊̿g̏̉͆o̾̚̚S̝̬ͅc̬r̯̼͇ͅi̼͖̜̭͔p̲̘̘̹͖t̠͖̟̹͓͇ͅ with visual fuzzing
https://portswigger.net/blog/unearthing-zalgoscript-with-visual-fuzzing

IPアドレスの難読化 - おふとん
https://ohuton.hatenadiary.jp/entry/2018/09/24/232419

自己追記によるFizzBuzz
https://zenn.dev/yamaya/articles/da9131540dc12a

JavaScriptの難読化

Qiita - JS記号プログラミング入門
https://qiita.com/acid_chicken/items/eeb0b42a1ecbba0c49e3

Qiita - ウェブアプリをソースごとパクる業者に対する対策
https://qiita.com/kacchan6@github/items/d8576ab6b3c16cf670ca

Qiita - 本格JavaScript記号プログラミング(1) 6種類の記号だけでJavaScriptを書こう
https://qiita.com/Tatamo/items/24099958b90cbed61d67

JavaScriptの難読化技術を探る
https://monpoke1.hatenablog.com/entry/2018/12/06/020115#参考

プログラミングLT 記号プログラミングのスライド
https://docs.google.com/presentation/d/1Bqu_si3o0Lol8k9MvVx443R9zaJF7Qtq-_jutw2wYrc/edit?usp=sharing

PowerShellの難読化

セキュリティコンサルタントの日誌から - PowerShellの難読化について
http://www.scientia-security.org/entry/2017/11/13/224035

PowerShell難読化の基礎 (1)
http://binary-pulsar.azurewebsites.net/2018/09/01/ps-obfuscate-pt1/

PowerShell難読化の基礎 (2)
http://binary-pulsar.azurewebsites.net/2018/09/08/ps-obfuscate-pt2/

PowerShell難読化の基礎 (3)
http://binary-pulsar.azurewebsites.net/2018/09/14/ps-obfuscate-pt3/

PowerShellの難読化解除 - Binary Pulsar
http://binary-pulsar.azurewebsites.net/2018/09/19/ps-deobfuscate/

DbgShell - A PowerShell Front-End For The Windows Debugger Engine
https://www.kitploit.com/2018/10/dbgshell-powershell-front-end-for.html

PowerShellの難読化解除
https://binary-pulsar.hatenablog.jp/entry/2018/09/19/000000

難読化PowerShell芸入門
https://www.slideshare.net/xztaityozx/powershell-162881333

『PowerShellを使用したファイルレス・マルウェアが届いたので、コミケの原稿書きながら、難読化スクリプトの読解手順を動画にしてみました。』

一進一退!じあんちゃん じあんちゃん対PowerShellの巻  (ギャル語でマルウェア解説してみた)
https://www.youtube.com/watch?v=Z6j_bz1Lo8U

『PowerShellを使用したファイルレス・マルウェアが届いたので、コミケの原稿書きながら、難読化スクリプトの読解手順を動画にしてみました。』

Powershellスクリプトの難読化解除ツール
https://github.com/R3MRUM/PSDecode

その他の言語

Ruby とすてきな難読化
http://d.hatena.ne.jp/ku-ma-me/touch/20091215/p1

sh で brainfuck
http://ya.maya.st/d/201208a.html#s20120809_1

難読化の話(超!?入門編)その1
https://www.netagent.co.jp/study/blog/hard/20180726.html

難読化の話(超!?入門編)その2
https://www.netagent.co.jp/study/blog/hard/20181122.html

難読化の話(超!?入門編)その3 前編
https://www.netagent.co.jp/study/blog/hard/20190214.html

えあーの雑記録(仮) - 【C/C++】#defineで日本語も使えるので「#define 斉藤」してみた
https://airscarlet.com/programming_cpp_japanese_define/

SECCON 2016 Writeup (1コメント)

kanataほぼ8年前に追加

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#

シェル芸のネタ

kanataほぼ8年前に追加

全てが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

Aircrack-ngを使うためにVMwareのKaliLinuxでUSBトングルのWifiを使う

kanataほぼ8年前に追加

最初はUSBメモリにKaliLinuxインストールしたりしてたんだけど、その度にPCのリブートが必要だし、読み書き遅いし、なんとも不満があった。仮想環境でやりたいねん。。

VMware(VirtualBox)に入れたKaliLinuxでAircrack-ngを使ってみたかったんだけど、ホストOSがWifi環境でもゲストOSはEtherとして接続されるので、あぁ出来ないのかなー。と、思ってた。

でもでも、よく考えたらUSBトングルを接続できるんだよね。ゲストOSに直接。
あ、これでいけんじゃね?と思って試したら出来た。

詳しくは以下参照
Aircrack-ngを使うためにVMwareのKaliLinuxでUSBトングルのWifiを使う

Dentoo.LT #15.5 を聴講させて頂きました (1コメント)

kanataほぼ8年前に追加

Dentoo.LT #15.5 : ATND

調布祭中のイベント

面白かったです!

びっくりしたもの

ねおたそさん WSL

Windows10でbashが使えるという例の内部構造を話して下さいました。

  • bash経由でディレクトリ作ると、小文字大文字のディレクトリを区別する(hoge Hogeも扱える)
  • そのフォルダ名は、exploerでも見ても、ちゃんと区別されている
  • bashからexeを実行できる。事項結果が標準出力にパイプされる!!

シェル芸人が喰らいつく匂いがプンプンするぜぇwwwwwwwww

alstamberさん たのしいモバイル決済の世界

ApplePayとか、カード決済の日本の特殊な事情とかを教えてもらった。

ほんと、デビットとか普及してくれんかな。

飛び入りプロ生ちゃんさん

度肝を抜かれた。生で見た。意外にカワイイwwwwwww

発表資料
https://www.dropbox.com/s/pu1xehmv7ja4zzy/dentooLT161126_small.pdf?dl=0

貴重な資料
https://www.instagram.com/p/BNRGYFQAMxe/
https://twitter.com/marin72_com/status/802433655402414080/photo/1

20161126_dentoolt15-5.jpg

まとめ

togetter - #dentoolt 15.5 2016.11.26
http://togetter.com/li/1052867

オープンソースカンファレンス2016 Tokyo/Fall に行ってきました (1コメント)

kanata約8年前に追加

オープンソースカンファレンスは、オープンソースの今を伝えるイベントで、オープンソース関連のコミュニティや協賛企業・後援団体による、セミナーやプロダクトの展示などを入場・参加料が無料でご覧いただけるイベントです。

オープンソースカンファレンス2016 Tokyo/Fall - オープンソースの文化祭!

春に続き、今回の秋も行ってみました。やっぱ楽しい!

こんなセミナも聴講しました!!

セキュリティ・キャンプ2016の報告も聞きたっかんだけど、都合が合わなくて聞けなかった。残念。

[飲食OK]ライトニングトーク(by OSCスポンサー)

ライトニングトーク

みんな楽しそうにLTしておりました。聞いてて楽しい。LTっていいですなぁ。

マルチスレッド・ライブラリ自作で知るOS動作の基礎

マルチスレッド・ライブラリ自作で知るOS動作の基礎

低レイヤの達人であり、アセンブラ短歌六歌仙の一人、kozosの坂井さんが、C言語のユーザーランドでスレッドプログラミング(ライブラリ使うのではなくて、自分でコンテキストスイッチするところからw)の解説。いつもながらすごいこと考えつきますね。。

坂井さんには、11/6にLT予定の「アセンブラ漢文」の発表資料の公開をお願いしちゃった。レ点よろしく、jmp命令を駆使して飛びまくるコードと想像。面白そうw楽しみ。

特に面白かった物/興味深かったもの

プラレールで半加算器

プラレールで半加算器を設計した話 | サイボウズ式

これの実物&作成者からの解説が炸裂してました。

何故作ったのかという問いに、「 男のロマンだ!!!!! 」とwwwwww
世界最大の半加算器だと力強く語っておりました。笑った。


そしてまた沢山ノベルティを頂いてしまった(ありがてぇ・・)

20161105_ospn.jpg

第25回もう4年もやってんのかシェル芸勉強会に参加させて頂きました! (1コメント)

kanata約8年前に追加

シェルスクリプト大好きなんですが、新しい知見が得られて、やっぱり面白いですね!
問題解説は、本家のサイトが詳しいので、そちらにお任せするとして、ここは私なりの感想と解説(?)をしたいと思います。

【問題と解答】第25回もう4年もやってんのかシェル芸勉強会

jus共催 第7回初心者の定義で大揉め午前のシェル勉強会/第25回もう4年もやってんのかシェル芸勉強会

Q1

 www.usptomo.comのIPアドレスだけを出力するワンライナーを考えてみてください。

解答&解説

digでもpingでもnslookupでも出来るけど、なぜかtracerouteを思いついた。
ちなみにnslookupを使う人はおじさんらしい。

$ traceroute www.usptomo.com | head -1 |awk '{print $4}'|tr -d '(),'
157.7.203.188

Q2

次のような出力を作ってください。

ひらけ!ポンキッキ
らけ!ポンキッキひ
け!ポンキッキひら
!ポンキッキひらけ
ポンキッキひらけ!
ンキッキひらけ!ポ
キッキひらけ!ポン
ッキひらけ!ポンキ
キひらけ!ポンキッ

解答&解説

ぜんぜん解けなかったw
ループ使うしなないかな、とか思ってたんだけど、ループ無しでも解けるそうで、目から鱗。

$ yes 'ひらけ!ポンキッキ' | tr -d '\n' | fold -w 30 | head -n 9 | sed 's/.$//'

これずげぇ。

Q3

rbashと打つとリダイレクトが使えなくなります。

この状況で、/etc/passwdからbashをログインシェルにしているユーザのレコードを抽出し、hoge等のファイルに出力してみましょう。様々な方法を考えてみましょう。bashと打ったりexitでもとのbashに戻るのは反則とします。

解答&解説

自分の環境には、rbash入ってなかったんだけど(?)、bash -r と同等らしい。これを使うとリダイレクトとTAB補完その他が制限されるという鬼畜仕様。

要は、リダイレクトを使わずにファイルに出力する方法を思いつけば解ける。その時に出たファイル出力するコマンドを以下に挙げておきます。

  • sort -o file
  • dd of=file
  • awk '{print $0 > "file"}'
  • sed 'w file'
  • iconv -o file
  • cp /dev/stdin hoge

Q4

以下のひらがなからワンライナーを始めて、濁点がつく字だけに濁点をつけてみてください。

解答&解説

無理だった。
ASCIIコードの英小文字と英大文字は32を足したり引いたりすると変換できるんだけど、その応用かな?とか考えてた。

nkfだった。nkf芸。

$ echo すけふぇにんけん | sed 's/./&゛/g'| nkf --katakana | nkf -Z4 | nkf --hiragana | sed 's/゛//g'
ずげぶぇにんげん

Q5

1秒に一つ*が伸びていくアニメーションを作ってください。

解答&解説

お、こりゃー解けるよ。

#!/bin/bash

for i in $(seq 1 100)
do
  printf '*'
  sleep 1
done

これを一行にする。

$ for i in $(seq 1 100);do printf '*'; sleep 1;done

Q6

日本語のメッセージから作った次の文字列を復元してください。

$ xxd crypt 
0000000: 6237 3330 6137 3330 6562 3330 6238 3832  b730a730eb30b882
0000010: 3061 3030 0a                             0a00.

解答&解説

おおっ。CTFっぽい!燃える!(と思ったけど、自分が解くより他の方が先に解いてた)

目grep力がある人ならば

b730
0a00

あたりで、ピンと来る・・・か。リトルエンディアンになっているね。で、2Byte文字っぽくて、0x30から始まる・・・となると、Unicodeだと解る、と。

なので、リトルエンディアン変換&Unicodeをお使いの環境(UTF-8)に変換するには、こんな感じ、と。
なるほど。

$ cat crypt | xxd -ps -r | iconv -f=ucs-2le -t=utf8

ちなみに、 UnicodeとUTF-8って何が違うの? っていうのは、私がまとめた 文字コードの解説 があるので、ご参考にどうぞ。

Q7

本日(2016年10月29日)の範囲の毎秒のUNIX時刻で素数となるものを全て列挙してください。出力はUNIX時刻でなく、何時何分何秒か分かるようにしましょう。世界標準時で考えてください。

解答&解説

お、これもなんかできそう。

$ seq $(date -d '2016/10/29' -u +%s) $(date -d '2016/10/29 1 day' -u +%s) | factor | awk 'NF==2{print $2}'|xargs -n1 -I% date -ud @%

分解すると、
2016年10月29日の範囲の毎秒のUNIX時刻

$ seq $(date -d '2016/10/29' -u +%s) $(date -d '2016/10/29 1 day' -u +%s) 

素数の判別

$ seq 1 100| factor | awk 'NF==2{print $2}'

通算秒から、普通のフォーマットに変換

$ echo 1477785349 | date -ud -

Q8

次のようにサイン波を描いてください。

20161030_shellgei_q8.png

解答&解説

も、もぅ無理。サイン波は、なんとか出せるとして、それの縦横をひっくり返すのが至難。

結局、Tukubaiのtateyokoコマンドを使うか、rsコマンドを使う解法でした。

なんか、普通に用意されているコマンドで出来たような気もするんだけど、思い出せなかった。

$ seq 1 20 | awk '{a=sin($1/3) * 10 + 10;for(i=0;i<a;i++)printf "@ ";printf "* ";for(i=a;i<20;i++)printf "@ ";print ""}' | rs -t 23 | tr @ ' '

懇談会&LT

いや、これめっちゃ面白かった!!
モバイルバッテリーの研究とか、ゲノムにまつわるシェル芸の応用とか、ちょっと、自分もLTやってみようかな。
CTFにおけるシェル芸の応用とか。

AVTOKYO2016に行ってきました

kanata約8年前に追加

AVTOKYO JP

AVTokyo2016まとめ

まったり酒飲みながら聴講したとさ〜。面白かった!

20161022_AVTOKYO1.jpg

聞いていた中で面白かったものをいくつか紹介。
ハンズオンやCTFもあったんだけどノートPC持ってないとか、プレゼン聞きたいとかあって断念した。

Nmap 9つの真実 もう「何も言えねぇ」

おっこれは…と、思っても、「役に立たない」と締め括るスタイルに草。

House of Einherjar -- Yet Another Heap Exploitation Technique on GLIBC(AVTOKYO ed.)

これは…このスライドが欲しい!!!ヒープだ!ヒープ解説だ!!ヒープは仕様が複雑な割には解説しているサイトが少ない貴重な資料。

20161022_AVTOKYO2.jpg


この業界の有名人が沢山いて、あとお見かけしたことないのは、piyokangoさんと徳丸先生だな。コンプリートできるかしら(おい

AV TOKYO 来年は10周年だそうだ。また来年も期待しています。

1 ... 6 7 8 9 10 ... 16 (71-80/153)

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

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