catコマンドの文字列もddで置換できるか


アニメ『ネコぱらOVA』
もう一昨年前の話ですが、クラウドファンディングでたった42分で10万ドル達成ってすごいですねえ。(wikiより)
こういう話を聞くと、コツコツ貯めるのは、やはりお金ではなく、自分のスキルやセンスであるべきという気がしてきます。
いや、スキルというか、単純にかわいいが正義ってことなのかもしれません。お金を出す人たちはみんな、かわいい絵が好きなんです!
私もです!

今回もELFと戯れます。
今までは自作のa.outをバイナリ修正して、文字列置換しましたが、既存のコマンド、たとえば、/bin/catにも同じようなことができるのか試してみます。
直接/bin/catを修正すると後々支障がでるので、コピーしたファイルを使います。

catコマンドをコピーします。

takk@deb9:~/tmp$ cp /bin/cat .
takk@deb9:~/tmp$

ヘルプを確認。

takk@deb9:~/tmp$ ./cat --help | head
使用法: cat [オプション]... [ファイル]...
Concatenate FILE(s) to standard output.

FILE の指定がなかったり, - であった場合, 標準入力から読み込みます.

  -A, --show-all           equivalent to -vET
  -b, --number-nonblank    number nonempty output lines, overrides -n
  -e                       equivalent to -vE
  -E, --show-ends          display $ at end of each line
  -n, --number             number all output lines
takk@deb9:~/tmp$ 

ヘルプメッセージの、Concatenate~の行を他の文字列に置換することにします。

Concatenateの文字列の位置を確認。

takk@deb9:~/tmp$ strings ./cat -td | grep Concat
  23632 Concatenate FILE(s) to standard output.
takk@deb9:~/tmp$ 

次に置換する文字列のサイズを確認します。catらしく「にゃあああ」にします。

takk@deb9:~/tmp$ echo -ne "にゃあああ\x0" | hd
00000000  e3 81 ab e3 82 83 e3 81  82 e3 81 82 e3 81 82 00  |................|
00000010
takk@deb9:~/tmp$

NULL(0)を合わせて、16 Byteです。

ddでcatコマンドをバイナリ修正。

takk@deb9:~/tmp$ echo -ne "にゃあああ\x0" | dd seek=23632 bs=1 count=16 of=./cat conv=notrunc
16+0 レコード入力
16+0 レコード出力
16 bytes copied, 0.000364255 s, 43.9 kB/s
takk@deb9:~/tmp$

では、修正後のcatコマンドで、ヘルプを表示してみましょう。

takk@deb9:~/tmp$ ./cat --help | head
使用法: ./cat [オプション]... [ファイル]...
にゃあああ
FILE の指定がなかったり, - であった場合, 標準入力から読み込みます.

  -A, --show-all           equivalent to -vET
  -b, --number-nonblank    number nonempty output lines, overrides -n
  -e                       equivalent to -vE
  -E, --show-ends          display $ at end of each line
  -n, --number             number all output lines
  -s, --squeeze-blank      suppress repeated empty output lines
takk@deb9:~/tmp$ 

にゃあああに置き換わりました。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA