【44GG44KT44GT】第62回シェル芸勉強会【44G+44G/44KM】

今回はバイナリデータの操作を中心とした問題が多く出されました。以前よりはいくらかましになったとはいえ答えを考えるのに結構苦労したのですが、問題を作る側はもっと苦労されたのではと思います(問題作成および解説配信をされた上田会長に感謝)。



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

このワンライナーを実行すると、次のような画像が生成されます。

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周年記念なので
うんこ贈呈
Written on December 8, 2022