shell指令碼中嵌入二進位制檔案
阿新 • • 發佈:2018-12-17
shell指令碼中嵌入二進位制檔案
2011年02月28日 16:39:00 ssmile 閱讀數:3836 標籤: 指令碼 shell linux 加密 解密 gcc
最近有人問我,一個叢集監控軟體的安裝檔案特別“詭異”,說腳本里有“亂碼”卻能執行,是怎麼回事?我看了才發現這個東西原來是典型的指令碼巢狀程式碼的模式,這裡就講講吧。反正好久沒寫東西了。
某些比較“拽”的單位在釋出Linux軟體時以一種特殊的形式釋出,即在shell指令碼中嵌入二進位制字元,從而使指令碼變得極其詭異,讓某些初學者感覺驚奇。其實,這個原理戳穿了非常簡單,就是在執行指令碼時將二進位制程式碼匯出成一個程式,再執行之就可以。(不過這種行為其實,是違反Linux社群的精神的,像我這種人, 看到什麼軟體第一反應都是想搞到其原始碼
1 簡單嵌入程式
原理:通常程式程式碼處在指令碼的最後位置。指令碼執行時,把它寫出來執行即可。
例:下面的這個原始碼:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
const char* envtagUSER="USER";
printf("Your Username: %s. This is detected by the program %s./n", getenv(envtagUSER), argv[0]);
return 0;
}
這段程式碼可以用來輸出使用者名稱。當然這僅僅是個例子,實際程式設計時用shell就可以得到。現在假設我們想把這段程式碼嵌入一個名叫dofoo.sh的shell指令碼中。首先編譯之:
gcc -Os foo.c -o foo
現在把foo追加到dofoo.sh的末尾:
cat foo >> dofoo.sh # Not > but >> !
開啟dofoo.sh,新增程式碼:
1 #!/bin/sh
2
3 skip=11
4 prog="/tmp/$0.exe"
5 tail -n +$skip "$0" > $prog
6 chmod u+x $prog
7 $prog
8 rm $prog
9 exit
10
11 ^?EFL^B
...
18 ....AMIC^@data_start^@__libc_csu_fini^@_sta
(11行以後用VI看都是亂碼)
看明白了吧!這程式碼將指令碼中11行以後的東西匯入到了/tmp/dofoo.exe這個檔案中,新增x許可權,執行,然後刪除該檔案。
2 加密偽裝
有時候一個shell中的亂碼並不一定是可執行檔案,那些東西可能是某種壓縮格式,如bz2,gz等等,或者其他的某種加密形式,程式會先把他們匯出來解壓在執行然後刪除,道理是一樣的。有時候,這種解壓程式或者解密程式本身就巢狀在shell腳本里,通常是商業公司乾的事。