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()
になることを利用している(怖い)
パッチ
パッチをダウンロード