一次用shell解密base64加密的文本的過程

原文:http://blog.chinaunix.net/space.php?uid=25557346&do=blog&id=3191546

今天應一網友需要,要把一個用base64 加密的文本解密出來,本來覺得這個應該比較簡單,但當拿到這個文本的時候,覺得並不像想象中的那麼簡單。這個文本是這樣的,我截取了其中的一小部分出來:
 

點擊(此處)摺疊或打開

  1. 2|數據庫概要|c2VsZWN0IGEubmFtZSAiREIgTmFtZSIsIA0KICAgICAgIGUuZ2xvYmFsX25hbWUgIkdsb2JhbCBO
  2. YW1lIiwgDQogICAgICAgYy5ob3N0X25hbWUgIkhvc3QgTmFtZSIsIA0KICAgICAgIGMuaW5zdGFu
  3. Y2VfbmFtZSAiSW5zdGFuY2UgTmFtZSIgLCANCiAgICAgICBERUNPREUoYy5sb2dpbnMsJ1JFU1RS
  4. SUNURUQnLCdZRVMnLCdOTycpICJSZXN0cmljdGVkIE1vZGUiLA0KICAgICAgIGEubG9nX21vZGUg
  5. ICJBcmNoaXZlIExvZyBNb2RlIiAgDQpGUk9NIHYkZGF0YWJhc2UgYSwgdiR2ZXJzaW9uIGIsIHYk
  6. aW5zdGFuY2UgYyxnbG9iYWxfbmFtZSBlICANCldIRVJFIGIuYmFubmVyIExJS0UgJyVPcmFjbGUl
  7. Jzs=|0||0||1|1||
  8. 3|參數文件(是spfile還是pfile)|c2VsZWN0IG52bCh2YWx1ZSwncGZpbGUnKSAiUGFyYW1ldGVyX0ZpbGUiIA0KZnJvbSB2JHBhcmFt
  9. ZXRlciB3aGVyZSBOYW1lPSdzcGZpbGUnOw==|0||0||1|1||
  10. 4|非默認的參數|c2VsZWN0IG5hbWUsIHJ0cmltKHZhbHVlKSAicHZhbHVlIiANCmZyb20gdiRwYXJhbWV0ZXIgIA0K
  11. d2hlcmUgaXNkZWZhdWx0ID0gJ0ZBTFNFJyANCm9yZGVyIGJ5IG5hbWU7|0||0||1|1||
  12. 5|控制文件及其狀態|c2VsZWN0IE5hbWUsU3RhdHVzIGZyb20gdiRjb250cm9sZmlsZTs=|0||0||1|1||

觀察以上文本,我們首先需要把這個文本的一些行給合併掉,就是每行都是應該以數字打頭,例如:2|數據庫概要|c2VsZWN0IGEubmFtZSAiREIgTmFtZSIsIA0KIC,這種形式,然後再抽取每行中那個加密了的域。而現在的文本中,大多數行都不是這種形式,這就需要把不是這種形式行往上合併,合成一個完整的行。

爲此我寫了個腳本,既合併行,腳本如下:


點擊(此處)摺疊或打開

  1. #! /bin/bash
  2. #FILE=/root/test.txt
  3. NEWFILE=/root/script/newfile
  4. TEMPFILE=/root/script/temp
  5. LINENUM=`wc -l $NEWFILE | awk '{ print $1 }'`
  6. LINE1=1
  7. while read LINE
  8. do
  9. echo $LINE1 | grep '^[0-9]\{1,\}|'
  10. FLAG1=$?
  11. echo $LINE | grep '^[0-9]\{1,\}|'
  12. FLAG2=$?
  13. if [ $FLAG1 -eq 0 ]
  14. then
  15. if [ $FLAG2 -eq 0 ]
  16. then
  17. echo $LINE1 >> $NEWFILE
  18. else
  19. echo -n $LINE1 >> $NEWFILE
  20. fi
  21. else
  22. if [ $FLAG2 -eq 0 ]
  23. then
  24. echo $LINE1 >> $NEWFILE
  25. else
  26. echo -n $LINE1 >> $NEWFILE
  27. fi
  28. fi
  29. LINE1=$LINE
  30. done < $TEMPFILE

其中 TEMOFILE  既要處理的文本,NEWFILE 爲處理以後的文本,此腳本運行原理就是每次截取一行,判斷這一行的前一行的開頭是不是以數字打頭,數字後面是‘|’,如果是就是換行輸入到NEWFILE,如果不是,就接着輸入到上一行的末尾。

處理過後的文本如下:


 

點擊(此處)摺疊或打開

  1. 2|數據庫概要|c2VsZWN0IGEubmFtZSAiREIgTmFtZSIsIA0KICAgICAgIGUuZ2xvYmFsX25hbWUgIkdsb2JhbCBO^MYW1lIiwgDQogICAgICAgYy5ob3N0X25hbWUgIkhvc3QgTmFtZSIsIA0KICAgICAgIGMuaW5zdGFu^MY2VfbmFtZSAiSW5zdGFuY2UgTmFtZSIgLCANCiAgICAgICBERUNPREUoYy5sb2dpbnMsJ1JFU1RS^MSUNURUQnLCdZRVMnLCdOTycpICJSZXN0cmljdGVkIE1vZGUiLA0KICAgICAgIGEubG9nX21vZGUg^MICJBcmNoaXZlIExvZyBNb2RlIiAgDQpGUk9NIHYkZGF0YWJhc2UgYSwgdiR2ZXJzaW9uIGIsIHYk^MaW5zdGFuY2UgYyxnbG9iYWxfbmFtZSBlICANCldIRVJFIGIuYmFubmVyIExJS0UgJyVPcmFjbGUl^MJzs=|0||0||1|1||
  2. 3|參數文件(是spfile還是pfile)|c2VsZWN0IG52bCh2YWx1ZSwncGZpbGUnKSAiUGFyYW1ldGVyX0ZpbGUiIA0KZnJvbSB2JHBhcmFt^MZXRlciB3aGVyZSBOYW1lPSdzcGZpbGUnOw==|0||0||1|1||
  3. 4|非默認的參數|c2VsZWN0IG5hbWUsIHJ0cmltKHZhbHVlKSAicHZhbHVlIiANCmZyb20gdiRwYXJhbWV0ZXIgIA0K^Md2hlcmUgaXNkZWZhdWx0ID0gJ0ZBTFNFJyANCm9yZGVyIGJ5IG5hbWU7|0||0||1|1||
    可以看出需要合併的行已經給合併了!

一下步,就是要提取需要加密的域, 命令如下:

Awk F| {print $3} NEWFILE >> file1  把域3輸入到file1:

   截取了file1 文件的第一行:

點擊(此處)摺疊或打開

  1. c2VsZWN0IGEubmFtZSAiREIgTmFtZSIsIA0KICAgICAgIGUuZ2xvYmFsX25hbWUgIkdsb2JhbCBO^MYW1lIiwgDQogICAgICAgYy5ob3N0X25hbWUgIkhvc3QgTmFtZSIsIA0KICAgICAgIGMuaW5zdGFu^MY2VfbmFtZSAiSW5zdGFuY2UgTmFtZSIgLCANCiAgICAgICBERUNPREUoYy5sb2dpbnMsJ1JFU1RS^MSUNURUQnLCdZRVMnLCdOTycpICJSZXN0cmljdGVkIE1vZGUiLA0KICAgICAgIGEubG9nX21vZGUg^MICJBcmNoaXZlIExvZyBNb2RlIiAgDQpGUk9NIHYkZGF0YWJhc2UgYSwgdiR2ZXJzaW9uIGIsIHYk^MaW5zdGFuY2UgYyxnbG9iYWxfbmFtZSBlICANCldIRVJFIGIuYmFubmVyIExJS0UgJyVPcmFjbGUl^MJzs=

   這個就是加了base64密的字符,現在我們還不能直接把base64 來解密,因爲文本字符中有大量^M ,我們需要把^M  去掉,

命令如下:cat v file1 | sed  s/\^M//g >> file2

截取了file2文件的第一行:

點擊(此處)摺疊或打開

  1. c2VsZWN0IGEubmFtZSAiREIgTmFtZSIsIA0KICAgICAgIGUuZ2xvYmFsX25hbWUgIkdsb2JhbCBOYW1lIiwgDQogICAgICAgYy5ob3N0X25hbWUgIkhvc3QgTmFtZSIsIA0KICAgICAgIGMuaW5zdGFuY2VfbmFtZSAiSW5zdGFuY2UgTmFtZSIgLCANCiAgICAgICBERUNPREUoYy5sb2dpbnMsJ1JFU1RSSUNURUQnLCdZRVMnLCdOTycpICJSZXN0cmljdGVkIE1vZGUiLA0KICAgICAgIGEubG9nX21vZGUgICJBcmNoaXZlIExvZyBNb2RlIiAgDQpGUk9NIHYkZGF0YWJhc2UgYSwgdiR2ZXJzaW9uIGIsIHYkaW5zdGFuY2UgYyxnbG9iYWxfbmFtZSBlICANCldIRVJFIGIuYmFubmVyIExJS0UgJyVPcmFjbGUlJzs=

可以發現^M 已經被處理掉了。 

現在我們已經把前期所有的準備工作做好了,現在就可以開始解密了,腳本如下:


 

點擊(此處)摺疊或打開

  1. #!/ bin/bash
  2. CURRPATH=/root/script
  3. while read LINE
  4. do
  5. echo $LINE | base64 -d >> $CURRPATH/sql.sql
  6. echo >> $CURRPATH/sql.sql
  7. echo >> $CURRPATH/sql.sql
  8. done < /root/script/file2

解密出來的語句就是(截取了解密出來的文件第一條語句):

點擊(此處)摺疊或打開

  1. select a.name "DB Name", 
  2.        e.global_name "Global Name", 
  3.        c.host_name "Host Name", 
  4.        c.instance_name "Instance Name" , 
  5.        DECODE(c.logins,'RESTRICTED','YES','NO') "Restricted Mode",
  6.        a.log_mode "Archive Log Mode" 
  7. FROM v$database a, v$version b, v$instance c,global_name e 
  8. WHERE b.banner LIKE '%Oracle%';

 

總結:其實這次工作最有樂趣的還是用shell 對文本的處理,在處理的過程中也走了不少彎路,尤其是在合併行的時候,但最終還是把文本給處理好了!我覺得最重要的還是要理清怎麼來處理這個文本,shell 只不過是幾個命令的組合,而命令的組合就需要我們對文本處理的思路了!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章