題目來源:
olympicCTF
題目描述:
菜狗經過幾天的學習,終于發現了如來十三掌最后一步的精髓
題目附件:
a2eb7ceaf5ab49f7acb33de2e7eed74a.zip
題目思路:
base64原理:文本->ascii編碼->二進制->每6個為一位轉換成十進制->通過base64表轉換成文本

比如,字串”Man”經過 Base64 編碼后變為”TWFu”

編碼時如果字串位元組數不是3的倍數,則位數就不是6的倍數,就不能劃分成6位一組,此時需要在原資料二進制值后添加0,然后在編碼后的字串后加上一個或兩個“=”,表示添加的0的個數
解碼時先去掉等號,轉為二進制數,扔掉多余位轉為對應的ASCII碼,扔掉多余的0恢復成原字串
隱寫原理:解碼時丟棄的0可以隱藏資訊
解題程序:
壓縮包需要解壓密碼,打開010分析前四位是檔案頭,后四位是壓縮解壓的pkware版本接下來就是加密標記,如果的兩個若不是0000便會提示有密碼,這種zip偽加密可以使用winRAR打開,進入工具,修復壓縮檔案,修復完后壓縮包就可以打開了

這里的思路是先回圈解密base64字串,提取出隱寫的最后2-4位,再拼接最后轉回ascii碼flag就出來了
import base64
bin_str=''
b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
with open('stego.txt','r') as f:
for line in f.readlines():
stegb64="".join(line.split())
rowb64="".join(str(base64.b64encode(base64.b64decode(stegb64)),'utf-8').split())
offset=abs(b64chars.index(stegb64.replace('=','')[-1])-b64chars.index(rowb64.replace('=', '')[-1]))
equalnum=line.count('=')
if equalnum:
bin_str += bin(offset)[2:].zfill(equalnum * 2)
print(''.join([chr(int(bin_str[i:i + 8], 2)) for i in range(0,len(bin_str),8)]))
flag{Base_sixty_four_point_five}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/246848.html
標籤:python
上一篇:起點中文網月票榜爬取及資料分析
