jjzjj

CTF之图片隐写

红帽小生 2024-03-15 原文

1、前言

CTF的全称是Capture The Flag,直译过来就是“获取旗帜”。这种比赛属于网络安全领域,是网络安全技术人员之间的一种竞技形式。CTF起源于1996年DEFCON全球黑客大会,以代替黑客们通过发起真实攻击进行技术比拼。

发展至今,全球已经有各种CFT类的比赛了,DEFCON作为CTF赛制的源头,DEFCON CTF自然成为了全球最高技术水平和影响力的CTF竞赛,类似于足球里的“世界杯” ,比赛的奖金也很高。

CTF既然叫“获取旗帜”,那么肯定得有个Flag,如下图,目标靶机里面藏着Flag,选手们通过各种手段去得到这个Flag,提交就可以拿到分数。

CTF比赛主要分为下面大三类:

  1. 解题模式 - Jeopardy
  2. 攻防模式 - Attack & Defense
  3. 混合模式 - Mix

而第一类解题模式又主要分为以下类型:

  • Web 网络攻防
  • RE 逆向工程
  • Pwn 二进制漏洞利用
  • Crypto 密码攻击
  • Misc 安全杂项

安全杂项的涉及范围也比较广,但比较喜欢考的就是"图片隐写"。今天我们讲的就是图片隐写。

2、图片隐写

隐写术对于刚接触CTF的人来说会感觉比较神奇。题目的Flag会隐藏到图片、音频、视频等各类数据载体中供参赛选手获取。要么是修改这些载体来隐藏flag,要么就是将flag隐藏在这些载体的二进制空白位置。有时需要很强的侦察能力才能发现(有时也需要脑洞)。此类题目考查选手们对各种隐写工具、隐写算法的熟悉程度。

2.1、 LSB隐写

图片一般由RGB三原色组成,每个像素点的R、G、B都占有8bit,即有256种颜色,一共包含256的三次方颜色,即16777216中颜色,人类的眼睛可以区分约1,000万种不同的颜色,剩下无法区分的颜色就有6777216。换句话说,人类对相近的颜色敏感度较低,因此部分像素点改变肉眼不容易察觉,LSB隐写就是利用这一特点,修改了像素中的最低位,把一些信息隐藏起来。

在计算机中,数据以二进制形式存储,假如某个像素点的一个值是255,二进制值是11111111,把最后一位替换成0,对应的十进制变为254,通过这一方法隐藏信息,但是肉眼不易察觉(写轮眼除外)。

那么如何获取隐写的Flag呢,这就需要一些工具,比较好使的是:Stegsolve。这个使用很方便,也很小巧,305KB,不到0.5MB,什么概念,比一张图片都小。如下图:

使用命令启动:

java -jar Stegsolve.jar

启动之后如图:

2.2、StegSolve

可以看到,菜单栏有三列:File、Analyse、Help。全部功能都在Analyse这列,File负责打开文件。我们随便打开一张图片:

File Format:查看文件格式。如下图:

该功能会显示图片的具体信息。最关键的是这个"Data Extract"功能,负责数据提取。如图:

左边是4个通道:Alpha(表示透明度)通道和R、G、B通道。Alpha表示透明度:Alpha=0表示完全透明,Alpha=255为完全不透明。颜色值前面讲过,是0-255,2的8次方,可以自由选择0-7任意一个通道(例如Red 勾选3,就是把图片中Red值为8的全部提取出来,2的3次方是8)。
右边的Bit Order有MSB和LSB,看到这个LSB大家就明白上面讲的了,MSB是一串数据的最高位,LSB是一串数据的最低位。
Bit Plane Order:这个是调整位平面的顺序,前面我们说过,每个像素点都有RGB三个值,即每像素点相当于有3层,3*8个bit。从LSB(最低有效位0)到MSB(最高有效位7)随着从位平面0 到位平面7,位平面图像的特征逐渐变得复杂,细节不断增加。

采用LSB隐写,每个像素可以携带3bit的信息。修改后肉眼无法区分,如下图:

左边3种绿色几乎不能区分(写轮眼除外)。我们只需要把最低位的二进制全部提取出来,就可以获取隐写的信息。

这种题目可以通过调整Bit Planes中的数值,预览文本框中的十六进制表,即可获取flag。
PS:png图片是一种无损压缩,也只有在无损压缩或无压缩的图片(bmp图片是一种无压缩)上实现LSB隐写,如果是jpg图片,就没法使用LSB隐写。

练习

最后出一道题,找出图片中的Flag,文件可以在本人公众号:极客随想,回复:图片隐写,即可获取(StegSolve工具和图片文件都已打包)。找到Flag后可以在评论区留言。

有关CTF之图片隐写的更多相关文章

  1. ruby-on-rails - Ruby on Rails - 为文本区域和图片生成列 - 2

    我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数

  2. ruby-on-rails - Rails 3,在RAILS_ROOT上方显示来自本地文件系统的jpg图片 - 2

    我正在尝试找出一种方法来显示来自不在RAILS_ROOT下(在RedHat或Ubuntu环境中)的已安装文件系统的图像。我不想使用符号链接(symboliclink),因为这个应用程序实际上是通过Tomcat部署的,而当我关闭Tomcat时,Tomcat会尝试跟随符号链接(symboliclink)并删除挂载中的所有图像。由于这些文件的数量和大小,将图像放在public/images下也不是一种选择。我查看了send_file,但它只会显示一张图片。我需要在一个格式良好的页面中显示6个请求的图像。由于膨胀,我宁愿不使用Base64编码,但我不知道如何将图像数据与呈现的页面一起传递下去。

  3. 最新版人脸识别小程序 图片识别 生成二维码签到 地图上选点进行位置签到 计算签到距离 课程会议活动打卡日常考勤 上课签到打卡考勤口令签到 - 2

    技术选型1,前端小程序原生MINA框架cssJavaScriptWxml2,管理后台云开发Cms内容管理系统web网页3,数据后台小程序云开发云函数云开发数据库(基于MongoDB)云存储4,人脸识别算法基于百度智能云实现人脸识别一,用户端效果图预览老规矩我们先来看效果图,如果效果图符合你的需求,就继续往下看,如果不符合你的需求,可以跳过。1-1,登录注册页可以看到登录页有注册入口,注册页如下我们的注册,需要管理员审核,审核通过后才可以正常登录使用小程序1-2,个人中心页登录成功以后,我们会进入个人中心页我们在个人中心页可以注册人脸,因为我们做人脸识别签到,需要先注册人脸才可以进行人脸比对,进

  4. ruby-on-rails - 带图片 uploader 的多步表单 - 2

    我想建立3步用户注册,在第2步上传头像。所以我遵循RyanBates的指南http://railscasts.com/episodes/217-multistep-forms.我正在使用CarrierWavegem来处理上传。但似乎我无法在用户session中存储上传的文件信息(我收到无法转储文件错误)。我在Controller中使用以下技术ifparams[:user][:img_path]@uploader=FirmImgUploader.new@uploader.store!(params[:user][:img_path])session[:img]=@uploaderpara

  5. ruby - 如何在 Ruby 中更新图片文件的 EXIF 标签? - 2

    标题说明一切。 最佳答案 我正在使用MiniExiftool,它是Perl的Exiftool的ruby​​接口(interface)。https://github.com/janfri/mini_exiftoolhttp://www.sno.phy.queensu.ca/~phil/exiftool/用法:exif=MiniExiftool.new(file_path)exif.date_time_original=Time.nowexif["captionextract"]="Thisismynewcaption"exif.sav

  6. css - 如何让我的背景图片只出现在 rails 4 的一页上? - 2

    我有一张背景图片,我无法只停留在一页上。我制作了一个带有一个主视图的欢迎Controller来显示它。我也在预编译我的Assets。背景显示得很好,但我的目标是只在我的home.html.erbView中显示背景图像。欢迎/home.html.erb:"lang="">title欢迎Controller:classWelcomeController样式表/welcome.css.scss:body{background:{image:asset-url("image.jpg");}}我的应用程序布局中有以下内容:在config/initializers/assets.rb中:Rails

  7. ruby - prawn - 从 URL 导入图片 - 2

    我似乎无法弄清楚如何从url导入图像要从我使用的本地主机导入图像:image"./assets/images/img.png"当我用它说的URL替换路径时`image':URLnotfound是否有解决方案,或者我应该创建一个def来下载图像并使用它返回的路径? 最佳答案 您需要执行以下操作-require"open-uri"Prawn::Document.generate(INSERT_YOUR_PDF_FILENAME_HERE)doimageopen(INSERT_YOUR_URL_HERE)end引用http://rubyd

  8. ruby open-uri打开方法丢失文件扩展名打开图片 - 2

    我正在使用ruby​​1.9.2以及Rails3.1.4和Paperclip2.4.5。我的问题是尝试从URI保存回形针附件会丢失文件扩展名并保存文件而不会导致诸如需要扩展名的fancybox之类的问题。一些示例代码:uri="http://featherfiles.aviary.com/2012-06-13/bbe5f0de1/0c5a672b88ea47ecb4631ac173e27430.png"open(uri)#=>#因为临时文件上没有扩展名回形针正在保存文件而没有导致问题。有人遇到过这个问题吗?我已经看到关于使用回形针存储来自URI的图像的多个答案,但似乎没有一个解决我们正

  9. css - Sass 和 Compass 中的背景图片路径 - 2

    这个在config.rb文件中有提到images_dir="images"我在images文件夹中的元素中使用2个文件夹存放图像imagesimages/background/images/content/如果images/background/文件夹中有任何图像,那么我应该如何在cssbackground和Sass变量中添加图像路径?$header-img:"sass.gif";和background-image:url('sass.gif?1327592426');以及如何从每个背景图像中删除这个自动生成的?1327592426? 最佳答案

  10. ruby-on-rails - Rails Carrierwave Base64 图片上传 - 2

    使用Carrierwave将图像从客户端上传到Rails后端的最佳方式是什么。现在我们的iOS开发人员将文件作为base64发送,所以请求是这样的:"image_data"=>"/9j/4AAQSkZJRgABAQAAAQABAAD/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAHqADAAQAAAABAAAAHgAAAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE

随机推荐