たいちょーの雑記

ぼくが3日に一度くらい雑記をかくところ

難読化dateコレクション-2-PNGChunk利用

難読化dateしましょう

難読化dateコレクション、略して難daコレは難読化された date コマンド(略して難da)を集めた聖典です

dateコマンド

$ date
20191211日 水曜日 20:31:43 JST

見ての通り日付を出力するツール。coreutils に入っている。
PowerShellにも Get-Date なるものがある。PowerShellだと、 Get を取ってもいいのと、大文字小文字が関係ないことから同じように date で日付が得られる。

# powershell
$ Get-Date
2019年12月11日 20:35:30

$ date
2019年12月11日 20:35:30

PNGChunk利用難da

$ convert -size 1x1 xc:white png:-|strings|grep -aoP "....(?=:)"|bash
20191216日 月曜日 22:44:02 JST

convertコマンドでPNG画像を生成。convertが付加してくれてるChunkを利用する方法

動作確認した環境

$ bash --version
GNU bash, バージョン 5.0.11(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$ zsh --version
zsh 5.7.1 (x86_64-debian-linux-gnu)
  • convert
$ convert --version
Version: ImageMagick 6.9.10-23 Q16 x86_64 20190101 https://imagemagick.org
Copyright: © 1999-2019 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC Modules OpenMP 
Delegates (built-in): bzlib djvu fftw fontconfig freetype heic jbig jng jp2 jpeg lcms lqr ltdl lzma openexr pangocairo png tiff webp wmf x xml zlib
$ grep --version
grep (GNU grep) 3.3
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others; see
<https://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.

解説

難daをパイプで分解します。

1: convert -size 1x1 xc:white png:-
2: strings
3: grep -aoP "....(?=:)"
4: bash

1: convert -size 1x1 xc:white png:-

ImageMagickconvertコマンドで画像を生成したり、加工したりできる。

imagemagick.org

convertPNGを作るとき、色んな情報を付加してくれる。例えばこんなの

$ convert -size 1x1 xc:white png:-|strings
IHDR
gAMA
 cHRM
bKGD
tIME
IDAT
%tEXtdate:create
2019-12-16T22:31:17+09:00
%tEXtdate:modify
2019-12-16T22:31:17+09:00
IEND

ホントはもっとバイナリっぽいんだけどstringsで読めるところだけ出力している。
出力を見てもらうとわかるのだけど EXtdate:create という行と EXtdate:modify という行がある。今回はこれを利用してdateを発動させる。

ちなみにこの付加情報は-strip-define png:exlude-chunk=valueで削除できる。明示的に付加したいときは-define png:include-chunk=valueを使えば良い。

ともあれ、この難daではサイズが1x1な白単色の画像をSTDOUTに出力している。-size 1x1 がサイズ指定、xc:white が白指定になる。

2: strings

バイナリを読むときとかに使いがちな strings。この難daで使っているのは上の節でやったような「読めるところだけ取り出す」なので説明はない…

3: grep -m1 -oP "....(?=:)"

grep....: という文字列を引っ掛ける。
正規表現中の(?=:)というのは先読みの一種で、xyz(?=a) という正規表現xyza にマッチし、一致箇所として xyz を返す。

$ echo -e "1:xyza\n2:xyzt"
1:xyza
2:xyzt
$ echo -e "1:xyza\n2:xyzt" |grep -oP "[0-9]:xyz(?=a)"
1:xyz

この難daでは ....(?=:)任意の四文字の後に:が来る 部分を取り出してる。すると一番最初のマッチが date になるので -m1 で1つマッチしたら終了している。

4: bash

いうことなし!!

おわりに

今回は、何回か前のシェル芸勉強会でconvertを頑張って使う問題が結構あったときからちょいちょい小出しにしていた難daでした。これまではsedとかで切り出していたんですが、先日正規表現?=patternを学んだので、これを利用しつつ新たにやってみました。結構短めで気に入っています