BUUCTF派大星的烦恼

解压得到一张图片没啥有用信息

根据下面题目提示,用010editor打开图片发现一段16进制字符串

派大星最近很苦恼,因为它的屁股上出现了一道疤痕!我们拍下了它屁股一张16位位图,0x22,0x44代表伤疤两种细胞,0xf0则是派大星的赘肉。还原伤疤,知道是谁打的派大星!(答案为32位的一串字符串) 注意:得到的 flag 请包上 flag{} 提交

在010editor直接CTRL+C CTRL+V 是Ascii,复制如下

"DD"DD""""D"DD""""""DD"""DD"DD""D""DDD""D"D"DD""""""DD""D""""DD"D"D"DD""""D"DD""D"""DD"""""DDD""""D"DD"""D"""DD"""D""DD"D"D"DD"""DD""DD"D"D""DD""DD"DD"""D"""DD""DD"DD""D"D""DD"D"D"DD"""D"""DD"""D"DD""DD"""DD"D"D""DD"""D"DD""DD""DD"""""DDD""DD""DD"""D""DD""

复制16进制字符串

22 44 44 22 44 44 22 22 22 22 44 22 44 44 22 22

22 22 22 22 44 44 22 22 22 44 44 22 44 44 22 22

44 22 22 44 44 44 22 22 44 22 44 22 44 44 22 22

22 22 22 22 44 44 22 22 44 22 22 22 22 44 44 22

44 22 44 22 44 44 22 22 22 22 44 22 44 44 22 22

44 22 22 22 44 44 22 22 22 22 22 44 44 44 22 22

22 22 44 22 44 44 22 22 22 44 22 22 22 44 44 22

22 22 44 22 22 44 44 22 44 22 44 22 44 44 22 22

22 44 44 22 22 44 44 22 44 22 44 22 22 44 44 22

22 44 44 22 44 44 22 22 22 44 22 22 22 44 44 22

22 44 44 22 44 44 22 22 44 22 44 22 22 44 44 22

44 22 44 22 44 44 22 22 22 44 22 22 22 44 44 22

22 22 44 22 44 44 22 22 44 44 22 22 22 44 44 22

44 22 44 22 22 44 44 22 22 22 44 22 44 44 22 22

44 44 22 22 44 44 22 22 22 22 22 44 44 44 22 22

44 44 22 22 44 44 22 22 22 44 22 22 44 44 22 22

根据提示这是伤疤,共256位字符,只有两种状态,假设0X44为1,0X22为0.

011011000010110000001100011011001001110010101100000011001000011010101100001011

0010001100000111000010110001000110001001101010110001100110101001100110110001000110011011001010011010101100010001100010110011000110101001100010110011001100000111001100110001001100

https://icyberchef.com/

乱码,去下面网站把二进制字符串逆序再解码,逆序后不乱码,去提交依然不正确

再逆序

6406950a54184bd5fe6b6e5b4ce43832

flag{6406950a54184bd5fe6b6e5b4ce43832}

提交答案正确


以下使用python实现:

把最初二进制字符串每8位二进制分割,256/8=32,满足提示要求,二进制字符(binary-str)-逆序-转字符ASCII-逆序 把最初二进制字符串每8位二进制分割,逆序先转整数int(10进制))再使用chr函数转ASCII再逆序。

python脚本实现

复制代码
with open("派大星的烦恼.bmp", "rb") as fr:
    res = fr.read()[4000:4256]

    # 将字节值转换为 0 和 1 的列表
    binary_list = [0 if v == 34 else 1 for v in res]
    # 打印二进制列表
    print(binary_list)

    # 将列表中的每个元素转换为字符串并拼接成一个字符串
    binary_str = "".join(map(str, binary_list))
    print(binary_str)
flag=binary_str[::-1]
x=""
for i in range(len(flag)//8):
    x += chr(int(flag[8*i:(i+1)*8],2))
print(x[::-1])

又一个脚本:

复制代码
with open("派大星的烦恼.bmp", "rb") as fr:
    res = fr.read()[4000:4256]

    # 将字节值转换为 0 和 1 的列表
    binary_list = [0 if v == 34 else 1 for v in res]
    # 打印二进制列表
    print(binary_list)

    # 将列表中的每个元素转换为字符串并拼接成一个字符串
    binary_str = "".join(map(str, binary_list))
    print(binary_str)  
str=binary_str[::-1]
flag=""
for i in range(len(str)//8):
    flag += chr(int(str[8*i:(i+1)*8],2))
print(f"len:{len(flag)}")
print(f"flag is :{flag[::-1]}")

二进制字符(binary-str)-逆序-转字符ASCII-逆序 等同于

二进制字符每八位(binary-str)逆序 -转字符ASCII

换思路脚本修改如下

复制代码
with open("派大星的烦恼.bmp", "rb") as fr:
    res = fr.read()[4000:4256]

    # 将字节值转换为 0 和 1 的列表
    binary_list = [0 if v == 34 else 1 for v in res]
    # 打印二进制列表
    print(binary_list)

    # 将列表中的每个元素转换为字符串并拼接成一个字符串
    binary_str = "".join(map(str, binary_list))
    print(binary_str)

    # 将二进制字符串按每 8 个字符分割、反转并转换为整数列表
    integer_list = [int(binary_str[i:i + 8][::-1], 2) for i in range(0, len(binary_str), 8)]
    print(integer_list)

    # 将整数列表中的每个元素转换为十六进制字符串并拼接
    hex_str = "".join(map(lambda v: str(hex(v))[2:], integer_list))
       
    # 将十六进制字符串中的每个字符转换为对应的 ASCII 字符并拼接
    flag = "".join(chr(int(hex_str[i:i + 2], 16)) for i in range(0, len(hex_str), 2))


print(f"字符长度:{len(hex_str)}")
print(f"转换结果:{hex_str}")
print(f"len:{len(flag)}")
print(f"flag is :{flag}")

运行结果如下:

0110110000101100000011000110110010011100101011000000110010000110101011000010110010001100000111000010110001000110001001101010110001100110101001100110110001000110011011001010011010101100010001100010110011000110101001100010110011001100000111001100110001001100

54, 52, 48, 54, 57, 53, 48, 97, 53, 52, 49, 56, 52, 98, 100, 53, 102, 101, 54, 98, 54, 101, 53, 98, 52, 99, 101, 52, 51, 56, 51, 50

字符长度:64

转换结果:3634303639353061353431383462643566653662366535623463653433383332

len:32

flag is :6406950a54184bd5fe6b6e5b4ce43832

满足32位要求

包裹flag{}提交:

flag{6406950a54184bd5fe6b6e5b4ce43832}

上面代码有多余步骤,优化一下,binary_str to integer_list to hex_str to ASCII

多余了hex_str,改后binary_str to integer_list to ASCII

复制代码
with open("派大星的烦恼.bmp", "rb") as fr:
    res = fr.read()[4000:4256]

    # 将字节值转换为 0 和 1 的列表
    binary_list = [0 if v == 34 else 1 for v in res]
    # 打印二进制列表
    print(binary_list)

    # 将列表中的每个元素转换为字符串并拼接成一个字符串
    binary_str = "".join(map(str, binary_list))
    print(binary_str)

    # 将二进制字符串按每 8 个字符分割、反转并转换为整数列表
    integer_list = [int(binary_str[i:i + 8][::-1], 2) for i in range(0, len(binary_str), 8)]
    print(integer_list)

    flag = "".join(chr(v) for v in integer_list)  

    # 以下是多余步骤,注释掉,将整数列表中的每个元素转换为十六进制字符串并拼接
    #hex_str = "".join(format(v, "02x") for v in integer_list)
       
    # 将十六进制字符串中的每个字符转换为对应的 ASCII 字符并拼接
    #flag = "".join(chr(int(hex_str[i:i + 2], 16)) for i in range(0, len(hex_str), 2))



print(f"len:{len(flag)}")
print(f"flag is :{flag}")
相关推荐
Bigger1 分钟前
GitLab-Runner + AI 代码审查服务 + 远程大模型 全套部署运维实战
前端·ci/cd·ai编程
_xaboy2 分钟前
开源AI表单设计器 FcDesigner v3.5 版本发布!
前端·vue.js·低代码·开源·表单
爱讲故事的2 分钟前
操作系统第三讲:Context Switch —— 用户态如何安全地进入内核态?
前端·javascript·安全
提伯斯6467 分钟前
Linux minicom 串口工具超详细使用教程
linux·运维·服务器
土狗TuGou9 分钟前
SQL进阶笔记 · 第1篇:存储引擎
java·数据库·笔记·后端·sql·mysql
light blue bird13 分钟前
支轴事件任务线程执行工序路径的图表组件
前端·jvm·windows
终端行者13 分钟前
企业级 Jenkins Pipeline 实战Docker构建前端+Ansible发布
前端·ci/cd·docker·jenkins
雨落在了我的手上15 分钟前
Java数据结构(一):初识集合框架
java·开发语言
码语智行17 分钟前
Spring Security自定义AuthenticationManager实现手机号/密码双认证
java·后端·spring
SuniaWang17 分钟前
《AgentX 专栏》07-全链路可观测:用OpenTelemetry+Jaeger让每次AI对话都可追踪可复盘
java·人工智能·spring·架构·langchain·opentelemetry·agenx