HFSEC——Crypto兩道(base64 more和base64 harder)

  最近準備比賽,因爲本身彙編學的很差,逆向和pwn沒打算練,目前在網上各大CTF平臺找web中下難度題目和Crypto題目練手,就在剛纔,作web題目查閱資料時,突然發現這個知識點應該是以前一個Crypto題目的解法,因而興奮地找到原題目,一番折騰後終於成功了,因而就趕忙過來發泄下本身的喜悅,而後再記錄下解題過程。php

  HFSEC的兩道Crypto題目都是深刻到base編碼原理的。html

  第一道 base64 more
web

  題目:base64默認的字符表被修改過了~正則表達式

  給的是源碼,仔細一看仍是很好理解的,是讓你get方法傳入字符串,可是除非傳入的是正確的flag,否則必定會輸出編碼後的flag。瀏覽器

  再看加密過程,發現出了編碼表變了順序以外,和base64原版加密沒有任何不一樣,都是每三個字節爲一組進行處理,經過左右移位,而後拼接補位處理,湊出四個字節,對應編碼表輸出便可,這也是base64的代碼實現。函數

  那麼就很容易了,base64解密過程也是不變的,修改後的編碼表源碼已經給出,直接使用這張表對給出的flag碼值進行base64解密便可,須要本身編碼實現,網上不少,這裏就不貼代碼了。網站

  第二題 base64 harder
編碼

  題目:此次連默認編碼表都不讓看了,再試試?加密

  

 

 

  此次的題目須要get的參數更多了,並且echo的輸出也再也不僅僅是flag的編碼值了,並且還會輸出用戶傳入的code的編碼值,不過此次,源碼裏沒有修改後的編碼表了。url

 

  還好題目給了參考文章的連接:爆破非默認base64編碼表,這裏的做者很詳細的給咱們介紹了base64編碼過程以及利用逆向思惟,如何反推出編碼表。我按照博主的代碼,成功本身反推了一遍,總結來講,他給的代碼最終獲得的是BaseTable表:

 

 

 

  而這個BaseTable表,就是咱們通過計算逆推代碼實現的48位的一串字符串,它的做用是,能夠按照做者一開始的目的,通過base64原理拼接成64位比特後,正好對應碼值從0-63,那麼對應的輸出就是修改後的base64編碼表。

 

  當時看到這兒可給我高興壞了,這做者思路真的刁鑽,還能這麼破解?!不過確定是無懈可擊的邏輯,如今咱們的任務就是生成這個BaseTable,做爲加密的輸入傳給這個網站,而後網站就會本身輸出他的編碼表,以後咱們再用第一個題目的思路來解密。

 

  問題就出在這一步,花了我一夜加一中午的時間去嘗試各類辦法。

 

  產生問題的緣由是,這個BaseTable裏大部分是不可見ASCII碼,按理說只能用二進制或者16進制等傳入,可是直接?code=\x00\x.......的話,會被直接看成字符串,而不會被轉義。

 

  那麼我當時就想到倆方法:給這串十六進制編碼;或者搜索如何使轉義字符生效。

 

  過程其實很漫長很枯燥很崩潰,我嘗試了編成中文,用unicode/utf-8,可是先不說會不會最終按照這種編碼被解析,這些16進制也不能被變成中文,尤爲是第一個\x00,這轉成二進制就是0000,加到後面的二進制前面以後,就沒了,它就這樣沒了!由於他是0,仍是一串二進制前幾位,因此直接被截了,可這BaseTable仨仨是一個不可分的總體,分割或者修改都會直接影響結果!

 

  而後嘗試直接輸入ASCII碼,轉碼後一堆亂碼,貼上去,果真不行,由於url確實不認這些,可是隻要被識別了,絕對是能夠成功的。

 

  以後就是php相關,如何使轉義符生效,雖然最終沒找到答案,可是確實學到了不少php字符串和字符串處理函數的細節,好比PHP裏單引號裏無視轉義符(除非\\等極少用法),get方法不能傳遞二進制以及正則表達式等等。

 

  無奈放棄,去作web題目,好巧不巧的是,我卻在搜索相關資料時,碰到了其餘題目的WP:

 

  我當時覺得這就是urlencode吧,已經試過了,沒用,但是當我把那串奇怪字符輸入在線urlencode後,發現和WP給的結果不一樣!瞬間靈機一動,把base harder的網站簡單復現,把那串ASCII亂碼從php文件echo輸入到頁面上,

 

 

 

而後按照WP的腳本去讀取,果真獲得了所有由%編碼的編碼:

 

 

 

 

  把這一串拿出前48字節輸入原網站,果真出了它的編碼表,以後把這個編碼表做爲base64-more的編碼表解密,成功獲得flag:

 

 

  那麼題目作完了,我立刻去搜索這神奇的腳本到底讀的是什麼編碼,結果居然就是urlencode,但是我爲何直接在線urlencode不行呢?

 

  我立刻把這串編碼拿去在線urlencode區解碼,解出來確實是那一串亂碼,可是再點編碼,卻再也不是原來那串url編碼了。那麼這個現象出現的根本緣由究竟是什麼呢,原諒我才疏學淺,相關問題還真沒怎麼接觸過,但能夠確定的是顯示的亂碼對於機器來講是有語義的,多是不一樣的編碼方式致使的,畢竟quote不是urlencode,不過瀏覽器和php都識別就是了。

 

  對於最後這個問題,若是有大佬明白的,而且能夠順便指點下小弟的,感激涕零~

相關文章
相關標籤/搜索