改改比赛wp发上来
本文来自csdn的⭐️shu天⭐️,平时会记录ctf、取证和渗透相关的文章,欢迎大家来我的主页:shu天_CSDN博客-ctf,取证,web领域博主:https://blog.csdn.net/weixin_46081055 看看ヾ(@ ˘ω˘ @)ノ!!
一、 解题情况
二、 解题过程
1 Capture Radiate Chart
操作内容:
用TweakPNG(工具地址cloud.tencent.com/developer/article/1808156)查看图片,发现每个IDAT块的crc值最后两位,正好是rar的文件头(52 61 72 21→R a r !)
利用010editor导出crc,在csv和excel中处理
整理一下写成新的rar文件
解压得到一个pdf,打开看是空空的。
对pdf的结构分析,其中有一个78 9C
开头的stream数据段,应该是里面有一张图片,所以对pdf进行strings(pdf结构解析可以看这位师傅的文章www.jianshu.com/p/f48cc9077c10)
对象的内容应该是包含在<< 和>>之间的,最后以关键字endobj结束.
Stream说明一个流对象的开始。
Endstream为流对象的结束标志
……
7 0 obj
<</BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /FlateDecode /Height 1403 /Length 12538 /Subtype /Image /Type /XObject /Width 992>>
stream
……
- 1
- 2
- 3
- 4
- 5
根据上面这段对象内容属性的说明,我们知道图片的长度/Height 1403
和宽度/Width 992
,以及IDAT段的长度/Length 12538
,流则是提取Stream和Endstream之间的部分。(快速提取直接用binwalk,1F9.zlib即是我们需要的,要把最后多出来的Endstream等等删除),我这里一共12538字节,多点少点都没事(和/Length 12538
对应啦
然后我们开始构造png文件头以及IDAT块的头
1) png文件头
png文件头分析参考David.Turing师傅:www.blogjava.net/security/archive/2006/06/08/51292.html
如下图,前面几段是固定值,图片的长度/Height 1403 =57B
和宽度/Width 992=057B
,再计算一下crc(不算乱填也可)
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
00000000 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 塒NG IHDR
00000010 00 00 03 E0 00 00 05 7B 08 02 00 00 00 29 34 52 ? { )4R
00000020 90
- 1
- 2
- 3
- 4
- 5
2) IDAT段
IDAT结构根据这位师傅的文章juejin.cn/post/6844903983258173454
IDAT段的长度/Length 12538=30FA
(我不知道有没有写反……我一直分不清小端序大端序,感觉回到了学存储原理时候……)
即可正常显示
不过我赛后复盘时候猜,这张图片应该是放在word里,然后把写着flag的地方移到展示页面之外,所以转换为pdf之后我们看不见,于是有了第二种解法
利用pythonfitz
库对pdf操作提取图片(代码参考刘早起师傅cloud.tencent.com/developer/article/1785670)
import fitz
import re
import os
file_path = r'flag.pdf'
dir_path = r'./1/'
def pdf2image1(path, pic_path):
checkIM = r"/Subtype(?= */Image)"
pdf = fitz.open(path)
lenXREF = pdf.xref_length()
count = 1
for i in range(1, lenXREF):
text = pdf.xref_object(i)
isImage = re.search(checkIM, text)
if not isImage:
continue
pix = fitz.Pixmap(pdf, i)
new_name = f"img_{count}.png"
pix.save(os.path.join(pic_path, new_name))
count += 1
pix = None
pdf2image1(file_path, dir_path)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
也可以得到(ps我也试了网上一些pdf转换工具,基本上不行,可能他们是基于可见元素分析pdf并转换的,并没有分析pdf的zlib块,所以得不到完整图片)
pps补个png的phys数据块知识点www.cnblogs.com/mqxs/p/3552658.html
我觉得出这题的师傅真的很厉害,对pdf和png的文件结构一定烂熟于心,复盘时候学到了很多,谢谢师傅们出了这么好的题目!
flag值:
flag{Create_Remarkable_Ctf}
2 RecoverMe
操作内容:
根据提示用Passware字典爆破vc加密容器密码aaaAAA111
(ps.vc加密容器是有outer容器和隐藏容器的区别,不过这题没有考)
挂载容器,然后用x-way查看磁盘,发现之前存在一个流量包,恢复该流量包
流量包中都是icmp协议的流量,data段的长度(十进制转ascii 80 75 →PK)正好可以构成一个压缩包
xz.aliyun.com/t/4527参考这篇文章
首先筛选ip.src_host==192.168.43.186
tshark -r 1.pcapng -Y "icmp" -T fields -e data.len | tr "\n" ","
- 1
然后对得到的十进制数字就行简单替换,逗号之间补充0
py脚本写文件
import struct
raw = [80,75,3,4,20,0,1,0,0,0,201,158,124,84,241,77,1,151,50,0,0,0,38,0,0,0,10,0,0,0,115,101,99,114,101,116,46,116,120,116,202,7,76,52,18,217,95,209,16,103,33,82,12,242,206,138,103,184,241,65,43,57,75,43,130,112,107,178,89,108,190,217,11,246,105,237,181,32,234,243,226,240,182,130,97,109,1,132,196,168,80,75,1,2,63,0,20,0,1,0,0,0,201,158,124,84,241,77,1,151,50,0,0,0,38,0,0,0,10,0,36,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,115,101,99,114,101,116,46,116,120,116,10,0,32,0,0,0,0,0,1,0,24,0,237,79,170,141,154,66,216,1,34,16,235,170,154,66,216,1,24,255,80,114,154,66,216,1,80,75,5,6,0,0,0,0,1,0,1,0,92,0,0,0,90,0,0,0,21,0,105,112,181,196,177,228,187,175,202,199,185,202,210,226,181,196,194,240,163,191,0,0]
m = [int(i) for i in raw]
with open('1.zip', 'wb') as fp:
for i in m:
s = struct.pack('B',i)
fp.write(s)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
提示ip的变化,ip.src==192.168.43.186筛选IP,导出为文本文档,然后导入excel,取出destination ip
去掉换行,得到
011100000110000101110011011100110111011101101111011100100110010001101000001100110111001000110011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
- 1
www.rapidtables.org/zh-CN/convert/number/ascii-hex-bin-dec-converter.html转换为ascii,密码为passwordh3r3,解压得到flag
flag值:
flag{efaaf34db0bad8e1888e8f671f3cb7ab}
3 PINTU
操作内容:
观察图片规律,推测第六字节和第八字节是拼图的定位
搜搜Bmp文件头:www.cnblogs.com/l2rf/p/5643352.html,这两个位置是保留字节(所以可以做手脚
先写个脚本提取第六字节和第八字节
from PIL import Image
x_list=[]
y_list=[]
for i in range(0,14400):
f = open(f'img/{i}.bmp', 'rb').read()
x = f[6]
y = f[8]
x_list.append(x)
y_list.append(y)
#print(x_list)
#print(y_list)
print(max(x_list))
print(max(y_list))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
基本可以确认是根据第六字节和第八字节排序,x和y的最大值都是119,可以得到我们最终拼图的尺寸为(12032)x(12018),即3840x2160,再整个拼图脚本
from PIL import Image
flag = Image.new('RGB', (3840, 2160))
for i in range(0,14400):
f = open(f'img/{i}.bmp', 'rb').read()
x = f[6]
y = f[8]
raw = Image.open(f'img/{i}.bmp')
flag.paste(raw, (x*32, y*18))
flag.save('flag.bmp')
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
得到flag
flag值:
flag{Bmp_index_PinTu}}
4 tiger
操作内容:
根据提示Rot47所以lsb密码是28a217fe
用工具github.com/livz/cloacked-pixel解密lsb得到71zr9H6jnXRHn64WBxMbCzz16saCZWiw,解密压缩包然后明文爆破
里面flag是个图片,是二维码
扫码后发现是零宽字符
flag is not here
- 1
yuanfux.github.io/zero-width-web/网站解密零宽字符
www.guballa.de/vigenere-solver网站爆破出flag
You are a good CTFer because you can solve my challenge, next I will give you my secret, my secret is flag{866d3755-c358-5119-abeb-bda666a8099d}, have fun!
flag值:
flag{866d3755-c358-5119-abeb-bda666a8099d}
5 被带走的机密文件
操作内容:
取证大师进行自动化取证,在打印机缓存里面发现有打印图片的记录
flag值:
flag{1136d459-2885-409a-bc54-beea0739544b}
6 签到
操作内容:
弹钢琴,弹完之后自动跳转
7 Mercy-code
操作内容:
首先echo,发现前后都附加了header,构造命令并执行
cmd=echo(implode(apache_request_headers()));
- 1
传header
111:
……
cmd=system(strrev(implode(apache_request_headers())));
- 1
- 2
- 3
- 4
看了别的师傅的wp:mp.weixin.qq.com/s/FGGceMvAZ9iRmIVIufBpBw ,发现可以用uniqid加上strrev函数随机取值,爆破出字符.
,scandir+show_source直接读文件的
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论