首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python和ctf中的变态隐写题

回家后就各种通宵……各种召唤师峡谷。

反正感觉活的很颓废,需要点向上的积极动力

但是我的狗窝不允许

所以我离开了那个颓废的地方

恩。

想起来很早之前有一个朋友和我讨论过的问题。

又想起来在学校就给自己留下的一个问题,

突然感觉有好多事。

一样一样解决。

首先就是一道ctf的隐写题。题目:

看完题目之后。 脑子里是嗡嗡的。

这……这完全不给提示,怎么做。

看完wp更是觉得嗡嗡的:

虽然还是嗡嗡的,但是毕竟别人py脚本都贴出来了,当然心里有点b数了。于是就开始了还原代码的阶段。这是py2。

理清头绪,把每个16进制转换成2进制后,通过0和1的规律排序生成一个二维码。

因为0代表黑,255代表白色。

————————

首先,我放弃了深度学习numpy和pil的念头,

因为

好吧立下flag如果下次再遇到这种题就去深入了解这两个库。

但是看懂这个必须要了解一样东西,

Python的列表解析

因为大佬的东西,你就算不会写这种,也要会看,

举个栗子:

bwmat = [[0 if b==blackbit else 255 for b in row] for row in binmat]

如果你没有列表解析的一点点基础,又没有这代码的前后代码。我估计,很难看懂。 为了深入理解我们找几个简单的栗子。

list1=[0 for i in range(10)]//生成十个0组成的列表

list1=[0 if i==3 else 1 for i in range(10)]//生成十个由1组成的列表,如果i等于3那么把那个位置换成0

所以这段代码做到了把1换成了0,把0换成了255

强大吗,是不是又想来一句,

py大法好。

哈哈哈。

然后简单解释一下这个脚本。

————————

defhex2bin(hexmat):

binmattemp = [bin(m)[2:]forminhexmat]

rowlen =max([len(m)forminbinmattemp])

binmat = [[]+[int(b)forbinrow.zfill(rowlen)]forrowinbinmattemp]

print(rowlen+1,'x',len(binmat))

foriinrange(len(binmat)):

print(''.join([str(b)forbinbinmat[i]]))

returnbinmat,rowlen+1,len(binmat)

defrm_col(binmat,col):

temp=[row[:col]+row[col+1:]forrowinbinmat]

print(temp)

return[row[:col]+row[col+1:]forrowinbinmat]

hex2bin这个函数把题目的16进制转换成了2进制并返回了宽高。

原谅我不想深究 不是不想,是我真的笨

rm_col 删除了col 从后面的调用来看是删除了第22个,然后又删除了第7个。也不知道为什么……

还有

zfill

是取指定长度,不足的前面补0

如果是我……

还要什么脚本,最多写个脚本批量调用这个借口……

哈哈哈哈…… 逃

————————

defmake_bw_img(binmat,w,h,outfilename,blackbit=):

bwmat = [[ifb==blackbitelse255forbinrow]forrowinbinmat]

img = Image.fromarray(np.uint8(np.array(bwmat)))

img.save(outfilename)

这里就是通过image.formarray一键生成导出我们的图片

大家可以简单试一试。

from PIL import Image

import numpy as np

a=np.zeros((254,256,3))

b = Image.fromarray(a, mode='RGB')

b.show()

至此,还是有好多问题。

————————

然后是16进制表示图片的问题

这个问题是一个朋友在写爬虫的时候遇到的问题,

不知道大家是否看过这种表示图片的方式:

data:image/png;base64,iVBORw0KGg

在网页中,为了减轻服务器负担,会将图片直接打包在网页中,用的就是这种方式。就不用src引用一个url去访问然后获得图片。

这种方式的缺点就是,浏览器不会缓存,也就是说,我们的爬虫不会get到这个图片。那就gg……

不过,我们可以通过别的方法,下载这种图片:

import base64

a=base64.b64decode("iVBOOH4X/7")

open("1.png","wb").write(a)

恩,可以给文章加一个标题:

Python将16进制转换为图片

以上。

ps,因为中途出去吃饭,完了之后直接被送回家。所以这篇文章还是在我狗窝完成的。

那么,晚安各位。

对了 在py2也就是原脚本中导入image是直接

import image的

但是在3里面,我们需要

from PIL import Image

由于这次代码都是直接贴的,没图片放,就用胖迪做封面了。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190123G158A300?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券