[360第二屆大學生資訊保安]WriteUp-加密解密
解題攻略:
開啟題目連結後發現是一堆二進位制。首先選手需要寫個二進位制轉16進位制的指令碼,然後winhex開啟後發現是壓縮檔案,再另存為rar或者zip。開啟zip檔案發現是360圖示的jpg,拖到txt裡即可發現base64加密後的key,兩次base64解密即可。
1.存在文字檔案中的資料在JAVA FILE讀入時都當做字串來處理的。
就是說並不能直接將這個東西當做二進位制資料使用,因此指令碼的重心應該是如何編寫指令碼,將二進位制串轉換成二進位制資料!!
2.有個理解上的誤區。
覺得byte型別很神祕無法操作。事實上完全可以把byte型別當做int使,就像可以把char當Int使一樣的道理。比如之前會覺得
byte temp += temp;這樣的語句不可思議...
3.位元組
位元組 計算機資訊科技用於計量儲存容量和傳輸容量的一種計量單位,1個位元組等於8位二進位制。是一個很具體的儲存空間。 0x01, 0x45, 0xFA, ……
字元 人們使用的記號,抽象意義上的一個符號。 '1', '中', 'a', '$', '¥', ……
字元的傳輸是通過轉換成其ASCII碼對應的二進位制的。一個英文字元對應一個位元組。
因此,在題中的00001010是8個字元
4.重複一下,指令碼目的是:二進位制字串->二進位制檔案
產生的思路如下:字元->ascii碼->二進位制檔案
要拿到二進位制檔案,我們得通過位元組寫入,因此可以用拿到的二進位制字串來模擬位元組的8位
5.指令碼如下:
package textToBin; import java.io.DataOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; public class TextToBin { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub FileReader reader = new FileReader(new File("E:\\a.txt")); DataOutputStream dos = new DataOutputStream(new FileOutputStream(new File("E:\\b.bin"))); textToBin(reader,dos); } private static void textToBin(FileReader reader, DataOutputStream dos) throws IOException { // TODO Auto-generated method stub int a; int i=0; char charArray[] = new char[8]; byte temp = 0; while((a=reader.read())!=-1){ if(i<8){ charArray[i]=(char)a; i++; continue; } //處理足8位的位元組 for(int j=0;j<8;j++){ temp += (byte)((charArray[j]-48)*Math.pow(2, 7-j)); } dos.write(temp); //read()多讀了一個字元 charArray[0]=(char)a; i=1; temp=0; } //處理如果正好讀完的情況,最後一次的陣列沒有寫入 if(i==7){ for(int j=0;j<8;j++){ temp += (byte)((charArray[j]-48)*Math.pow(2, 7-j)); } dos.write(temp); } //處理不足8位的位元組 temp=0; for(int k=i;k<8;k++){ charArray[k]='0'; } for(int j=0;j<8;j++){ temp += (byte)((charArray[j]-48)*Math.pow(2, 7-j)); } dos.write(temp); } }
尤其注意這裡是如何表示byte型別的,實際上是用一個10進位制int型進行的型別轉換
6.換個角度想,現在有一個位元組型temp,它是如何儲存的?
通過二進位制。那這個二進位制如何表示成字元呢?
通過ASCII碼。
所以倒過來仍是對的。
7.這道題中還有一個問題,通過檢視winHex,你咋知道它是壓縮檔案?
關於這點...猜吧
8.存ASCII碼用byte[]
-------------------------------------------
1題:
<div class="panel-body"><script language='javascript'>var qrivy = eval;NanylmrgurXrl="7D6A792B606E723629383D3B2B586A6D6E7F722B4864657F6E787F2B62782B4D7E6565722A296D7E65687F6264652B48636E68605B6A78782322707D6A792B6469615B6A7878366F64687E666E657F256C6E7F4E676E666E657F4972426F23297B6A787829227D6A792B7B6A7878366469615B6A7878257D6A677E6E2B626D2329606E722920606E7225787E69787F7962656C233B27382236367B6A787822706A676E797F2329606E722B62782B62652B7B6A787829222B766E67786E706A676E797F23295F79722B6A6C6A62652A29222B7676";ArrqrqSha="function Xrlzrgubq(){qnauhnatcnv=Math.PI;cnefrVag=parseInt;sov='length';jebat0=cnefrVag(~((qnauhnatcnv&qnauhnatcnv)|(~qnauhnatcnv&qnauhnatcnv)&(qnauhnatcnv&~qnauhnatcnv)|(~qnauhnatcnv&~qnauhnatcnv)));lhn3afh=cnefrVag(((jebat0&jebat0)|(~jebat0&jebat0)&(jebat0&~jebat0)|(~jebat0&~jebat0))&1);/*Where is the key?! rot13 is the key.*/rknz6znbm=lhn3afh<<lhn3afh;erf0hygVfabg=jebat0;LbhT0gvg='';jvxvqrp0qr=eval(unescape('%5'+'3%74%'+'72%69%6'+'E%67%2E%'+'66%72%'+'6F%6D%4'+'3%68%61'+'%72%4'+'3%6F'+'%64%65'));nccy2vf=qrivy;for(c3ffc0eg=jebat0;c3ffc0eg<ArrqrqSha[sov];c3ffc0eg-=-lhn3afh)erf0hygVfabg+=ArrqrqSha.charCodeAt(c3ffc0eg);erf0hygVfabg%=unescape(jebat0+unescape('x')+(1<<6));for(c3ffc0eg=jebat0;c3ffc0eg<NanylmrgurXrl[sov];c3ffc0eg+=rknz6znbm)LbhT0gvg+=jvxvqrp0qr(cnefrVag(jebat0+unescape('x')+NanylmrgurXrl.charAt(c3ffc0eg)+NanylmrgurXrl.charAt(c3ffc0eg+cnefrVag(lhn3afh)))^erf0hygVfabg);nccy2vf(LbhT0gvg);}"</script>
加密解密第一題
解題攻略:
這道題目思路來源於之前比較流行的某款網馬生成器,變數NanylmrgurXrl是某段js程式碼根據演算法函式Xrlzrgubq()加密後的結果。選手呼叫Xrlzrgubq()函式即可將NanylmrgurXrl解出來。考察選手的js程式碼的閱讀和動手能力。
首先將script標籤中的內容拷貝到txt裡,然後將function裡內容拷貝出來放到script之間,然後將最後的nccy2vf(LbhT0gvg);換成alert(LbhT0gvg);儲存為html,點選即可看到解密後的程式碼,分析程式碼得知key在key360目錄下,開啟key360目錄後檢視原始碼,發現rot13加密後的字串,解密即可。
通過檢視原始碼,拿到這麼一大串js指令碼,key肯定和這麼多亂七八糟的東西有關,分析一下這段js指令碼:
<div class="panel-body">
<script language='javascript'>
var qrivy = eval;
NanylmrgurXrl="7D6A792B606E723629383D3B2B586A6D6E7F722B4864657F6E787F2B62782B4D7E6565722A296D7E65687F6264652B48636E68605B6A78782322707D6A792B6469615B6A7878366F64687E666E657F256C6E7F4E676E666E657F4972426F23297B6A787829227D6A792B7B6A7878366469615B6A7878257D6A677E6E2B626D2329606E722920606E7225787E69787F7962656C233B27382236367B6A787822706A676E797F2329606E722B62782B62652B7B6A787829222B766E67786E706A676E797F23295F79722B6A6C6A62652A29222B7676";
ArrqrqSha="function Xrlzrgubq()"+
"{qnauhnatcnv=Math.PI;cnefrVag=parseInt;sov='length';jebat0=cnefrVag(~((qnauhnatcnv&qnauhnatcnv)|(~qnauhnatcnv&qnauhnatcnv)&(qnauhnatcnv&~qnauhnatcnv)|(~qnauhnatcnv&~qnauhnatcnv)));lhn3afh=cnefrVag(((jebat0&jebat0)|(~jebat0&jebat0)&(jebat0&~jebat0)|(~jebat0&~jebat0))&1);/*Where is the key?! rot13 is the key.*/"+
"rknz6znbm=lhn3afh<<lhn3afh;erf0hygVfabg=jebat0;LbhT0gvg='';jvxvqrp0qr=eval(unescape('%5'+'3%74%'+'72%69%6'+'E%67%2E%'+'66%72%'+'6F%6D%4'+'3%68%61'+'%72%4'+'3%6F'+'%64%65'));nccy2vf=qrivy;for(c3ffc0eg=jebat0;c3ffc0eg<ArrqrqSha[sov];c3ffc0eg-=-lhn3afh)erf0hygVfabg+=ArrqrqSha.charCodeAt(c3ffc0eg);erf0hygVfabg%=unescape(jebat0+unescape('x')+(1<<6));for(c3ffc0eg=jebat0;c3ffc0eg<NanylmrgurXrl[sov];c3ffc0eg+=rknz6znbm)LbhT0gvg+=jvxvqrp0qr(cnefrVag(jebat0+unescape('x')+NanylmrgurXrl.charAt(c3ffc0eg)+NanylmrgurXrl.charAt(c3ffc0eg+cnefrVag(lhn3afh)))^erf0hygVfabg);"+
"nccy2vf(LbhT0gvg);}"
</script>
首先可以分段,一定注意分格式的時候字串的連結一定要用+,不能直接敲換行!!!!
<div class="panel-body">
<script language='javascript'>
var qrivy = eval;
NanylmrgurXrl="7D6A792B606E723629383D3B2B586A6D6E7F722B4864657F6E787F2B62782B4D7E6565722A296D7E65687F6264652B48636E68605B6A78782322707D6A792B6469615B6A7878366F64687E666E657F256C6E7F4E676E666E657F4972426F23297B6A787829227D6A792B7B6A7878366469615B6A7878257D6A677E6E2B626D2329606E722920606E7225787E69787F7962656C233B27382236367B6A787822706A676E797F2329606E722B62782B62652B7B6A787829222B766E67786E706A676E797F23295F79722B6A6C6A62652A29222B7676";
ArrqrqSha="function Xrlzrgubq()"+
"{qnauhnatcnv=Math.PI;cnefrVag=parseInt;sov='length';jebat0=cnefrVag(~((qnauhnatcnv&qnauhnatcnv)|(~qnauhnatcnv&qnauhnatcnv)&(qnauhnatcnv&~qnauhnatcnv)|(~qnauhnatcnv&~qnauhnatcnv)));lhn3afh=cnefrVag(((jebat0&jebat0)|(~jebat0&jebat0)&(jebat0&~jebat0)|(~jebat0&~jebat0))&1);/*Where is the key?! rot13 is the key.*/"+
"rknz6znbm=lhn3afh<<lhn3afh;erf0hygVfabg=jebat0;LbhT0gvg='';jvxvqrp0qr=eval(unescape('%5'+'3%74%'+'72%69%6'+'E%67%2E%'+'66%72%'+'6F%6D%4'+'3%68%61'+'%72%4'+'3%6F'+'%64%65'));nccy2vf=qrivy;for(c3ffc0eg=jebat0;c3ffc0eg<ArrqrqSha[sov];c3ffc0eg-=-lhn3afh)erf0hygVfabg+=ArrqrqSha.charCodeAt(c3ffc0eg);erf0hygVfabg%=unescape(jebat0+unescape('x')+(1<<6));for(c3ffc0eg=jebat0;c3ffc0eg<NanylmrgurXrl[sov];c3ffc0eg+=rknz6znbm)LbhT0gvg+=jvxvqrp0qr(cnefrVag(jebat0+unescape('x')+NanylmrgurXrl.charAt(c3ffc0eg)+NanylmrgurXrl.charAt(c3ffc0eg+cnefrVag(lhn3afh)))^erf0hygVfabg);"+
"nccy2vf(LbhT0gvg);}";
function Xrlzrgubq()
{qnauhnatcnv=Math.PI;cnefrVag=parseInt;sov='length';jebat0=cnefrVag(~((qnauhnatcnv&qnauhnatcnv)|(~qnauhnatcnv&qnauhnatcnv)&(qnauhnatcnv&~qnauhnatcnv)|(~qnauhnatcnv&~qnauhnatcnv)));lhn3afh=cnefrVag(((jebat0&jebat0)|(~jebat0&jebat0)&(jebat0&~jebat0)|(~jebat0&~jebat0))&1);/*Where is the key?! rot13 is the key.*/
rknz6znbm=lhn3afh<<lhn3afh;erf0hygVfabg=jebat0;LbhT0gvg='';jvxvqrp0qr=eval(unescape('%5'+'3%74%'+'72%69%6'+'E%67%2E%'+'66%72%'+'6F%6D%4'+'3%68%61'+'%72%4'+'3%6F'+'%64%65'));nccy2vf=qrivy;for(c3ffc0eg=jebat0;c3ffc0eg<ArrqrqSha[sov];c3ffc0eg-=-lhn3afh)erf0hygVfabg+=ArrqrqSha.charCodeAt(c3ffc0eg);erf0hygVfabg%=unescape(jebat0+unescape('x')+(1<<6));for(c3ffc0eg=jebat0;c3ffc0eg<NanylmrgurXrl[sov];c3ffc0eg+=rknz6znbm)LbhT0gvg+=jvxvqrp0qr(cnefrVag(jebat0+unescape('x')+NanylmrgurXrl.charAt(c3ffc0eg)+NanylmrgurXrl.charAt(c3ffc0eg+cnefrVag(lhn3afh)))^erf0hygVfabg);
alert(LbhT0gvg);};
Xrlzrgubq();
</script>
提取出function,修改最後為alert,呼叫Xrlzrgubq()函式。得到:
到360key下拿到
671rs4n35nsro3np2p3rrsoonn2612q2
根據js中提示,這是rot13,解密得key
671ef4a35afeb3ac2c3eefbbaa2612d2
1.字串換行一定別忘+;.字串換行一定別忘+;.字串換行一定別忘+;
2.ROT13:
一種簡易的置換暗碼,該演算法並沒有提供真正的密碼學上的保全,故它不應該被套用在需要保全的用途上。它常常被當作弱加密示例的典型
套用ROT13到一段文字上僅僅只需要檢查字元字母順序並取代它在13位之後 ROT13 的對應字母,有需要超過時則重新繞回26英文字母開頭即可[2]。A換成N、B換成O、依此類推到M換成Z,然後序列反轉:N換成A、O換成B、最後Z換成M。只有這些出現在英文字母裡頭的字元受影響;數字、符號、空白字元以及所有其他字元都不變。因為只有在英文字母表裡頭只有26個,並且26=2×13,ROT13函式是它自己的逆反: 對任何字元x:ROT13(ROT13(x))=ROT26(x)=x。 換句話說,兩個連續的ROT13應用函式會回覆原始文字(在數學上,這有時稱之為對合(involution);在密碼學上,這叫做對等加密(reciprocalcipher))。 轉換可以利用查詢表完成,如下例所示:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz |
NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm |
How can you tell an extrovert from an introvert at NSA?Va gur ryringbef, gur rkgebireg ybbxf ng gur BGURE thl'f fubrf. |
Ubj pna lbh gryy na rkgebireg sebz na vagebireg ng AFN?In the elevators, the extrovert looks at the OTHER guy's shoes. |
3.呼叫Js函式的方法:
<form>
<input type="button" onclick="Xrlzrgubq()";>
</form>
或直接在指令碼中寫:Xrlzrgubq();
--------------------------------------------------------------------------------------------
6.提示:下載圖片獲得通關密碼
解題攻略:
將圖片pass.gif下載後,字尾名改為rar,解壓得到pass.txt 破解NTLM密文,得到通關金鑰。
解壓得pass.txt檔案:
將 AAD3B435B51404EEAAD3B435B51404EE:DBDAAAC4D524F0DF9B34CCC255D061B5 解密後,與 e61e06202691107480213a6e369097d2 合併後作為通關密碼.
通過http://www.hashkiller.co.uk/ntlm-decrypter.aspx破解NTLM密文
轉:http://m.blog.csdn.net/blog/ask_man/41282331
密文型別 |
格式舉例 |
md5 |
e10adc3949ba59abbe56e057f20f883e 標準md5,32位或16位 |
md5(md5($pass)) |
b80c9c5f86de74f0090fc1a88b27ef34 第一次加密後,結果轉換成小寫,對結果再加密一次 |
md5(md5(md5($pass))) |
e57941ff9000aedb44eb2fa13f6e3e3c 第一次加密後,結果轉換成小寫,對結果再加密一次,結果轉換成小寫,對結果再加密一次 |
MD5(MD5($pass)) |
bb7ff6177ee612ef9dc6acd3a9ea7ea9 第一次加密後,結果轉換成大寫,對結果再加密一次 |
MD5(MD5(MD5($pass))) |
36d627bd562e83ab995fb1fdf59c95d9 第一次加密後,結果轉換成大寫,對結果再加密一次,結果轉換成大寫,對結果再加密一次 |
sha1 |
f03e8a370aa8dc80f63a6d67401a692ae72fa530 密文長度必須為40位 |
md4 |
c0a27f801162b8b862cd5f5a1a66e85a 32位 |
mysql |
29596332026fd206 老MYSQL資料庫用的,16位,且第1位和第7位必須為0-8 |
mysql5 |
b34c662f720236babfc1b3f75203a80e1009844a 新版本MySql資料庫用的 |
md5($pass.$salt) |
9393dc56f0c683b7bba9b3751d0f6a46:OTD6v4c8I3Zid2AL 在密碼後附加一個字串再加密。 |
md5($salt.$pass) |
5610604c157ef1d0fb33911542e5b06f:zg 在密碼前附加一個字串再加密。 |
md5(md5($pass).$salt); |
30e23a848506770eca92faed1bd9f3ec:gM5 用於dz,vB等論壇程式,discuz的salt長度是6位,vBulletin的salt長度是3位或30位。 |
md5(md5($salt).md5($pass)) |
ac8dfc54ba110487b86ad6514328fd49:[email protected]} salt長度5位 |
sha1($salt.$pass) |
9cea8c041ce88e0b2066343d819113005b80421c:2391 用於SMF |
Md5(Phpbb3) |
$H$912345678Mw/BjmincvnSS94/STawW/ Linux |
Md5(Wordpress) |
$P$B12345678/c7bOMfLdQB9B/ypks8iB/ Linux |
Md5(Unix) |
$1$12345678$kbapHduhihjieYIUP66Xt/ Linux |
Des(Unix) |
af.kPXROLU9uY Linux |
ntlm |
71dd0709187df68befd20973fc23f973 Windows |
Domain Cached Credentials |
1aefd85a507965a6f1719e951b81d0f7 Windows |
sha256 |
8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918 |
sha256($pass.$salt) |
1ec82d9b57403e53fafcf0ad8a86db196d135ef7513443a985385d7c20bdbfbd:abcdabcd |
sha256($salt.$pass) |
a6a4ccd14c6b21c63b8a0d38cfb7ead3e5032c58fdea7cd8a4da901db9462088:abcdabcd |
判斷字串加密型別是關鍵
---------------------------------------------------------------------------------------
16題:
提示:這是一道古典演算法題,不過我們稍微改了改~,下面是兩組明文密文對照,請嘗試解開最終密文,提交即可獲得通關金鑰.