polarctf_web-简单题
1.题目:[爆破鬼才]
考点:
(1)压缩包手动分离
(2)压缩包密码爆破
题目来源:polarctf-misc-[爆破鬼才]
解题:
将图片用010打开,ctrl+f
搜索压缩包文件头50 4B 03 04
复制该文件头及其后面的数据
点击右上角文件、新建
得到新文件
ctrl+s
保存,添加后缀.zip
,得到一个加密的压缩包
使用ARCHPR工具进行密码爆破,得到密码,解压压缩包得到flag
2.题目:[LSB]
考点:
最低有效位(LSB隐写)
题目来源:polarctf-misc-[LSB]
解题:
题目给了一张图片,根据题目"LSB",将图片设置为lsb最低有效位
得到flag
3.题目:[0和255]
考点:
图片与像素点转换
题目来源:Polarctf-misc-[0和255]
解题:
靶场给了一个python文件image_list.py
和一个像素列表文件image_list.txt
分析image_list.py
源码
# -*- coding = utf-8 -*-
# @software:PyCharm
from PIL import Image
image = Image.open('flag.png') #flag.png分辨率为33*33
width = image.width
height = image.height
image_list = []
for x in range(height):
scanline_list = []
for y in range(width):
pixel = image.getpixel((y, x)) # 自左到右、自上而下一个一个的像素点读取
scanline_list.append(pixel) # 存储第x行像素点
image_list.append(scanline_list) # 一行一行的存储像素点
print(image_list)
写脚本复原图片即可
import ast
from PIL import Image
def image_list_to_image(image_list, width, height):
# 创建新的空白图像
image = Image.new('RGB', (width, height)) # 创建一个指定大小的RGB模式空白图像
# 遍历image_list,并将像素设置到图像中
for y in range(height):
for x in range(width):
pixel = image_list[y][x] # 获取当前像素值
image.putpixel((x, y), pixel) # 设置像素值到图像中
return image
width = 33
height = 33
with open('素材/image_list.txt', 'r') as file:
content = file.read()
image_list = ast.literal_eval(content) # 把文件内容转成对应的列表
image = image_list_to_image(image_list, width, height)
image.show() # 展示图片
image.save('flag.png')
恢复得到一个二维码,扫码得到字符串,然后计算其md5值即为flag
4.题目:[01]
考点:
(1)二维码像素点转换
(2)兽言兽语编码
题目来源:Polarctf-misc-[01]
解题:
靶场给了一个加密的zip文件flag.zip
和01二进制数据流hint.txt
查看hint.txt
,猜测为图片像素
脚本恢复
from PIL import Image
MAX = 25 # 每行每列数
# 二维码大小
pic = Image.new("RGB", (MAX, MAX))
str = "1111111011111001001111111100000100000000110100000110111010001000101010111011011101010011110001011101101110100111001010101110110000010001110010010000011111111010101010101111111000000000011000100000000000101110110111010100010011110100111100111010101001011000110001000011011101100001001000010101111000100001001111110100110001001000100011000010111010101010011110000101111010110110101010001010010100000010100100101110011111111100100000000110111001000100011111111001100010101011011100000101111100110001100010111010110010101111110001011101000001110010111010101110101100100011111010110000010011010010011100101111111000010001000011011"
i = 0
for y in range(0, MAX):
for x in range(0, MAX):
if (str[i] == "0"):
pic.putpixel([x, y], (255, 255, 255)) # 将0转换为RGB(255,255,255),即白色
else:
pic.putpixel([x, y], (0, 0, 0)) # 将1转换为RGB(0,0,0),即黑色
i = i + 1
# pic.show()
pic.save("flag.png")
# 本题上边颜色替换无强制要求,尽可能选择差异较大的两种颜色即可
运行后得到二维码,扫码得到压缩包密码,打开压缩包得到数据为兽言兽语编码,在线解码得到flag
在线工具:[url](兽音译者在线编码解码 - 兽音翻译咆哮体加密解密)
5.题目:[broken_hash]
考点:
(1)文件分离(binwalk工具)
(2)md5爆破
题目来源:Polarctf-misc-[broken_hash]
解题:
靶场给了一个压缩包,解压后得到两个没有扩展名的文件
用010eiditor
打开png
文件,在其头部看到了png图片文件扩展名89 50 4E 47
并在其尾部发现了flag字样
猜测png
可能是由多个文件合并而来,使用binwalk工具进行分离:binwalk -e --directory=./output ./png
分离得到三个文件:空文本文件3E
,二进制文件3E.zlib
、加密的压缩包8E3EE.rar
使用010打开得到的二进制文件,在其末尾发现了可疑数据CMT7bf21a26cd6
,其中的CMT
猜测为comment(提示)的缩写
打开压缩包同样观察到这段可疑数据:
查看靶场给的另一个文件tip
提示压缩包密码是由小写字母和数字组成、长度为4的字符串的md5值,目前猜测那段可疑数据为密码md5值的前半部分,写脚本爆破密码(md5值为128位,16字节,一般使用32个十六进制字符表示)
import hashlib
import re
import string
pass1_md5 = "7bf21a26cd6"
dic = string.ascii_letters+string.digits
for i in dic:
for j in dic:
for x in dic:
for y in dic:
pass_test = str(i)+str(j)+str(x)+str(y)
pass_md5 = hashlib.md5(pass_test.encode()).hexdigest()
if re.findall(pass1_md5+'(.*?)',pass_md5):
print("找到密码为:",pass_md5)
exit()
得到密码为7bf21a26cd627170e0e05ceee551c044
输入密码将压缩包解压,得到一个没有后缀的flag
文件
010打开,得到flag:flag{dbee4535f4853a3adc9ac3bbe1358819}
6.题目:[100RGB]
考点:
(1)base100解码
(2)ascii与字符转换
题目来源:Polarctf-misc-[100RGB]
解题:
题目给了一个压缩包,解压后得到:
将空格和换行去除:
text = """🐯🐩🐣🐮🐨🐣🐭🐭
🐨🐧🐩🐣🐨🐧🐯🐣🐰🐮
🐨🐧🐪🐣🐨🐩🐪🐣🐭🐬
🐨🐨🐧🐣🐫🐰🐣🐨🐧🐰
🐰🐮🐣🐫🐰🐣🐨🐨🐬
🐪🐩🐣🐰🐬🐣🐰🐮
🐨🐨🐫🐣🐬🐨🐣🐰🐬
🐰🐰🐣🐨🐨🐮🐣🐫🐪
🐨🐧🐨🐣🐨🐩🐬🐣🐧"""
clean_text = text.replace('\n', '')
clean_text = clean_text.replace(' ','')
print(clean_text)
🐯🐩🐣🐮🐨🐣🐭🐭🐨🐧🐩🐣🐨🐧🐯🐣🐰🐮🐨🐧🐪🐣🐨🐩🐪🐣🐭🐬🐨🐨🐧🐣🐫🐰🐣🐨🐧🐰🐰🐮🐣🐫🐰🐣🐨🐨🐬🐪🐩🐣🐰🐬🐣🐰🐮🐨🐨🐫🐣🐬🐨🐣🐰🐬🐰🐰🐣🐨🐨🐮🐣🐫🐪🐨🐧🐨🐣🐨🐩🐬🐣🐧
base100解码:
将其恢复成可打印ascii
82,71,66,102,108,97,103,123,65,110,49,109,97,49,115,32,95,97,114,51,95,99,117,43,101,125,0
# ASCII 码表中的可打印字符的编号范围是 32-126(0x20-0x7E),共 95 个字符
ascii(10进制)转换成可打印字符
去除RGB即为flag
7.题目:[大礼包]
考点:
(1)压缩包密码爆破
(2)双重base编码
(3)栅栏加密
(4)凯撒移位(Rot13,凯撒移位13)
题目来源:polarctf-misc-[大礼包]
解题:
题目给了一个加密的压缩包,根据提示,进行纯数字爆破
将压缩包打开,得到一张图片,用010打开,在其末尾发现base编码
一键base后base32解码成功
还是base加密,继续一键base,得到类似flag的东西
栅栏为2,栅栏解密
然后凯撒移位13(即rot13加密)得到flag
8.[题目]:[docx隐写]
考点:
docx文件隐写
题目来源:polarctf-misc-[docx隐写]
解题:
压缩包解压后得到一个docx文件
将所有文字选中,更改字体颜色,得到第一段flag
注:第二段flag该附件上看不到,其他人的wp写着打开即可看到
将docx文件改成zip文件,解压得到第三段flag
9.题目:[二维码]
考点:
(1)base64转图片
(2)二维码
题目来源:polarctf-misc-[二维码]
解题:
用010打开
base64转图片
点击"美化笔",得到二维码
扫码得到flag
10.题目:[可爱的冰墩墩]
考点:
(1)文件分离(binwalk工具)
(2)反编译(pyc)
(3)flag运算操作
题目来源:polarctf-misc-[可爱的冰墩墩]
解题:
点开图片,图片上显示一个flag,提交显示错误
用binwalk进行分离,得到一个加密的压缩包
提示密码全是小写字母,但爆破半天没爆破出来
联想到刚才假的flag,应该为密码,输入解压成功
在线反编译pyc文件
代码审计
# Visit https://www.lddgo.net/string/pyc-compile-decompile for more information
# Version : Python 3.7
ciphertext = ''
flag = ''
for i in range(len(flag)):
i = ord(flag[i]) + 10
ciphertext.append(str(i))
print(ciphertext[::-1])
ciphertext = [
'62',
'60',
'65',
'108',
'111',
'60',
'109',
'111',
'59',
'109',
'107',
'107',
'107',
'107',
'63',
'64',
'111',
'60',
'64',
'109',
'60',
'108',
'59',
'60',
'109',
'64',
'66',
'61',
'111',
'109',
'65',
'61']
代码逻辑:原flag值ascii值减10然后拼接得到ciphertext,再将ciphertext进行倒序输出
解题脚本:
ciphertext = [
'62',
'60',
'65',
'108',
'111',
'60',
'109',
'111',
'59',
'109',
'107',
'107',
'107',
'107',
'63',
'64',
'111',
'60',
'64',
'109',
'60',
'108',
'59',
'60',
'109',
'64',
'66',
'61',
'111',
'109',
'65',
'61']
ciphertext = ciphertext[::-1]
flag = ''
for i in range(len(ciphertext)):
i = int(ciphertext[i])-10
flag=flag+chr(i)
print(flag)
运行得到flag