Bugku CTF:论剑[WriteUP]

文章讲述了如何通过文件的十六进制分析,使用010editor工具查找特定十六进制值,解压7z文件并找到隐藏的flag。作者逐步揭示了通过图像处理和编码技术获取信息的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开头拿到文件,右键属性查看详细信息查看分辨率

常规做法改高度或者宽度

拿到010editor里查找781和66的十六进制的位置

一般来说会在FF C0周围,但也不一定。直接查分辨率十六进制是比较稳的


781和66的十六进制分别是:30D、42。直接用搜索功能查找 00 42

或者查找 30 D0、03 0D。只要高度和宽度的十六进制数是连在一起的那就找对了 

我这里直接尝试把高度66改成150。也就是十六进制的96

返回图片就可以看到隐藏了的信息

我们把能看到的数据提取出来

flag{666c61677B6D795F6E61**65**4**121**7**hhhh}


接下来尝试在编辑工具里,把查找模式从’十六进制字节‘改成‘文本’

尝试搜索01串,发现有大量的二进制码

尝试使用二进制转ascii

获取一串不明所以的文字:mynameiskey!!!hhh

有可能是能用上的密码,乘胜追击查看十六进制数据里还有没有隐藏了的东西

发现7B BC AF 27 1C很像7z文件的十六进制头

7z十六进制文件头:37 7A BC AF 27 1C

我们把文件里的这段数据改成7z头 

再在dd里尝试分离出7z文件

一套组合拳

ls
binwalk file.jpg
dd if=file.jpg of=out.7z bs=1 skip=9591 count=17569

提取出来的7z文件发现需要解压密码

这里把:mynameiskey!!!hhh  直接填入解压成功

获得一个新文件:ljc2.jpg

依然是查看该文件的详细信息,分辨率是622 x 62

转化成十六进制就是:26E x 3E

直接进入十六进制编辑软件再次搜索(别忘了把搜索模式换回十六进制字节)

我这里直接搜索02 6E和00 3E直接搜索到了

这里把高度3E直接改成96(也就是十进制的150,这个数字自己随便往大的填)

这里就直接拿到了flag此前被遮掩的一部分

两个部分拼起来就是flag{666C61677B6D795F6E616D655F482121487D}

直接填答案发现不对,所以这里应该还需要解码

使用base16尝试解码

那么答案就是:flag{my_name_H!!H}

### CTF JPG 图片隐写术的技术原理及实现方法 JPG图片隐写的常见技术主要依赖于最低有效位(Least Significant Bit, LSB)替换和离散余弦变换(Discrete Cosine Transform, DCT)。以下是具体的原理和技术细节: #### 1. **最低有效位(LSB)替换** 最低有效位替换是最常见的隐写技术之一。它利用人类视觉系统的局限性,在图像的颜色通道中修改最低几位二进制数值,从而嵌入秘密信息[^2]。 对于RGB图像而言,每个像素由红、绿、蓝三个颜色分量组成,每种颜色通常占用8比特的空间。由于最低有效位的变化对整体色彩的影响微乎其微,因此可以安全地将数据隐藏其中。 ```python def lsb_hide(image_path, message): from PIL import Image img = Image.open(image_path).convert('RGBA') binary_message = ''.join(format(ord(char), '08b') for char in message) + '11111111' pixels = list(img.getdata()) new_pixels = [] index = 0 for pixel in pixels: r, g, b, a = pixel if index < len(binary_message): r_new = (r & ~1) | int(binary_message[index]) index += 1 else: r_new = r if index < len(binary_message): g_new = (g & ~1) | int(binary_message[index]) index += 1 else: g_new = g if index < len(binary_message): b_new = (b & ~1) | int(binary_message[index]) index += 1 else: b_new = b new_pixels.append((r_new, g_new, b_new, a)) stego_img = Image.new(img.mode, img.size) stego_img.putdata(new_pixels) return stego_img ``` 上述代码展示了如何通过Python脚本实现简单的LSB隐写操作[^3]。 --- #### 2. **基于DCT的隐写技术** JPEG格式采用的是有损压缩方式,核心在于离散余弦变换(DCT),这使得在频域而非空间域进行隐写成为可能。相比于直接修改像素值的方法,这种方法更加隐蔽且难以被检测到。 具体过程包括以下几个阶段: - 将原始图像划分为多个8×8的小块; - 对这些小块分别施加DCT转换; - 修改某些特定频率系数的低阶比特以携带隐藏消息; - 应用逆向DCT恢复图像并保存为新的JPEG文件。 这种方案的优势在于即使经过多次压缩或者轻微编辑处理之后仍然能够较好保留所藏匿的信息内容[^1]。 --- #### 3. **工具支持下的实践流程** 在实际参加CTF竞赛过程中,选手们往往会借助专门设计好的软件完成快速分析工作。例如Stegsolve.jar就是一个非常流行的开源项目,它可以用来查看不同层面上的数据分布情况;而foremost则擅长批量提取潜在目标对象等特性。 --- ### 实现注意事项 当尝试构建自己的解决方案时需要注意以下几点事项: - 确保选用恰当编码机制以便兼容各种字符集; - 考虑容量限制因素以免破坏载体质量过多引起怀疑; - 测试多种环境条件下表现稳定性验证可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

x0da6h

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值