中學生CTF——Crypto:Secret room


  最近攻防世界嘗試自學逆向題,作為操作系統總評才七十五六分的小渣渣,而且沒學過匯編語言,我這幾天學的可謂起起落落落落落落。。。連新手區的一大半題目都解不出來,於是我就尋思有沒有更簡單的練習題可以做。上網好一頓搜索,又找到了好多CTF平台,比如說bugku、WhaleCTF、國鈞CTF等等。其中有一個叫中學生CTF的,我一看這名字就決定先做這里的試試,再怎么說,中學生做的題目也不會難道哪里去吧,不過也不要看不起高中生哦,人家高中就開始打CTF了,而我高中再打LOL.....

  由於進去的時候是晚上十一點多,web題目服務器並沒開放(今天十點起來就可以得到web環境了),所以當時做了些MISC的編碼題和Crypto的題目。Crypto題目就一道,題型就是簡單的給出加密源碼,要自己找出解密邏輯,只不過難度沒有3DES那么高,也不是分組密碼模式漏洞問題,比較直白。

  題目是下圖的代碼,就這么幾行:  可以看出,要求的17位輸入才是真正的flag,輸入經過10、11行的加密運算之后,得到的密文則是題目所給列表內容。

  先研究加密邏輯,是把輸入的內容按字處理,找出這個字符對應ACSII碼數值,然后左移3位或上它右移五位,得到的結果異或123后與上255。

  這個加密運算算是比較簡單了,首先它是單純的按字運算,不涉及前后明文關聯加密,也沒有CBC模式那種密文作為IV加密的方法,其次,它給的運算是純二進制,只有移位運算和與或非。

  當時思考就是一步步拿出加密各步驟的逆運算,就是加密的逆運算——解密。加密最后一步是與運算,那么我當時就想,與的逆運算是什么呢?以下為當時思考,最后沒能成功得出有用結論,可以跳過閱讀。

  假設A&B=C,那么如果B和C已知,能求出A的運算就是與的逆運算。與都是按位與,0&1=0,0&0=0,1&1=1,只有全1才得1,否則都是0,還有a&1=a,a&0=0.利用這些規則我們能否找到與的逆運算呢?

  就單拿a&0=0這一條,就無法逆推,不過乘法里也有a*0=0,但還是有逆運算除法,只是沒有除以0罷了,因為這個是特殊情況。那么排除這個a&0=0特殊情況,能不能找到與的逆呢?

  其實沒有這個特殊情況,就只剩1情況了,這時a&b=c,b!=0,就有a=b&c。emmm。。。。好像得出的結論是一句廢話。。。

  看來思路有點偏,既然不能找到&的逆算通解,那么對於&某個特定的數,找出特解應該也可,於是我回頭一看——255?!!!

  a與上一個255不就是a嗎?!虧我花那么多時間去瞎鼓搗,原來這里就只是個障眼法的作用。。。

  不過對於倒數第二步的異或運算,就可以通過再次異或同一個數得到原數:已知A,A^B=C,有B^B=0000...,那么就有A^B^B=C^B,即A^000...=A=C^B。所以解密時我們再次異或123就可以

  接下來是兩個移位運算的或運算,我們可以手畫一下,發現對於flag列表里的數,都是8位以內的二進制數,左移3或上右移5,是正好每一位之間不沖撞的,也就是X1X2X3X4X5X6X7X8(無論第一個1在第幾位,都可以前面補0表示為八位)經過運算成為X4X5X6X7X8X1X2X3。

  與此同時我們也該清楚,這個出題人是想限制在8位運算里,左移高出八位或者右移的都要截斷,這個由於我們計算機不是8位,所以最后還要根據這個處理。

  經過我們之前的運算,可以已知X4X5X6X7X8X1X2X3,並且知道這個X4X5X6X7X8X1X2X3是怎么由ord(i)運算的來的。那么我們利用八位截斷特性,可以將X4X5X6X7X8X1X2X3左移5位得X1X2X3OOOOO或上右移三位的OOOX4X5X6X7X8,就可以得到X1X2X3X4X5X6X7X8

  但是由於我們計算機不會超過8位就給你截斷,但是右移的截斷還是有的,經過上述運算他會得到X4X5X6X7X8X1X2X3X4X5X6X7X8在這里需要我們自己處理,可以上網找類似8位截斷的函數處理,我是找了一通沒找到,直接與上0000011111111就可以把前面五位處理掉。

  解密腳本:

answer = []
for j in flag:
    answer.append(chr(0b0000011111111&(((j^123)>>3) | ((j^123)<<5))))

  最后就可以得到17個原字符串了:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM