Skip to content

polarctf_web-简单题

1.题目:[爆破鬼才]

考点:

(1)压缩包手动分离

(2)压缩包密码爆破

题目来源:polarctf-misc-[爆破鬼才]

0

解题:

将图片用010打开,ctrl+f搜索压缩包文件头50 4B 03 04

屏幕截图2025-04-18142046

复制该文件头及其后面的数据

image-20250418142301732

点击右上角文件、新建

屏幕截图2025-04-18142426

得到新文件

image-20250418142545265

ctrl+s保存,添加后缀.zip,得到一个加密的压缩包

image-20250418142712197

使用ARCHPR工具进行密码爆破,得到密码,解压压缩包得到flag

image-20250418142944399

2.题目:[LSB]

考点:

最低有效位(LSB隐写)

题目来源:polarctf-misc-[LSB]

解题:

题目给了一张图片,根据题目"LSB",将图片设置为lsb最低有效位

屏幕截图2025-04-18132116

得到flag

屏幕截图2025-04-18133130

3.题目:[0和255]

考点:

图片与像素点转换

题目来源:Polarctf-misc-[0和255]

image-20250414204620002

解题:

靶场给了一个python文件image_list.py和一个像素列表文件image_list.txt

分析image_list.py源码

python
# -*- 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)

image-20250414204620002

写脚本复原图片即可

python
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]

image-20250414222636566

解题:

靶场给了一个加密的zip文件flag.zip和01二进制数据流hint.txt

查看hint.txt,猜测为图片像素

image-20250414222636566

脚本恢复

python
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](兽音译者在线编码解码 - 兽音翻译咆哮体加密解密)

image-20250414233258270

5.题目:[broken_hash]

考点:

(1)文件分离(binwalk工具)

(2)md5爆破

题目来源:Polarctf-misc-[broken_hash]

image-20250415190318557

解题:

靶场给了一个压缩包,解压后得到两个没有扩展名的文件

image-20250415190538150

010eiditor打开png文件,在其头部看到了png图片文件扩展名89 50 4E 47

屏幕截图2025-04-15190748

并在其尾部发现了flag字样

屏幕截图2025-04-15190942

猜测png可能是由多个文件合并而来,使用binwalk工具进行分离:binwalk -e --directory=./output ./png

屏幕截图2025-04-15195614

分离得到三个文件:空文本文件3E,二进制文件3E.zlib、加密的压缩包8E3EE.rar

屏幕截图2025-04-15195856

使用010打开得到的二进制文件,在其末尾发现了可疑数据CMT7bf21a26cd6,其中的CMT猜测为comment(提示)的缩写

屏幕截图2025-04-15200741

打开压缩包同样观察到这段可疑数据:

屏幕截图2025-04-15200345

查看靶场给的另一个文件tip

image-20250415200102024

提示压缩包密码是由小写字母和数字组成、长度为4的字符串的md5值,目前猜测那段可疑数据为密码md5值的前半部分,写脚本爆破密码(md5值为128位,16字节,一般使用32个十六进制字符表示)

python
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()

image-20250415203311229

得到密码为7bf21a26cd627170e0e05ceee551c044

输入密码将压缩包解压,得到一个没有后缀的flag文件

image-20250415203442052

010打开,得到flag:flag{dbee4535f4853a3adc9ac3bbe1358819}

image-20250415203518962

6.题目:[100RGB]

考点:

(1)base100解码

(2)ascii与字符转换

题目来源:Polarctf-misc-[100RGB]

image-20250415081956915

解题:

题目给了一个压缩包,解压后得到:

image-20250415082105859

将空格和换行去除:

python
text = """🐯🐩🐣🐮🐨🐣🐭🐭
🐨🐧🐩🐣🐨🐧🐯🐣🐰🐮
🐨🐧🐪🐣🐨🐩🐪🐣🐭🐬
🐨🐨🐧🐣🐫🐰🐣🐨🐧🐰
🐰🐮🐣🐫🐰🐣🐨🐨🐬
🐪🐩🐣🐰🐬🐣🐰🐮
 🐨🐨🐫🐣🐬🐨🐣🐰🐬
🐰🐰🐣🐨🐨🐮🐣🐫🐪
🐨🐧🐨🐣🐨🐩🐬🐣🐧"""
clean_text = text.replace('\n', '')
clean_text = clean_text.replace(' ','')
print(clean_text)
🐯🐩🐣🐮🐨🐣🐭🐭🐨🐧🐩🐣🐨🐧🐯🐣🐰🐮🐨🐧🐪🐣🐨🐩🐪🐣🐭🐬🐨🐨🐧🐣🐫🐰🐣🐨🐧🐰🐰🐮🐣🐫🐰🐣🐨🐨🐬🐪🐩🐣🐰🐬🐣🐰🐮🐨🐨🐫🐣🐬🐨🐣🐰🐬🐰🐰🐣🐨🐨🐮🐣🐫🐪🐨🐧🐨🐣🐨🐩🐬🐣🐧

base100解码:

image-20250415082256503

将其恢复成可打印ascii

txt
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进制)转换成可打印字符

image-20250415083458832

去除RGB即为flag

7.题目:[大礼包]

考点:

(1)压缩包密码爆破

(2)双重base编码

(3)栅栏加密

(4)凯撒移位(Rot13,凯撒移位13)

题目来源:polarctf-misc-[大礼包]

屏幕截图2025-04-18145819

解题:

题目给了一个加密的压缩包,根据提示,进行纯数字爆破

image-20250418150004673

将压缩包打开,得到一张图片,用010打开,在其末尾发现base编码

image-20250418150103436

一键base后base32解码成功

image-20250418150212623

还是base加密,继续一键base,得到类似flag的东西

image-20250418150322885

栅栏为2,栅栏解密

image-20250418150428562

然后凯撒移位13(即rot13加密)得到flag

image-20250418150541399

8.[题目]:[docx隐写]

考点:

docx文件隐写

题目来源:polarctf-misc-[docx隐写]

image-20250417191639903

解题:

压缩包解压后得到一个docx文件

image-20250417191722111

将所有文字选中,更改字体颜色,得到第一段flag

image-20250417191813881

注:第二段flag该附件上看不到,其他人的wp写着打开即可看到

将docx文件改成zip文件,解压得到第三段flag

屏幕截图2025-04-18131541

9.题目:[二维码]

考点:

(1)base64转图片

(2)二维码

题目来源:polarctf-misc-[二维码]

image-20250418153122369

解题:

用010打开

屏幕截图2025-04-18153304

base64转图片

image-20250418153412257

点击"美化笔",得到二维码

屏幕截图2025-04-18153441

扫码得到flag

image-20250418153652957

10.题目:[可爱的冰墩墩]

考点:

(1)文件分离(binwalk工具)

(2)反编译(pyc)

(3)flag运算操作

题目来源:polarctf-misc-[可爱的冰墩墩]

image-20250418155109256

解题:

点开图片,图片上显示一个flag,提交显示错误

用binwalk进行分离,得到一个加密的压缩包

image-20250418155233179

提示密码全是小写字母,但爆破半天没爆破出来

image-20250418155312200

联想到刚才假的flag,应该为密码,输入解压成功

image-20250418155426455

image-20250418155443499

在线反编译pyc文件

在线Python pyc文件编译与反编译

image-20250418155712250

代码审计

python
# 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进行倒序输出

解题脚本:

python
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

image-20250418162344162

滇ICP备2025057983号-1