Permissions

如何從 chmod -x chmod 中恢復?

  • July 14, 2016

假設您無法訪問網際網路也無法重新啟動機器,我該如何恢復

chmod -x chmod

?

1 - 使用一種程式語言來實現chmod

紅寶石:

ruby -e 'require "fileutils"; FileUtils.chmod 0755, “chmod"'

Python:

python -c "import os;os.chmod('/bin/chmod', 0755)”

珀爾:

perl -e 'chmod 0755, “chmod”'

節點.js:

require("fs").chmod("/bin/chmod", 0755);

C:

$ cat - > restore_chmod.c 
#include <sys/types.h>
#include <sys/stat.h>

int main () {
   chmod( "/bin/chmod", 0000755 );
}
^D

$ cc restore_chmod.c

$ ./a.out

2 - 使用 chmod 創建另一個執行檔

通過創建執行檔:

$ cat - > chmod.c 
int main () { }
^D

$ cc chmod.c

$ cat /bin/chmod > a.out

通過複製執行檔:

$ cp cat new_chmod

$ cat chmod > new_chmod

3 - 啟動 BusyBox(裡面有 chmod)

4 - 使用 Gnu Tar

創建具有特定權限的存檔並使用它來恢復 chmod:

$ tar --mode 0755 -cf chmod.tar /bin/chmod

$ tar xvf chmod.tar

做同樣的事情,但在執行中,甚至不費心創建文件:

tar --mode 755 -cvf - chmod | tar xvf -

打開一個到另一台機器的套接字,創建一個存檔並在本地恢復它:

$ tar --preserve-permissions -cf chmod.tar chmod

$ tar xvf chmod.tar

另一種可能性是定期創建存檔,然後對其進行編輯以更改權限。

5 -cpio

cpio允許您操作檔案;執行時cpio file,前 21 個字節後有 3 個字節表示文件權限;如果你編輯這些,你很高興:

echo chmod |
 cpio -o |
 perl -pe 's/^(.{21}).../${1}755/' |
 cpio -i -u

6 - 動態載入器

/bin/ld.so chmod +x chmod

(實際路徑可能有所不同)

7 -/proc巫術(未經測試)

一步步:

  • 做一些強制 inode 進入記憶體的事情(attrib, ls -@, 等等)
  • 檢查 kcore 的 VFS 結構
  • 使用sed或類似的東西在核心沒有意識到的情況下改變執行位
  • 執行chmod +x chmod一次

8 - 時間旅行(git;尚未測試)

首先,讓我們確保我們不會妨礙其他所有事情:

$ mkdir sandbox
$ mv chmod sandbox/
$ cd sandbox

現在讓我們創建一個儲存庫並將其標記為我們可以返回的內容:

$ git init
$ git add chmod
$ git commit -m '1985'

現在是時間旅行:

$ rm chmod
$ git-update-index --chmod=+x chmod
$ git checkout '1985'

應該有一堆基於 git 的解決方案,但我應該警告你,你可能會遇到一個實際嘗試使用系統的 git 腳本chmod

9 - 以火攻堅

如果我們可以用另一個作業系統來對抗一個作業系統,那就太好了。也就是說,如果我們能夠在機器內部啟動作業系統並讓它可以訪問外部文件系統。不幸的是,您啟動的幾乎每個作業系統都將位於某種 Docker、Container、Jail 等中。所以,遺憾的是,這是不可能的。

或者是嗎?

這是EMAC解決方案:

Ctrl+x b > *scratch* 
(set-file-modes "/bin/chmod" (string-to-number "0755" 8))
Ctrl+j

10 - 維姆

EMACs 解決方案的唯一問題是我實際上是一個 Vim 類型的人。當我第一次深入研究這個話題時,Vim 沒有辦法做到這一點,但近年來有人對宇宙進行了修正,這意味著我們現在可以這樣做:

vim -c "call setfperm('chmod', 'rwxrwxrwx') | quit"

引用自:https://unix.stackexchange.com/questions/295925