攻防世界———MISC 高手区题解
目錄
1,base64stego
2,easycap
3,Avatar
4,What-is-this
5,簽到題
6,Training-Stegano-1
7,Excaliflag
8,Get-the-key.txt
9,glance-50
10,4-2
11,misc1
12,embarrass
13,?肥宅快樂題
14,小小的PDF
至此 我在攻防世界中已經 遇到 三種 pdf 的隱寫方式:
15,Cephalopod
16,hit-the-core
17,pure_color
18,2-1
19,János-the-Ripper
20,2017_Dating_in_Singapore
21, 4-1
22,?神奇的Modbus
23,5-1
24,can_has_stdio?
25,MISCall
26,3-1
27,適合作為桌面
28, banmabanma
29,我們的秘密是綠色的
30,simple_transfer
31,Just-No-One
32, warmup
33,Erik-Baleog-and-Olaf
34,Py-Py-Py
35, reverse_it
36,mysql
1,base64stego
很神奇的base 64 加密 (在base 64 的密文中加密,還不影響原明文)
(轉載于: https://www.tr0y.wang/2017/06/14/Base64steg/? 做了一定的修改)
(簡要原理,ascii碼是用8位二進制表示一個字符的,而base64是用6位二進制表示一個字符,將明文字符轉化為二進制后再每6位劃分成 一個 “字節”,然后將每個字節轉化為一個字符,就變成了base64密文,而在base64的密文中加密是利用,每一段密文的最后4位二進制是不影響明文的,可以將flag轉化為二進制后拆分隱藏在每一段的最后4位二進制中)
?
復習一下 Base64 吧
BASE64 是一種編碼方式, 是一種可逆的編碼方式.
編碼后的數據是一個字符串, 包含的字符為: A-Za-z0-9+/
共 64 個字符:26 + 26 + 10 + 1 + 1 = 64
其實是 65 個字符, “=”是填充字符.
64 個字符需要 6 位二進制來表示, 表示成數值為 0~63.
這樣, 長度為 3 個字節的數據經過 Base64 編碼后就變為 4 個字節
編碼
比如, 字符串”Tr0”經過 Base64 編碼后變為”VHIw”
上面說的字符串長度為 3 個字節的數據位數是 8x3=24, 可以精確地分成 6x4.
如果字節數不是 3 的倍數, 則位數就不是 6 的倍數, 那么就不能精確地劃分成 6 位的塊.
此時, 需在原數據二進制值后面添加零, 使其字節數是 6 的倍數.
然后, 在編碼后的字符串后面添加 1 個或 2 個等號”=”, 表示所添加的零值字節數.
比如, 字符串”Tr0y”經過 Base64 編碼后變為”VHIweQ==”
橙色底紋就是添加的 0.
這是 Base64 編碼的方式.
解碼
解碼就是編碼的逆過程.
base64密文中隱寫原理
注意紅色的 0, 我們在解碼的時候將其丟棄了, 所以這里的值不會影響解碼. 所以我們可以在這進行隱寫.
為什么等號的那部分 0 不能用于隱寫? 因為修改那里的二進制值會導致等號數量變化, 解碼的第 1 步會受影響. 自然也就破壞了源字符串.
而紅色部分的 0 是作為最后一個字符二進制的組成部分, 還原時只用到了最后一個字符二進制的前部分, 后面的部分就不會影響還原.
唯一的影響就是最后一個字符會變化. 如下圖
如果你直接解密’VHIweQ==’與’VHIweR==’, 得到的結果都是’Tr0y’.
當然, 一行 base64 頂多能有 2 個等號, 也就是有 2*2 位的可隱寫位. 所以我們得弄很多行, 才能隱藏一個字符串, 這也是為什么題目給了一大段 base64 的原因.
接下來, 把要隱藏的 flag 轉為 8 位二進制, 塞進去就行了.
?
加密:
轉載自:https://www.tr0y.wang/2017/06/14/Base64steg/ import base64 flag = 'Tr0y{Base64isF4n}' #flag bin_str = ''.join([bin(ord(c)).replace('0b', '').zfill(8) for c in flag]) base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' with open('0.txt', 'rb') as f0, open('1.txt', 'wb') as f1: #'0.txt'是明文, '1.txt'用于存放隱寫后的 base64for line in f0.readlines():rowstr = base64.b64encode(line.replace('\n', ''))equalnum = rowstr.count('=')if equalnum and len(bin_str):offset = int('0b'+bin_str[:equalnum * 2], 2)char = rowstr[len(rowstr) - equalnum - 1]rowstr = rowstr.replace(char, base64chars[base64chars.index(char) + offset])bin_str = bin_str[equalnum*2:]f1.write(rowstr + '\n')解密:
?
給出加密腳本執行結果
flag{Base_sixty_four_point_five}
2,easycap
下載下來是一個截取的流量包,用wireshark打開,先追蹤流,沒想到直接得到了flag:
3,Avatar
是一張圖片,先用formost分離一下,沒有什么東西,用stegsolve看一下也沒發現什么,再放進winhex中看一下,依舊沒收獲,
再試其他工具,……在用outguess時分離出來了隱藏信息:
We should blow up the bridge at midnight
直接提交
4,What-is-this
解壓文件,是一個沒有后綴的文件,放進winhex中審查一下,發現有幾個文件名,目測這是一個壓縮包,把后綴給為zip后解壓,
兩張圖片,正常思路:1,圖片拼接 2,盲水印 3,各有一部分flag
先試一下 圖片拼接,用stegsolve把兩張圖片合成一下:
直接提交
5,簽到題
(本以為很簡單,實際……)
將Z2dRQGdRMWZxaDBvaHRqcHRfc3d7Z2ZoZ3MjfQ==? base64解密一下:ggQ@gQ1fqh0ohtjpt_sw{gfhgs#}
你以為這就結束了?提交錯誤
猜測{}的位置不對,進行一下柵欄密碼:ggQ@gQ1fqh0ohtjpt_sw{gfhgs#}
2字一欄:gQg1q0hjts{fg#g@Qfhotp_wghs}
4字一欄:ggqht{ggQht_gsQ10jsf#@fopwh}
7字一欄:gfjggqpfQhth@0_ggossQhw#1t{}
14字一欄:gjgpQt@_gsQw1{fgqfhh0gosh#t}
就4個都提交一下試試,結果全都不對,,,,
用 ggqht{ggQht_gsQ10jsf#@fopwh}? ? 再試一下 凱撒密碼:
看到一個ctf直接提交:
ssctf{ssctf_sec10ver#@rabit}
6,Training-Stegano-1
好小的一張圖片,第一反應是用winhex修改寬和高,沒想到打開直接發現了flag:
提交:
steganoI
7,Excaliflag
用foremost分離沒發現東西,用stegsolve看一下:
8,Get-the-key.txt
解壓文件 得到一個 沒有后綴的 文件??forensic100,看這個名字 我還以為是一個 截取的流量包,后綴改為 pcap 看了一下,沒發現什么的,用winhex看一下,猜測是一個壓縮包,后綴改為 zip
解壓得到 key.txt:
SECCON{@]NL7n+-s75FrET]vU=7Z}
9,glance-50
?
打開是一個極窄的git圖片,那還還用想嗎?思路肯定是,先把動態圖的每一幀分離出來,再拼接起來
上腳本:
分離:
import os from PIL import Imagedef 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:passif __name__=='__main__':gif_file = '123.gif'seoaration_gif(gif_file)拼接:
#拼接圖像.py from PIL import Image path = "C:\\Users\\HP\\Desktop\\文檔\\Python\\text\\123\\" save_path = 'C:\\Users\\HP\\Desktop\\文檔\\Python\\text\\'im = Image.new('RGBA',(2*201,600)) #創建新照片imagefile = [] #存儲所有的圖像的名稱 width = 0 for i in range(0,201):imagefile.append(Image.open(path+str(i)+'.png')) #遍歷,將圖像名稱存入imagfilefor image in imagefile:im.paste(image,(width,0,2+width,600)) #將圖片張貼到另一張圖片上width = width +2 im.save(save_path+'result.png') im.show()得到圖片:
?
10,4-2
得到一段看起來毫無規律的密文:
Eg qnlyjtcnzydl z umaujejmjetg qeydsn eu z bsjdtx tw sgqtxegc al kdeqd mgeju tw yrzegjsoj zns nsyrzqsx kejd qeydsnjsoj Ew ltm fgtk jds kzl tw sgqtxegc m kerr csj jds wrzc kdeqd eu qrzuueqzr-qeydsn_eu_gtj_usqmnejl_du不知道從何下手,看了一下別人的writeup,發現是 詞頻分析
https://quipqiup.com/
?
flag{classical-cipher_is_not_security_hs}
?
11,misc1
打開是一段密文:
d4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c6fbb9e1e6b3e3b9e4b3b7b7e2b6b1e4b2b6b9e2b1b1b3b3b7e6b3b3b0e3b9b3b5e6fd以為是base64,發現解不出來,再回頭仔細看,發現只有 0~9 a~f? 十六進制
但是,直接 用 16進制=》ascii? 發現是一堆亂碼 ,
常識 ascii 只有 到128? ,而發現這一串16進制每兩位化成 十進制 后都大于 128
肯定得減去128后再 轉成 ascii:
?直接上代碼:
char = "d4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c6fbb9e1e6b3e3b9e4b3b7b7e2b6b1e4b2b6b9e2b1b1b3b3b7e6b3b3b0e3b9b3b5e6fd" for i in range(0,len(char),2):print(chr(int(char[i:i+2],16)-128),end="")That was fast! The flag is: DDCTF{9af3c9d377b61d269b11337f330c935f}
12,embarrass
下載下來是一個 流量包,在linux中 搜索一下 flag 字符串 看會不會有意外收獲:
沒想到直接出來了
flag{Good_b0y_W3ll_Done}
13,?肥宅快樂題
a.這個題目下載到手是一個.swf后綴的文件
b.用到一個特殊的工具,叫做potplayer
c.把這個.swf文件使用這個工具打開
d.根據提示注意對話就好
點擊 右下角的 開始? ?就會 自動播放? 在 放到? 57 幀 的時候, 出現了 下面的對話 有一段 base64 :
狗日的? ?不能復
?提取出來:U1lDe0YzaVpoYWlfa3U0aWxlX1QxMTF9
base64解碼得flag:SYC{F3iZhai_ku4ile_T111}
14,小小的PDF
下載下來是一個 pdf文件 ,不管有沒有隱藏文件,先用formost 分離一下,沒想到直接 分離出來了三張圖片,包含一張flag圖片:
至此 我在攻防世界中已經 遇到 三種 pdf 的隱寫方式:
?
1,新手區 :?pdf? :將flag隱藏在圖片的下面? ? ? 》? 需要 先將格式轉為 word? 再將圖片拖開 就能看到 flag
2,新手區 :stegano? :利用類似水印的方法將flag隱藏在大量文字下面(不清粗具體方法) 》 全選復制 到 txt文件中就能 顯示出密文
3,高手區: 小小的pdf: 嵌入文件? 》 直接用 formost 分析 或用? binwalk分離
?
15,Cephalopod
打開數據包,嘗試性 在分組字節流中 搜索字符串 flag? 然后就看到了有一張 flag.png:
然后 追蹤流 (還原原始數據包)發現flag.png 的數據并不在 75 這個包里:
看下一個流:發現了 png 的數據文件:選擇 原始數據流 =》save as? ?flag.png (直接保存的話,部分數據會丟失)
然后用 winhex 打開,刪除 圖片頭前面的 無關數據:
然后就看到了flag.png:
HITB{95700d8aefdc1648b90a92f3a8460a2c}
16,hit-the-core
下載下來是一個 core文件:
小知識點 core:
core 文件:核心文件(core file),也稱核心轉儲(core dump),是操作系統在進程收到某些信號而終止運行時,將此時進程地址空間的內容以及有關進程狀態的其他信息寫出的一個磁盤文件。這種信息往往用于調試。
核心文件通常在系統收到特定的信號時由操作系統生成。信號可以由程序執行過程中的異常觸發,也可以由外部程序發送。動作的結果一般是生成一個某個進程的內存轉儲的文件,文件包含了此進程當前的運行堆棧信息。有時程序并未經過徹底測試,這使得它在執行的時候一不小心就會遭到破壞。這可能會導致核心轉儲(core dump)。現在的UNIX系統極少會面臨這樣的問題。即使遇到,程序員可以通過核心映像調試程序來找到錯誤原因。
?
不知如何下手 ,看別人的博客,發現是用 strings 命令 提取出 文件中的 字符串:
strings 123.core竟然能 從這一段 字符串中 發現 幾個 大寫字母 之間的聯系: ALECTF 而且每個字母中間隔了 5個字符,
提取這些字符:(真是TM服了,這題都能出)
data = 'cvqAeqacLtqazEigwiXobxrCrtuiTzahfFreqc{bnjrKwgk83kgd43j85ePgb_e_rwqr7fvbmHjklo3tews_hmkogooyf0vbnk0ii87Drfgh_n kiwutfb0ghk9ro987k5tfb_hjiouo087ptfcv}' flag = '' for i in range(3, len(data), 5):flag += data[i]print(flag)得到flag:?ALEXCTF{K33P_7H3_g00D_w0rk_up}
17,pure_color
打開是一張白色圖片 ,放進stegsolve 中分析一下:
flag{true_steganographers_doesnt_need_any_tools}
18,2-1
是一個png圖片 ,打不開 ,文件損壞,用 winhex 打開發現? 文件頭 是錯的 ,把文件頭修改為 89 50 4E 47
保存后發現還是打不開,用 tweakpng 打開 有報錯:
把文件 IHDR 的crc校驗值 修改為? 55 d5 f6 4f 后發現 還是打不開,
再仔細看 發現 圖片的 寬是 0?
根據 crc校驗值 算寬是多少:
import struct import binascii import osm = open("misc4.png","rb").read() for i in range(1024):c = m[12:16] + struct.pack('>i', i) + m[20:29]crc = binascii.crc32(c) & 0xffffffffif crc == 0x932f8a6b: #自己根據情況改print(i)得到寬度為709,修改寬度為709換算為16進制為? ?02 c5
得flag
wdflag{Png_C2c_u_kn0W}
19,János-the-Ripper
解壓后得到一個 沒有后綴的文件 放進winhex中發現是一個? zip包,后綴改為 zip
解壓發現需要密碼,直接爆破得到密碼 :fish
解壓得到flag:
flag{ev3n::y0u::bru7us?!}
20,2017_Dating_in_Singapore
01081522291516170310172431-050607132027262728-0102030209162330-02091623020310090910172423-02010814222930-0605041118252627-0203040310172431-0102030108152229151617-04050604111825181920-0108152229303124171003-261912052028211407-04051213192625腦洞是真尼瑪大!
12段 數字,每一段都是 有偶數個數字,發現如果兩個 字符一組的話,最大的數字的 31,
剛好是日歷中最大的數字,然后就在日歷上 一個數字一個數字地 連,然后就畫出了 下面的字符:?
flag:
HITB{CTFFUN}
21, 4-1
解壓得到一張圖片,用formost分離出來一個 壓縮包,解壓得到
得到 兩張 “一樣”? 的圖片,和一個 tips.txt? ?大意是 指 day2.png? 中比 day1.png? 多了點 “東西”
這一看肯定是 水印啊 ,盲水印啊,
直接提取盲水印:
python2 bwm.py decode day1.png day2.png flag.png?
?
得到水印:
22,?神奇的Modbus
Modbus是一種串行通信協議,
Modbus協議當前存在用于串口、以太網以及其他支持互聯網協議的網絡的版本。
大多數Modbus設備通信通過串口EIA-485物理層進行
用wireshark 打開流量包,直接在 分組字節流 中 搜索 sctf 字符串? 直接出來:
但是 sctf{Easy_Mdbus} 竟然不是 正確答案
正確答案 :sctf{Easy_Modbus}??
23,5-1
是一個 不知道文件類型的 文件? ,用 file 分析一下? 顯示是類型 為? data? ,
看別人的博客,大意是需要用? xortool 工具?
先嘗試出 key:GoodLuckToYou
其中-l就是指定密鑰長度,-c表示出現頻率最高的字符。這個需要根據經驗,比如文本內容一般是空格(20),二進制文件一般是00
?
然后用 腳本進行 解密:
import osc = open("123",'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)?
小知識點:
xortool 工具,
xortool.py是基于python的腳本,用于完成一些xor分析,包括:
- 猜想key的長度
- 猜想key的值
- 解密一些經過xoe加密的文件
24,can_has_stdio?
打開文件是一大串brainfuck密文,在線解碼得到flag
:http://tool.bugku.com/brainfuck/?wafcloud=2
25,MISCall
不知道是什么文件,用kali看一下,發現是bzip2文件,重命名為 123.bzip2
解壓:
發現了一個falg.txt文件和 .git文件夾,flag.txt中沒有flag
嘗試用 git stash 進行恢復以前修改/刪除的文件
查看git 記錄,給出了一個最近上傳的文件,但這個文件并不存在
查看修改列表,儲存列表中有一條記錄
校驗一下列表中的存儲文件
把上面的文件恢復
直接執行 git stash apply 時,會 提示文件覆蓋 自動終止,可以先把flag.txt刪除再執行
運行s.py 得到flag:
NCN4dd992213ae6b76f27d7340f0dde1222888df4d3
26,3-1
文件用winhex打開發現是rar文件頭,后綴改為rar,解壓發現有有個文件名為 ++_++的文件,用記事本打開,發現這是一個流量包,后綴改為 .pcap,用wireshark打開,
在分組字節流 中搜索字符串 flag,
找到了一個 flag.rar文件,
文件 》導出分組字節流? 保存為 flag.rar,里面有一個 flag.txt文件
解壓發現需要密碼,暴力破解無果
會過頭來找密碼,發現在下一個字節流中(第6個)中,看到了一些管道命令,和一段python加密腳本
from Crypto import Random from Crypto.Cipher import AES import sys import base64IV = 'QWERTYUIOPASDFGH'def decrypt(encrypted):aes = AES.new(IV, AES.MODE_CBC, IV)return aes.decrypt(encrypted)def encrypt(message):length = 16count = len(message)padding = length - (count % length)message = message + '\0' * paddingaes = AES.new(IV, AES.MODE_CBC, IV)return aes.encrypt(message)str = 'this is a test' example = encrypt(str) print(decrypt(example))這是一段加密腳本,密文是19aaFYsQQKr+hVX6hl2smAUQ5a767TsULEUebWSajEo=
寫出解密腳本,解密得到:?
passwd={No_One_Can_Decrypt_Me}
解密 flag.rar得到 flag:
WDCTF{Seclab_CTF_2017}
27,適合作為桌面
是一張圖片,二話不說先用foremost分離一下,沒分離出來東西
放進stegsolve 里看一下,
發現了一張二維碼:
掃描得到一段 16進制:
復制到winhex中,發現了 有1.py字符串:
知道這是一個 pyc文件,另存為 1.pyc? 放進kali中進行反編譯,得到1.py文件:
uncompyle6 1.pyc >1.py查看1.py文件:
發現是一個函數,用vim在腳本后面加一個 flag()調用這個函數,然后執行這個腳本就得到flag:
flag{38a57032085441e7}
?
28, banmabanma
是一張斑馬圖片,身上是一段 條形碼,用畫圖拉長后再在線解碼
的得到:FLAG IS TENSHINE
flag: flag{TENSHINE}
?
29,我們的秘密是綠色的
這題還是比較難的,需要好多步才能解出來flag
(1)首先得知道有 oursecret這個圖片解密軟件,然后還得找到解密的密碼,
密碼經過一番嘗試后,發現是 圖片中的 綠色的數字 連起來?0405111218192526 ,然后得到一個 try.zip文件
(2)解壓try.zip發現需要密碼,不過給了點提示:
coffee的生日, 別查生日了,直接爆破,純數字 爆破得到密碼:19950822(3)解壓后得到 兩個文件 flag.zip需要密碼,用明文爆破,得到密碼:Y29mZmVl
(4)又得到兩個 文件,flag.zip 又需要密碼
用 ARCHPR爆破時,提示文件沒有加密,那應該是 zip偽加密
將 01 改為 00 保存,解壓得到flag.txt
qddpqwnpcplen%prqwn_{_zz*d@gq}
(4)直接提交,不正確,加flag{}后也不正確,
猜想可能是 柵欄密碼? 先經過柵欄爆破? 得到:?qwlr{ddneq_@dpnwzgpc%nzqqpp_*}
(5)再進行 凱撒爆破 得到flag:
flag{ssctf_@seclover%coffee_*}
?
30,simple_transfer
得到一個流量包,打開,前面的包好像是在進行端口掃描,全是握手包
直接 在分組字節流中搜索 字符串flag ,找到了一個包,追蹤流,沒發現有用信息
回過頭來,再看,往下倒非紅色包的部分,發現有 NFS 協議,覺得有點可疑,
過濾看看
發現 在分組列表中 有 file.pdf
導出分組字節流? ?保存為 file.pdf
但是我打不開 這個破文件,可能是我導出是姿勢有問題,
算了直接 用 foremost 分離 流量包,分離得到 了一個pdf文件:(ma的,下次我直接分解)
HITB{b3d0e380e9c39352c667307d010775ca} 直接提交
?
31,Just-No-One
這題我也是服了,這沒有點耐心還真找不到
下載得到一個 exe文件,那就安裝唄,還能咋地,但發現需要password:
找密碼:
嘗試使用innounp工具解壓壓縮包。
innounp的官網地址:?http://innounp.sourceforge.net??
innounp.exe -x setup.exe
?
在解壓出的install_script.iss中發現密碼信息
; PasswordHash=888e209e5d76a3135d04b8baccabd7936a0dd376
; PasswordSalt=0e559522ecf62077
使用hashcat解密得到密碼為:1234567
但實際上并沒有什么用,程序安裝完打開是這個樣子的
提示我們已經看到了flag
最騷的來了,沒有任何提示的情況下,能在 安裝協議里面找到 正確 flag 的人是真的大佬,反正我做不來
?
誰能想到 這就是flag: 也沒個格式,真想罵這個出題人,
ILOVEREADINGEULAS
32, warmup
考察,明文爆破,盲水印
先將 open_forum.png 壓縮為 open_forum.zip,然后明文破解(這里我死活破不開,不知道是怎么回事,我醉了)
然后得到,兩張圖片,用盲水印提取水印:(腳本自己去github里面找)
python bwm.py encode fuli.png fuli2.png res.pngflag{bWm_Are_W0nderfu1}
?
33,Erik-Baleog-and-Olaf
是png頭,后綴改為 .png
用 stegsolve 打開 發現在中間的小人的手中,有一個很小的二維碼,不斷切換找到一張最清的二維碼:
用 截圖工具截個圖:
直接掃,掃不出來,
再把這張圖放進 stegsolve中 ,找到一張更清的圖片,保存下來
掃描得到flag:flag{#justdiffit}
?
34,Py-Py-Py
只能說花里胡哨,第一次見到 在 pyc/pyo文件中? 隱藏信息的
開始的時候把 pyc文件? 放進? ?kali中 反編譯為 py文件
uncompyle6 123.pyc > 123.py然后看到一個加密腳本:
太長了,選出有用的一部分,
if __name__ == '__main__':while True:flag = raw_input('Please input your flag:')if flag == crypto(fllag, 'decode'):print('Success')breakelse:continue看到,flag == crypto(fllag,'decode')
直接把這一段 代碼刪除了? ?添加一句 print crypto(fllag,'decode')
然后就得大 flag 的值?The challenge is Steganography, 直接提交不對,加flag{}提交仍然不對
這句話的意思是 挑戰是隱寫,
去網上搜了一下,還可以在 pyc文件的字節碼中 隱藏 信息的隱寫方式,
需要用到?stegosaurus 這個工具,github中有,
python3 stegosaurus.py -x 123.pycFlag{HiD3_Pal0ad_1n_Python}
?
35, reverse_it
放進 winhex中發現是 文件 png 的數據進行了 逆置,(這里的逆置是指,字節的逆置)
數據逆置回來保存為 png, 得到一張逆置的圖片:
再把圖片逆置過來:
文件逆置:
def swap_nibbles(byte):return ((byte << 4) | (byte >> 4)) & 0xffi = open('1234', 'rb') o = open('1234.txt', 'wb') o.write(''.join(map(chr, map(swap_nibbles, map(ord, i.read()[::-1]))))) i.close() o.close()圖片翻轉:
import sys from PIL import Imagei = Image.open('1234.jpg') o = Image.new(i.mode, i.size) idata, odata = i.load(), o.load()for y in range(i.size[1]):for x in range(i.size[0]):odata[x, y] = idata[i.size[0] - x - 1, y]o.save('qwe' + '.jpg')36,mysql
提示:我們在Mysql數據庫中存放了flag,但是黑客已經把它刪除了。你能找回來flag嗎?
考點 ,用?undrop-for-innodb 恢復 mysql被刪的數據
undrop-for-innodb 在github上有,
git clone?https://github.com/twindb/undrop-for-innodbcd updrop-for-innodbmake如果提示 make : bison 命令未找到,則需要安裝 bisonapt install -y bison然后再執行 make 命令 安裝(這里我也是第一次見這種題,我盡量詳細記錄一下)
現在確認一下數據恢復的必要條件:一份ibdata1數據文件,一份要恢復的數據庫的表結構
在structure.sql中看到了表的結構:
在 mysql文件夾中有 數據空間文件ibdata1文件,現在兩個需要的文件都有了
?
這里我新建了一個 文件夾,backup,然后把需要用到的幾個文件復制進去
c_parser , dictionary ??, stream_parser? ,structure.sql,ibdata1
(1)解析數據文件
首先,由于mysql將Innodb驅動的數據使用B+tree索引在了數據空間文件ibdata1中,所以需要使用stream_parser工具進行解析:
./stream_parser -f ibdata1解析完成后,可以看到同目錄下生成一個pages-ibdata1目錄,其中包含兩個子目錄,一個是包含按索引排序的數據頁目錄,另一個是包含相關類型的數據目錄:
我們下面將主要關注的是第一個子目錄即索引好的數據頁目錄,因為我們要恢復的數據就在里面,其中第一個頁文件(0000000000000001.page)里包含所有數據庫的表信息和相關的表索引信息,類似一個數據字典,可以使用項目提供的一個腳本recover_dictionary.sh將其內容放到一個test數據庫里詳細的查看,這里就不做演示了。
(2)解析頁文件
既然第一個頁文件包含所有數據庫表的索引信息,我們就需要先解析它,以模擬mysql查詢數據的過程,最終才能找到要恢復的數據。c_parser工具可以用來解析頁文件,不過需要提供該頁文件的一個內部結構(表結構)。
項目根目錄下有個dictionary目錄,里面就包含數據字典用到相關表結構,如用來解析第一個頁文件的表結構在SYS_TABLES.sql文件
./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page -t dictionary/SYS_TABLES.sql | grep ctf該命令使用c_parser工具解析數據庫表索引信息并過濾出我們想要恢復的有關ctf的文件
我們看到 user這個表的索引值為? 13,通過這個索引值,再到另外一張表去查詢該user表所有的索引信息
該表的結構在"dictionary/SYS_INDEXES.sql"文件中可以看到,而此表對應的數據頁文件是第三個數據頁0000000000000003.page
./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page -t dictionary/SYS_INDEXES.sql | grep 13這里找到一條user 的索引信息,其在mysql 存儲中的索引值為 15,此索引值編號對應的數據頁文件中,即存儲了該索引的全部數據
此處我們選擇的是主鍵索引對應的數據頁文件進行解析(另外一個索引鍵應該也可以,只不過方法可能需要有所區別),終于順利解析見到了激動人心的數據:
./c_parser -5f pages-ibdata1/FIL_PAGE_INDEX/0000000000000015.page -t structure.sql | more得到flag:
71e55075163d5c6410c0d9eae499c977
?
?
寫在最后:(上面的很多題,我也是第一次遇到,也是邊刷邊學習)
我也是一個剛學習的web安全的小白,也是通過刷題寫writeup來提升自己,寫的不好的地方勿噴,轉身離開就好,如果覺得有幫助到你,就點個贊就好
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的攻防世界———MISC 高手区题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SMB漏洞
- 下一篇: bugku ——杂项