前言

最近在学LSB隐写,用了强网杯的一个题目来学习。

学习过程中发现了个挺有用的工具,记录一下

题目地址:攻防世界–MISC–高手进阶区–打野

题目链接:https://pan.baidu.com/s/1Cqcr3y32BVxgeuX5wlRRvg 提取码:e9vf

正文

LSB隐写一般出现在BMP和PNG或者WAV文件上,因为JPG生成时图片会有一定程度的损坏,而这三个是原汁原味。

我们知道,计算机屏幕上颜色的显示是根据颜色值的,一个像素点由三种颜色组成,即RGB(红red绿green蓝blue首字母)。例如粉色#FFC0CB,这里的R是FF,G是C0,B是CB是由8*3=24个二进制位来编码,十六进制FF在二进制里面就是1111 1111,同理C0在二进制里面1100 0000。

倘若这时我把FF也就是1111 1111改成1111 1110,肉眼是看不出有任何变化的

这里就是题目的考点,这里可以隐藏信息,同理把G也改一下B也改一下,就可以改动3个比特位,也就是说一个像素点就可以隐藏3bit的信息。

下面介绍的这个工具是zsteg,至于原理是什么,慢慢再更新3

先弄到zsteg这个工具,参考https://www.cnblogs.com/-an-/p/12193422.html

话说新版的kali很难用啊很多之前自带的工具都没有(对我这个小白不友好)。换源的时候等了比较久,不知道大伙们是不是都这样。

反手一敲

zsteg 1.bmp

最后getflag

这是网上找到的python实现LSB隐写

# -*- coding: UTF-8 -*-
from PIL import Image
def plus(str):
      #Python zfill() 方法返回指定长度的字符串,原字符串右对齐,前面填充0。
    return str.zfill(8)
def get_key(strr):
      #获取要隐藏的文件内容
    tmp = strr
    f = file(tmp,"rb")
    str = ""
    s = f.read()
    for i in range(len(s)):
        #逐个字节将要隐藏的文件内容转换为二进制,并拼接起来
        #1.先用ord()函数将s的内容逐个转换为ascii码
        #2.使用bin()函数将十进制的ascii码转换为二进制
        #3.由于bin()函数转换二进制后,二进制字符串的前面会有"0b"来表示这个字符串是二进制形式,所以用replace()替换为空
        #4.又由于ascii码转换二进制后是七位,而正常情况下每个字符由8位二进制组成,所以使用自定义函数plus将其填充为8位
        str = str+plus(bin(ord(s[i])).replace('0b',''))
        #print str
    f.closed
    return str
def mod(x,y):
    return x%y;
#str1为载体图片路径,str2为隐写文件,str3为加密图片保存的路径
def func(str1,str2,str3): 
    im = Image.open(str1)
    #获取图片的宽和高
    width = im.size[0]
    print "width:"+str(width)+"\n"
    height = im.size[1]
    print "height:"+str(height)+"\n"
    count = 0
    #获取需要隐藏的信息
    key = get_key(str2)
    keylen = len(key)
    for h in range(0,height):
        for w in range(0,width):
            pixel = im.getpixel((w,h))
            a=pixel[0]
            b=pixel[1]
            c=pixel[2]
            if count == keylen:
                break
            #下面的操作是将信息隐藏进去
            #分别将每个像素点的RGB值余2,这样可以去掉最低位的值
            #再从需要隐藏的信息中取出一位,转换为整型
            #两值相加,就把信息隐藏起来了
            a= a-mod(a,2)+int(key[count])
            count+=1
            if count == keylen:
                im.putpixel((w,h),(a,b,c))
                break
            b =b-mod(b,2)+int(key[count])
            count+=1
            if count == keylen:
                im.putpixel((w,h),(a,b,c))
                break
            c= c-mod(c,2)+int(key[count])
            count+=1
            if count == keylen:
                im.putpixel((w,h),(a,b,c))
                break
            if count % 3 == 0:
                im.putpixel((w,h),(a,b,c))
    im.save(str3)
#原图
old = "E:\Users\\test.png"
#处理后输出的图片路径
new = "E:\Users\\LSBencode.png"
#需要隐藏的信息
enc = "E:\Users\\flag.txt"
func(old,enc,new)

小结

参考链接:https://www.jianshu.com/p/5d2b3f0edff1

说点什么
支持Markdown语法
好耶,沙发还空着ヾ(≧▽≦*)o
Loading...