ZeroWidthSpace¶
- ZeroWidthSpace
- 動機 : 先日こういう話題があった
- 原理 : Unicodeゼロ幅スペースを仕込んだ
- いろんな事に(難読化シェル芸)に使えるんじゃ・・・!
- Twitter用 Unicodeゼロ幅スペースぶっ込みツール に作り直した
- 使えるシュチュエーション
- 他の実装
動機 : 先日こういう話題があった¶
ゼロ幅文字にエンコードした隠し情報で、文書をリークしたメンバーを特定¶
とある会員制掲示板からの文書の流出に困った運営者が、 ユニコードの見えない文字「ゼロ幅文字(Zero-Width characters)」を使って流出させたユーザーを特定した、という話 が出ていました。 ...
- 要約
- 競技ビデオゲームのチームが、プライベートの掲示板を利用
- 外部の掲示板にコピペしているやつがいた
- 見た目がわからない文字を仕込んで犯人を特定
原理 : Unicodeゼロ幅スペースを仕込んだ¶
ゼロ幅スペース(Wikipedia)¶
コンピュータの組版に用いられる非表示文字で、文書処理システムに対して語の切れ目を示すのに用いる
U+034F , U+200B , U+200C , U+200D , U+200E , U+200F , U+2028 , U+2029 , U+202A , U+202B , U+202C , U+202D , U+202E , U+2061 , U+2062 , U+2063 , U+FEFF
いろんな事に(難読化シェル芸)に使えるんじゃ・・・!¶
元ネタに習って4種類を使う ⇒ 4進数で表現できる!
CodePoint | 名称 | デコード時 |
---|---|---|
U+200B | ゼロ幅空白 | 0 |
U+200C | ゼロ幅非接合子(筆記体の時の制御) | 1 |
U+200D | ゼロ幅接合子(筆記体の時の制御) | 2 |
U+FEFF | ゼロ幅のノーブレークスペース | 3 |
ゼロ幅スペースにエンコード¶
- 文字を16進数に変換(xxd)
- 16進数を4進数に変換(bc)
- 0 1 2 3 をゼロ幅スペースに置換(sed)
ZWS1=$'\u200b'
ZWS2=$'\u200c'
ZWS3=$'\u200d'
ZWS4=$'\ufeff'
echo "unko" |xxd -p|tr a-z A-Z \
|sed 's/^/obase=4; ibase=16; &/g'|bc \
|sed s/0/$ZWS1/g |sed s/1/$ZWS2/g \
|sed s/2/$ZWS3/g |sed s/3/$ZWS4/g
仕込んだゼロ幅スペースのデコード¶
- ゼロ幅スペースを 0 1 2 3 に置換(sed)
- 16進数に変換(bc)
- バイナリに変換(xxd)
ZWS1=$'\u200b'
ZWS2=$'\u200c'
ZWS3=$'\u200d'
ZWS4=$'\ufeff'
echo '' \
|sed s/$ZWS1/0/g |sed s/$ZWS2/1/g \
|sed s/$ZWS3/2/g |sed s/$ZWS4/3/g \
|sed 's/^/obase=16; ibase=4; &/g'|bc|xxd -ps -r
※ echo '' の''にはゼロ幅スペース入ってる
Twitter用 Unicodeゼロ幅スペースぶっ込みツール に作り直した¶
TwitterやSNSで使える種類が限られていることがわかった。
こんどTwitter対応やってみます #シェル芸 #すみません動くって言って動きませんでした許してくださいなんでもしますから https://t.co/gUjAI3x9wt
— kanata (@kanata201612) 2018年7月9日
調査してTwitter用に良さそうな4種類のゼロ幅スペースを確認する
結果、Twitterに仕込んでも大丈夫そうなゼロ幅スペース #シェル芸
— kanata (@kanata201612) 2018年7月15日
U+200B
U+200C
U+200D
U+2062
もうちょっと確認してみよう
シェル芸bot氏のことも考慮して、割と真面目に作り直した
Instration¶
ファイルダウンロードして実行権限をつけるだけ
$ wget https://raintrees.net/attachments/download/486/zws
$ chmod u+x ./zws
最新版について¶
現在、githubにて最新版を管理しています。インタフェースをbase64と全く同じに修正(してもらい)ました。
https://github.com/kanata2003/ZeroWidthSpace
動作環境¶
ただのシェルスクリプトなので、だいたいの環境(Linux,Mac,Unix)で動くのでは
以下で、動作確認しました。
- CentOS Linux release 7.2.1511 x86_64
Usage¶
エンコード¶
実行すると '' が出力されるが間にゼロ幅スペースが詰まっている
./zws unko
''
パイプ経由でもできる
echo "unko"|./zws
''
ちなみにTwitterでは、ゼロ幅スペースはアスキー文字と同等に数えられるらしく、140文字ではなく280文字までいけた
エンコードサイズが280文字を超えるとWARNINGを出すようにしている(エンコード自体はする)
./zws aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[WARN] This encoded size over 280 characters. You can not tweet. Now 285 characters.
''
シェル芸bot氏はゼロ幅スペースを普通にマルチバイト文字として数える(140文字制限)ので、bot氏に処理をお願いする時は140文字までの制限を意識する必要がございます
ゼロ幅スペースの文字数を数えるには wc -m コマンドで数えることができます
./zws 'I hava an apple'|wc -m
67
この短めの文で67文字も使うのでTwitterにはあまり長い文字列が仕込めません
デコード¶
base64コマンドっぽいインタフェースにした
ゼロ幅スペース以外の文字があっても、そこは無視してデコードする
./zws -d 'this is a pen'
unko
もちろんパイプ経由でもいける
echo ''|./zws -d
unko
使えるシュチュエーション¶
このシェル芸を実行したのは誰だ!¶
./zws -d 'echo unko'
私です
裏手順を隠しておく¶
./zws -d 'stop.sh #アプリを停止、yを入力'
pkill apli
呪いを込めておく¶
./zws -d 'Start.sh #アプリ起動'
帰りたい
暗号的やり取り¶
実はTwitterはゼロ幅スペースが使えます
他のSNSでも使えそう(未確認)
./zws -d '草'
特売だぞ
難読化シェル芸¶
echoと見せかけたdateの実行
echo 'echo unko'|./zws -d|bash
2018年 7月 16日 月曜日 10:26:37 JST
他の実装¶
- ExcelのVBAで風柳さんが実装しています
[Excel][VBA] ゼロ幅スペースを利用した情報隠蔽の試み
https://gist.github.com/furyutei/6bba0eaf5e0bcb4ae1ee30f916cfcb04
- 短縮URLのサービスで実装されています
Zero Width Shortener
https://zws.im/