【44GG44KT44GT】第62回シェル芸勉強会【44G+44G/44KM】
今回はバイナリデータの操作を中心とした問題が多く出されました。以前よりはいくらかましになったとはいえ答えを考えるのに結構苦労したのですが、問題を作る側はもっと苦労されたのではと思います(問題作成および解説配信をされた上田会長に感謝)。
- 名称: jus共催 第62回シェル芸って誰かが言い始めて10周年シェル芸勉強会
- 開催日: 2022年12月3日(土)
- アナウンスページ:
- Youtubeライブ配信録画:
- Togetterまとめ: https://togetter.com/li/1981646
- リンク集: https://b.ueda.tech/?post=shellgei_62_link
-
問題で使われているデータファイルの入手方法:
git clone https://github.com/ryuichiueda/ShellGeiData.git
Q1
message.pptx
のデータを大吟醸の米のごとく削っていき、unko
という文字を画面に出力させてください。ワンライナー中でunko
と打っても構いませんが、データに何か付け足したり、データを変更してはいけません。
A1
$ strings message.pptx | sed -Ez 's/.{123}//;s/(.).{139}/\1/;s/(..).{330}/\1/;s/(...).{14}/\1/;s/(.{4}).+/\1\n/'
unko
Q2
img
ディレクトリにある拡張子png
のファイルについて、PNG形式かどうか判別してください。PNGに似せた怪しいファイルはありません。できる人はファイル内のバイナリから判断しましょう。
出力は次のようにしてください。(2列目のPNG/PNGじゃない
は適当ですので、ファイルの内容に合わせて正しく出力してください。)
img1.png PNG
img2.png PNG
img3.png PNGじゃない
img4.png PNGじゃない
A2
$ file *.png | awk '{sub(/:/,"",$1);print $1,($2~/^PNG/?"PNG":"PNGじゃない")}'
img1.png PNG
img2.png PNGじゃない
img3.png PNG
img4.png PNGじゃない
別解は次の通りです。
$ ls *.png | while read i; do (printf "$i "; strings "$i" | head -n1 | tr -d '\n'; echo) | awk '{print $1,$2~/^IHDR/?"PNG":"PNGじゃない"}'; done
img1.png PNG
img2.png PNGじゃない
img3.png PNG
img4.png PNGじゃない
Q3
次の画像program.png
にはプログラムが仕込まれていますので実行してみてください。(ヒント: PGM画像をconvert
して作りました。)
A3
# 32ビット環境だと実行形式エラーが発生する
$ convert program.png pgm:- | awk 'NR>3' > A3.o && chmod a+x A3.o && ./A3.o
bash: ./A3.o: バイナリファイルを実行できません: 実行形式エラー
# 64ビット環境用であることを確認
$ file A3.o
A3.o: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=27036e54dcac6372cd6cffc9c84332e3f4ca5f9e, for GNU/Linux 3.2.0, not stripped
別解(環境非依存)は次の通りです。
# 実行形式エラーが発生する場合は、`objdump`を利用し、実行時に表示されるデータを抽出して対応
$ convert program.png pgm:- | awk 'NR>3' > A3.o && objdump -j .rodata -s A3.o | awk 'NR==5{printf $4$5}NR==6{printf $2$3$4$5}NR==7{printf $2$3}' | sed 's/0$/a/' | xxd -p -r
これはUNKOの画像です。
Q4
Q3のようなプログラムを埋め込んだ画像ファイルを作ってみましょう。悪用厳禁。
A4
一例ですが、シェルスクリプトを埋め込む解答例のワンライナーは次の通りです。
$ printf '#/bin/sh\necho 💩\n' > A4.sh && truncate -s256 A4.sh && sed '1s/^/P5\n16 16\n255\n/' A4.sh | convert pgm:- A4.png
このワンライナーを実行すると、次のような画像が生成されます。
そして、この画像ファイルからプログラムを抽出して実行します。
$ convert A4.png pgm:- | awk 'NR>3' > A4.bin && chmod a+x A4.bin && ./A4.bin
💩
画像ファイルにプログラムが埋め込まれていることが確認できました。
Q5
パワーポイントのファイルmessage.pptx
の中に書いてあるメッセージを端末上に表示してください。
A5
# 1. `loimpress`(LibreOffice Impress)のヘッドレスモードを利用して、PPTXファイルをPDFファイルに変換
# 2. `pdftotext`でPDFファイルをプレーンテキストに変換し、標準出力に出力
$ loimpress --headless --convert-to pdf message.pptx 1>/dev/null 2>/dev/null && pdftotext message.pdf -
メッセージ
• これを読んでいるころは、
シェル芸勉強会に参加されていることでしょう。
• どうせ、yes ウンコとかコマンドを
打たさせていると思うと、大変残念です。
• どんまいける!
別解は次の通りです。
$ unzip -p message.pptx ppt/slides/slide1.xml | sed 's/<[^>]*>/\n/g' | sed '/^\x0D\?$/d'
メッセージ
これを読んでいるころは、
シェル芸勉強会に参加されていることでしょう。
どうせ、yes ウンコとかコマンドを
打たさせていると思うと、大変残念です。
どんまいける!
Q6
nanika_data.tar
にアーカイブされているファイルを編集した時間順に並べると、ファイル名とファイルの中身で作文が完成しますので、
- (小問1)とりあえずファイルを時刻順にソートしてください。
tar
を使わず、cat nanika_data.tar
からはじめてください。 - (小問2)その後、雑でもいいので作文だけ取り出してください。
参考資料: http://redout.net/data/tar.html
A6
A6小問1
$ cat nanika_data.tar | sed -Ez 's|\./|\n&|g;s|(ー)\n(る)|\1\2|g;s|\.txt|& |' | sed -E 's/\x00//g;/\.txt/!d;/^\./!d;s/[0-9]{32}/& /' | sort -k3,3n | awk '{print $1}'
./たーぼーる/シェル芸.txt
./たーぼーる/10周年.txt
./たーぼーる/うんこ.txt
A6小問2
$ cat nanika_data.tar | sed -Ez 's|\./|\n&|g;s|(ー)\n(る)|\1\2|g;s|\.txt|& |' | sed -E 's/\x00//g;/\.txt/!d;/^\./!d;s/[0-9]{32}/& /' | sort -k3,3n | sed 's|^.*/||;s|\..*ueda||'
シェル芸勉強会
10周年記念なので
うんこ贈呈