ctfshow-misc和36D没关系 和36D有关系
创始人
2025-05-28 20:14:37
0

前言:

前几天做题发现了两道题,一个和36D没关系 一个和36D有关系,结果做到最后后,没有一个和36D有关系,觉的挺有意思,就在这里分享一下,一点自己的拙见,各位师傅见笑了

感谢各位读者,对我的支持( •̀ ω •́ )y 有什么问题和建议可以私聊我

和36D没关系

下载解压得到图片一张

他说和36D没关系 他越这么说我越感觉有关系

不管这么多

我们正常分析就行

而话不多说010走一波

后来发现图片尾部还有一张图片

使用binwalk验证一遍

发现确实存在图片

我们尝试分离 使用formost

得到原图和一个看起来一模一样的图片

看到两张一样的图片我的第一反应就是盲水印,或者异或

可惜结果都不是

那就去比较两张图片有什么不同

010就有这个功能 要多多利用

表面没有看什么但有经验的人会发现

两张图的rgb不同,比较rgb,发现有的相同有的相差1

两张图每一个点的rgb,一样的记成0,不一样的记成1

两张图都是128x128,不过不知道为什么第一张图的rgb是四位,第二张是三位?

这里肯定要使用脚本弄出来保存为2.png,原图保存为1.png【第二个脚本是直接输出图片(不过有点小问题,如果那个师傅基础好,可以改一下),而第一个则是输出为二进制文本,之后还要转图片】

脚本一

是输出为二进制文本,之后还要转图片

from PIL import Imageim1 = Image.open("2.png")
im2 = Image.open("1.png")
p1 = im1.load()
p2 = im2.load()
string = ""
for i in range(128):cnt = 0for j in range(128):r1, g1, b1, a1 = p1[i, j]# 四位的# print(p1[i, j])r2, g2, b2 = p2[i, j]# 三位的# print(p2[i, j])# p[i,j] = (r2-r1,g2-g1,b2-b1)if r2 == r1:string += "0"else:string += "1"
f = open("c.txt", 'w', encoding="utf-8")
f.write(string)
f.close()

脚本二

直接输出图片(不过有点小问题,如果那个师傅基础好,可以改一下)

from PIL import Imageim1 = Image.open("2.png")
im2 = Image.open("1.png")
p1 = im1.load()
p2 = im2.load()
w = im1.size[0]
h = im1.size[1]string = ""
for i in range(128):cnt = 0for j in range(128):r1,g1,b1,a1 = p1[i, j]# print(p1[i, j])r2,g2,b2 = p2[i, j]# print(p2[i, j])# p[i,j] = (r2-r1,g2-g1,b2-b1)if r2==r1:string += "0"else:string += "1"
f = open("a.png",'w',encoding="utf-8")
f.write(string)
f.close()

运行脚本得到二进制文件

下一步就是二进制转图片了

这时候010上场

新建十六进制文本粘贴自二进制

保存为png格式

得到flag

flag{36D_is_beautyful}

和36D有关系

上题没关系这题又来个有关系

那这个题就肯定又关系了

这里有个小小的提示就是图片名字是LSB

这里我们直接看作者解析吧

这是一入门隐写题。

为什么说入门呢?一是因为坑只有两个,而且跟上一题有承接关系,根据上一道思路容易猜到解题思路。二是两个坑都有提示。

坑1

这个题是下载下来之后是张图片,图片的名字是LSB.png就是这么简单粗暴的告诉大家最低位隐写,不要四处抓瞎了,看本狸就是这么实诚,绝不会和别的出题人一样让大家在misc的海洋里到处乱撞。

坑1.5

既然是LSB了,那么众所周知电脑显示的图片都是RGB三个通道,那在哪个通道呢?题目没有提示,

但是,没有提示本身就是提示啊,没说那个通道,那当然是我都要了

坑 1.5.5

三个通道都要的隐藏信息可能有两种方式,一是三个通道明码存信息然后连接起来,这种方式的问题是我没告诉你连接顺序,我这么厚道的人怎么会让大家去排列组合尝试呢?所以这是不可能的;二是用三个通道的最低位通过某种计算存储一组信息,而可以接受3个运算位、可以简单还原原始信息,且符合“入门级”定位的运算是什么呢?很显然 只有异或。

所以思路有了,把每个像素红绿蓝最低位异或一下,

等你跨国第一个坑的时候,你会发现解出来的东西啥都不像,因为还有一个坑

坑2

你仔细观察照片会发现一个不协调的地方,那就是头像似乎是倒着的,对的,这其实是暗示大家,隐藏的信息是逆序灌进去的,所以你需要把坑1解出来的二进制流逆序一下,再看,你就会发现很熟悉的东西。

然后只需要把它另存成某种格式的文件,打开就可以了。

因为我的代码太烂,而且重复造了一堆奇奇怪怪的轮子,所以总是不好意思贴代码,不过有小伙伴似乎解题不太理想,所以没办法,把我的烂代码放出来吧,想笑就笑把。。。

作者脚本

import cv2 as cv
import numpy as np
import struct
import binascii
from PIL import Imageclass FileF:@staticmethoddef l2bf(fn='data.txt', dat=b''):bst = b''if isinstance(dat, str):bst = bytes(dat, 'utf-8')elif isinstance(dat, list):bst = bytes(dat)else:bst = datwith open(fn, 'wb') as f:f.write(bst)class PicBits: #像素操作img = Nonefn = ''def __init__(self, fn=''):try:self.img = cv.imread(fn)self.fn = fnexcept:passdef show(self):cv.imshow(self.fn, self.img)cv.waitKey(0)cv.destroyAllWindows()def getxy(self, x=0,y=0):ret = [0,0,0]height = self.img.shape[0]weight = self.img.shape[1]channels = self.img.shape[2]if x < 0 : x = -xif y < 0 : y = -yret =[]for c in range(channels):ret.append(self.img[y%height,x%weight,c])return retdef setxy(self, x=0,y=0 ,col=[0,0,0]):ret = [0,0,0]height = self.img.shape[0]weight = self.img.shape[1]channels = self.img.shape[2]if x < 0 : x = -xif y < 0 : y = -yself.img[y%height,x%weight] = coldef save(this,fn=''):if fn=='':fn=this.fncv.imwrite(fn,this.img)class CharF:@staticmethoddef SplitByLen(t="", l=8, instr=" "):if l < 1: return tret = ""for i in range(len(t)):ret += t[i]if i % (l) == l - 1: ret += instrwhile ret.startswith(instr):ret = ret[len(instr):]while ret.endswith(instr):ret = ret[:-len(instr)]return ret@staticmethoddef str2num(txt="0", split=' ', bs=16, spl=0):txt = txt.lower()munl = []if spl == 0:numl = txt.split(split)else:numl = CharF.SplitByLen(txt, spl, ' ').split(' ')retl = []for i in numl:try:retl.append(int(i, bs))except:passreturn retl
#真正有用的就下面这几句,上面的全是我的破烂存货
def dec():yt = PicBits('LSB.png')bits=""for i in range (128):for j  in range(128):c = yt.getxy(127-i,127-j) #逆序bits+=chr(ord('0')+((c[0]^c[1]^c[2])&1))l = CharF.str2num(bits,bs=2,spl=8)FileF.l2bf('LSB2.png',l)dec()

运行得到图片

flag{36d@ctf_show}

这时候就有人问了这和36D有什么关系

这里作者也做出了回应

加油各位( •̀ ω •́ )y 期待与君再相逢

相关内容

热门资讯

银价推涨光伏组件报价,下游企业... 来源:第一财经 受成本端银价上涨影响,本周光伏组件价格再次上调。据行业机构Infolink Cons...
黄金史诗级暴跌,原因可能与一纸... 当地时间1月30日,随着美联储前理事凯文·沃什(Kevin Warsh)正式被美国总统特朗普提名为下...
深圳国资七亿下场扫货白石洲? 来源:市场资讯 (来源:深圳房产在线) 最近看到,近日一则消息引发关注,就是今年1月发生一宗白石洲大...
国投智能2025业绩承压 AI... 来源:财联社 财联社1月30日讯(记者 方彦博)2025年,AI应用的商业化落地是众多AI企业面临的...
原创 男... 在爱情的海洋中,星座的波涛有时能揭示出隐藏的情感暗流。当男人在愤怒的风暴中显露出四种迹象时,或许他并...
农业银行董事长谷澍会见英格兰银... 来源:市场资讯 来源:中国农业银行 1月29日,农业银行董事长谷澍会见了英格兰银行副行长兼英国审慎监...
“易中天”,业绩大爆发!需求增... “易中天”2025年度业绩持续爆发! 1月30日晚间,中际旭创发布2025年度业绩预告,预计2025...
双平台战略提速:仙乐健康谋“A... 中国营养健康食品行业的龙头企业仙乐健康,在1月30日向市场投下了一枚重磅消息:公司已正式向香港联交所...
左季庆染指淳厚基金股权纷争为谁... 2026年1月6日,证监会一纸批复核准上海长宁国有资产经营投资有限公司(下称“长宁国资”)成为淳厚基...
上市即巅峰?拉芳家化首度亏损,... 为什么消费端对“拉芳”爱不起来了? 作者 | 方璐 编辑丨于婞 来源 | 野马财经 拉芳家化(603...
原创 黄... 1月31日晚间,英伟达CEO黄仁勋现身中国台湾台北市砖窑古早味怀旧餐厅,宴请了35位与英伟达合作的供...
山西太钢不锈钢股份有限公司 2... 来源:证券日报 证券代码:000825 证券简称:太钢不锈 公告编号:2026-001 本公司及董...
把自己的银行贷款出借给别人,有... 新京报讯(记者张静姝 通讯员邸越洋)因贷款出借后未被归还,原告牛女士将被告杨甲、杨乙诉至法院,要求二...
金价暴跌,刚买的金饰能退吗?有... 黄金价格大跌,多品牌设置退货手续费。 在过去两三天,现货黄金价格经历了“过山车”般的行情,受金价下跌...
预计赚超2500万!“豆腐大王... 图片来源:图虫创意 在经历了一年亏损后,“豆腐大王”祖名股份(003030.SZ)成功实现扭亏为盈。...
特朗普提名“自己人”沃什执掌美... 据新华社报道,当地时间1月30日,美国总统特朗普通过社交媒体宣布,提名美国联邦储备委员会前理事凯文·...
爱芯元智将上市:连年大额亏损,... 撰稿|多客 来源|贝多商业&贝多财经 1月30日,爱芯元智半导体股份有限公司(下称“爱芯元智”,HK...
一夜之间,10只A股拉响警报:... 【导读】深康佳A等10家公司昨夜拉响退市警报 中国基金报记者 夏天 1月30日晚间,A股市场迎来一波...
谁在操控淳厚基金?左季庆为谁趟... 2026年1月6日,证监会一纸批复核准上海长宁国有资产经营投资有限公司(下称“长宁国资”)成为淳厚基...
工商银行党委副书记、行长刘珺会... 人民财讯1月31日电,1月29日,工商银行党委副书记、行长刘珺会见来访的上海电气集团党委书记、董事长...