Best abuse of system calls
システムコールの最高の悪用
受賞者:Paul Dale
引用元:https://www.ioccc.org/1988/dale.c
審査員・作者による説明:https://github.com/ioccc-src/winner/blob/main/1988/dale.hint
動作
echoと同じ。
$ gcc -traditional-cpp -o dale dale.c
$ ./dale hello world
hello world
-nオプションで改行抑制。
$ ./dale -n hello world && echo END
hello worldEND
解説
賞名の通り、システムコール関数を乱用している。
- 適当な整数を作るために
chrootやkill(1)を呼ぶ
close(0)してdup(1)してclose(1)をすることでstdoutを0番に変え、さらにpipe()を呼んで1番と2番をパイプにする
fork()して、子プロセスはコマンドライン引数を2番に書き込み、親プロセスは1番を読み出し0番(stdout)に書き出す
他に、#define case_3 defaultや#define while switchのようなフェイントは単純だけど好き。
次の難読化は現代では動かない。1つめは修正が必要、2つめと3つめは-traditional-cppで解決できる。
#define _ defineしている
#define a(x)get/***/x/***/id())としてa(u)とすることでgetuid()を作り出している(##にすれば動く)
for/*/(;;);/*/k()がfork()になることを利用している(怖い)
パッチ
パッチをダウンロード