ZeroWidthSpace

動機 : 先日こういう話題があった

ゼロ幅文字にエンコードした隠し情報で、文書をリークしたメンバーを特定

とある会員制掲示板からの文書の流出に困った運営者が、 ユニコードの見えない文字「ゼロ幅文字(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

ゼロ幅スペースにエンコード

  1. 文字を16進数に変換(xxd)
  2. 16進数を4進数に変換(bc)
  3. 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 

仕込んだゼロ幅スペースのデコード

  1. ゼロ幅スペースを 0 1 2 3 に置換(sed)
  2. 16進数に変換(bc)
  3. バイナリに変換(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用に良さそうな4種類のゼロ幅スペースを確認する

シェル芸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
2018716日 月曜日 10:26:37 JST

他の実装

  • ExcelのVBAで風柳さんが実装しています

[Excel][VBA] ゼロ幅スペースを利用した情報隠蔽の試み
https://gist.github.com/furyutei/6bba0eaf5e0bcb4ae1ee30f916cfcb04

  • 短縮URLのサービスで実装されています

Zero Width Shortener
https://zws.im/

EncodeZeroWidthSpace.sh Magnifier (333 Bytes) kanata, 2018/05/01 16:24

DecodeZeroWidthSpace.sh Magnifier (385 Bytes) kanata, 2018/05/01 16:24

zws - Twitter用 Unicodeゼロ幅スペースぶっ込みツール (1.531 KB) kanata, 2018/07/16 10:44

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