私はこの文章(下)を何度も読みました。最近ではここdd
、パッチの使い方について混乱しました。何もないコンパイラは言うまでもありません。
30年前、私が学校で使用していたUnixシステムは、RAMとディスク容量が非常に限られていました。特に、
/usr/tmp
ファイルシステムが非常に小さいため、誰かが大きなプログラムをコンパイルしようとすると問題が発生する可能性があります。もちろん、学生はとにかく「大きなプログラム」を書いてはいけません。大規模なプログラムは通常、「どこか」からコピーされたソースコードです。私たちの多く/usr/bin/cc
は/home/<myname>/cc
、dd
置き換えるバイナリ/tmp
パッチ用/usr/tmp
、どれがより大きいか。もちろん、これは問題をさらに悪化させるだけです。当時、これらのコピーが占めるディスク容量は非常に重要でしたが、今/tmp
はいっぱいで、他のユーザーがファイルを編集できないようにすることがよくあります。何が起こっているのかを発見した後、システム管理者はchmod go-r /bin/* /usr/bin/*
「修正」を実行し、Cコンパイラのすべてのコピーを削除しました。
(強調は私のもの)
マニュアルページにはdd
パッチへの言及はなく、とにかく用途の変更ができないとします。
バイナリは実際にパッチできますかdd
?これは歴史的意味がありますか?
ベストアンサー1
やってみようこれは単純なCプログラムです:
#include <stdio.h>
int main(int argc, char **argv) {
puts("/usr/tmp");
}
私たちはそれを次のように構築しますtest
:
$ cc -o test test.c
実行すると、「/usr/tmp」が印刷されます。
/usr/tmp
バイナリで「」がどこにあるかを見てみましょう。
$ strings -t d test | grep /usr/tmp
1460 /usr/tmp
-t d
10進数で印刷オフセット見つかった文字列ごとにファイルに追加します。
/tmp\0
それでは、 ""だけを含む一時ファイルを作成しましょう。
$ printf "/tmp\x00" > tmp
これでバイナリがあるので、変更したい文字列がどこにあるかを知っていて、代替文字列を含むファイルがあります。
これで次のことができますdd
。
$ dd if=tmp of=test obs=1 seek=1460 conv=notrunc
tmp
(" "ファイル)からデータを読み込み/tmp\0
、1バイトの出力ブロックサイズを使用してバイナリファイルに書き込み、何も書き込み前に以前に見つかったオフセットにジャンプし、完了すると消去します。ファイルは切り捨てられません。
パッチ付き実行ファイルを実行できます。
$ ./test
/tmp
プログラムによって印刷された文字列リテラルは変更され、今度は " /tmp\0tmp\0
"が含まれますが、文字列関数は最初のヌルバイトを見るとすぐに停止します。このパッチを使用すると、文字列を短くしたり、同じ長さにすることができますが、これ以上作成することはできませんが、この目的には十分です。
だから私たちは物をパッチするのに使うことができるだけでなく、dd
すでにやってきました。