不存在的图片

打印 上一主题 下一主题

主题 871|帖子 871|积分 2613

这是一篇关于misc图片方面的博客,可以用作入门misc方向食用。
正文

流程
  1. 查看图片特征 --> 查看图片表面信息 --> 利用010查看二进制信息 --> 利用format检测 --> 利用Stegdetect检测 --> 解密
复制代码
图片16进制文件倒置脚本

整体字符反向输出
  1. with open("n.png","rb") as f:
  2.     t = f.read()
  3.     for i in t[::-1]:
  4.         a = hex(i)[2:]
  5.         if len(a) == 1:
  6.             a = '0' + a
  7.         print(a,end="")
复制代码
整体16进制前后倒置


Stegdetect

jpg图片隐写的大杀器,用于检测jpg图片的各种隐写。
下载
以JphideLSB隐写为例
  1. .\stegdetect.exe -tjopi -s 10.0 文件路径
复制代码

如同可检测出jphide隐写。
zsteg

检测png图片的隐蔽信息。
查询图片详细信息

exiftool
文件布局

在开始图片学习之前要先了解一些文件的文件布局。
查察文件16进制形式需要用到查察器,如010Editor。
文件头

文件头是指文件十六进制形式下的开头四个十六进制码。

即图中区域。
还需要了解一些常见的文件头。
每个文件范例都有本身的文件布局,具体问题具体分析。
附加字符串



可以看到在最后添加字符串时,图片并不会受到影响。
在读取时只需要用到010Editor或其他图片十六进制查察器查察即可。
文件载体

隐蔽

使用copy指令可以将压缩包或文本或PDF等等添加到图片尾部。


可见两图片没有区别,用010Editor打开。

可以看到flagpk.png的最后存在隐蔽的zip压缩文件。
提取

这里用到kali虚拟机。
1,binwalk分离
  1. binwalk --run-as=root 文件路径  -e
复制代码

2,foremost分离
  1. foremost 文件路径  -T  
复制代码

宽高修改(文件布局)


在010中按ALT+4可以唤起模板,找到宽高可以修改。

当我们修改值的时候图片会发生一点的变化。
举个例子
假如有一个图片
看着正常,但是一旦把宽度放大。

就会有隐蔽的flag。
图片修复

对于题目中的一些损坏图片,可能得本身来修复。

有一个flag-是损坏的文件,用010打开。

通过布局的判断,我们发现这是张png图片。
但是缺少了文件头。
查阅发现png的文件为89 50 4E 47
添加上文件头。
  1. 文件-->新建-->新建十六进制文件-->先填入文件头,再将其余部分复制过来。
复制代码
保存,并添加png后缀即可。
LSB隐写(基于PNG图片)

LSB隐写(最低有效位隐写)
看操作

现在有一个LSB隐写的图片。
  1. 打开Stegsolve-->File-->Open,打开LSB隐写的图片。
复制代码


  1. Analyse-->Data Extract
复制代码

Bit Planes一样平常会将Red,Green,Blue都选为0。
Order settings里的选项一样平常是逐步的试出来的。
点击Preview即可查察隐写内容。
特别一点的

LSB cloacked-pixel工具隐写
  1. python2 lsb.py extract 图片 out.txt 密码
复制代码
Jphide

用到Jphswin工具
用工具打开一个jpg文件

点击Hide可以隐蔽数据,设置密码为123456,点击Save jpeg即可保存
点击Seek可以提取隐蔽数据,同上输入密码即可。
大概在kali中使用
  1. steghide extract -sf '/root/桌面/lianjie/4.jpg' -p 123456
复制代码
outguess隐写

用到工具outguess。
在kali中使用。
  1. 加密:
  2. outguess -k 密码 -d 密文 demo.jpg out.jpg
  3. 加密之后,demo.jpg会覆盖out.jpg,hidden.txt的内容是要隐藏的东西。
  4. 解密:
  5. outguess -k 密码 -r 图片路径 密文路径
复制代码


F5隐写

加密涉及不到,直接解密
  1. java Extract 文件路径
  2. java Extract 文件路径   -p 密码
复制代码

输出在output.txt里。
像素隐写

在像素中可能有隐写信息。
  1. 提示:把图片缩小10倍
复制代码
大概率为像素隐写
  1. from PIL import Image
  2. img = Image.open('arcaea.png')
  3. w = img.width
  4. h = img.height
  5. img_obj = Image.new("RGB",(w//10,h//10))
  6. for x in range(w//10):
  7.     for y in range(h//10):
  8.         (r,g,b)=img.getpixel((x*10,y*10))
  9.         img_obj.putpixel((x,y),(r,g,b))
  10. img_obj.save('ok.png')
复制代码
oursercet

实用于任何文件的加密,有Key

该隐写会在文件为添加数据,导致文件在放入010时报错。


特征
双图片隐写(盲水印双图片)

用到BlindWaterMark-master工具
  1. python2 bmp.py decode 1png 2.png 生成.png
复制代码
kali中使用。
盲水印单图片

用到WaterMark工具


二维码分析

二维码的拼接与修复



差别种类的二维码用到的解码器差别,找到对应的二维码后再找解码器解码即可。
条码/二维码有多少种(各行业条码应用情况) - 知乎 (zhihu.com)
二维码的绘制
  1. 0x00000000
  2. 0xff71fefe
  3. 0x83480082
  4. 0xbb4140ba
  5. 0xbb6848ba
  6. 0xbb4a80ba
  7. 0x83213082
  8. 0xff5556fe
  9. 0xff5556fe
  10. 0x00582e00
  11. 0x576fb9be
  12. 0x707ef09e
  13. 0xe74b41d6
  14. 0xa82c0f16
  15. 0x27a15690
  16. 0x8c643628
  17. 0xbfcbf976
  18. 0x4cd959aa
  19. 0x2f43d73a
  20. 0x5462300a
  21. 0x57290106
  22. 0xb02ace5a
  23. 0xef53f7fc
  24. 0xef53f7fc
  25. 0x00402e36
  26. 0xff01b6a8
  27. 0x83657e3a
  28. 0xbb3b27fa
  29. 0xbb5eaeac
  30. 0xbb1017a0
  31. 0x8362672c
  32. 0xff02a650
  33. 0x00000000
复制代码
将16进制转为2进制
  1. t = open("D://浏览器下载//新建 文本文档.txt","r")
  2. tt = t.readlines()
  3. for num in tt:
  4.     a = bin(eval(num))
  5.     a = a.replace("0b","")
  6.     if len(a) < 32:
  7.         a = "0"*(32 - len(a)) + a
  8.     print(a)
  9.     with open("D://浏览器下载//新建2.txt", "a+", encoding="utf-8") as file:
  10.         file.write(a + "\n")
复制代码
  1. 00000000000000000000000000000000
  2. 11111111011100011111111011111110
  3. 10000011010010000000000010000010
  4. 10111011010000010100000010111010
  5. 10111011011010000100100010111010
  6. 10111011010010101000000010111010
  7. 10000011001000010011000010000010
  8. 11111111010101010101011011111110
  9. 11111111010101010101011011111110
  10. 00000000010110000010111000000000
  11. 01010111011011111011100110111110
  12. 01110000011111101111000010011110
  13. 11100111010010110100000111010110
  14. 10101000001011000000111100010110
  15. 00100111101000010101011010010000
  16. 10001100011001000011011000101000
  17. 10111111110010111111100101110110
  18. 01001100110110010101100110101010
  19. 00101111010000111101011100111010
  20. 01010100011000100011000000001010
  21. 01010111001010010000000100000110
  22. 10110000001010101100111001011010
  23. 11101111010100111111011111111100
  24. 11101111010100111111011111111100
  25. 00000000010000000010111000110110
  26. 11111111000000011011011010101000
  27. 10000011011001010111111000111010
  28. 10111011001110110010011111111010
  29. 10111011010111101010111010101100
  30. 10111011000100000001011110100000
  31. 10000011011000100110011100101100
  32. 11111111000000101010011001010000
  33. 00000000000000000000000000000000
复制代码
将一设为点,零为空,画图。
  1. from PIL import Image
  2. import numpy as np
  3. def hex2bin(hexmat):
  4.     binmattemp = [bin(m)[2:] for m in hexmat]  # 全转成二进制
  5.     rowlen = max([len(m) for m in binmattemp])  # 取最宽的值
  6.     binmat = [[0] + [int(b) for b in row.zfill(rowlen)] for row in binmattemp]  # 用0补齐
  7.     print rowlen + 1, 'x', len(binmat)
  8.     for i in xrange(len(binmat)):
  9.         print ''.join([str(b) for b in binmat[i]])
  10.     return binmat, rowlen + 1, len(binmat)
  11. def rm_col(binmat, col):  # 移除指定的列
  12.     return [row[:col] + row[col + 1:] for row in binmat]
  13. def make_bw_img(binmat, w, h, outfilename, blackbit=0):
  14.     bwmat = [[0 if b == blackbit else 255 for b in row] for row in binmat]  # 用255表示白,0表示黑
  15.     imagesize = (w, h)
  16.     img = Image.fromarray(np.uint8(np.array(bwmat)))
  17.     img.save(outfilename)
  18. if __name__ == '__main__':
  19.     hexmat = [0x00000000,
  20.               0xff71fefe,
  21.               0x83480082,
  22.               0xbb4140ba,
  23.               0xbb6848ba,
  24.               0xbb4a80ba,
  25.               0x83213082,
  26.               0xff5556fe,
  27.               0x00582e00,
  28.               0x576fb9be,
  29.               0x707ef09e,
  30.               0xe74b41d6,
  31.               0xa82c0f16,
  32.               0x27a15690,
  33.               0x8c643628,
  34.               0xbfcbf976,
  35.               0x4cd959aa,
  36.               0x2f43d73a,
  37.               0x5462300a,
  38.               0x57290106,
  39.               0xb02ace5a,
  40.               0xef53f7fc,
  41.               0x00402e36,
  42.               0xff01b6a8,
  43.               0x83657e3a,
  44.               0xbb3b27fa,
  45.               0xbb5eaeac,
  46.               0xbb1017a0,
  47.               0x8362672c,
  48.               0xff02a650,
  49.               0x00000000]
  50.     binmat, w, h = hex2bin(hexmat)
  51.     binmat = rm_col(binmat, 22)  # 发现第七行和第22行多余,故删除
  52.     binmat = rm_col(binmat, 7)
  53.     make_bw_img(binmat, w, h, 'matrix_rmcol.png', blackbit=1)
复制代码
可得
QRcode二维码

QRcode二维码用一个特性,

如图黑色都是固定不变的

如图是损坏的二维码
在正常的二维码中,我画出的这一列和这一行是一黑一白交替的像素。如下图

例一 [XYCTF] 我的二维码为什么扫不出来

看到一个损坏的二维码和py脚本
  1. from PIL import Image
  2. import random
  3. def reverse_color(x):
  4.     return 0 if x == 255 else 255
  5. def reverse_row_colors(pixels, row, width, block_size=10):
  6.     for x_block in range(width // block_size):
  7.         x = x_block * block_size
  8.         y = row * block_size
  9.         for x_small in range(x, x + block_size):
  10.             for y_small in range(y, y + block_size):
  11.                 pixel = pixels[x_small, y_small]
  12.                 pixels[x_small, y_small] = reverse_color(pixel)
  13. def reverse_col_colors(pixels, col, height, block_size=10):
  14.     for y_block in range(height // block_size):
  15.         x = col * block_size
  16.         y = y_block * block_size
  17.         for x_small in range(x, x + block_size):
  18.             for y_small in range(y, y + block_size):
  19.                 pixel = pixels[x_small, y_small]
  20.                 pixels[x_small, y_small] = reverse_color(pixel)
  21. original_img = Image.open("flag.png")
  22. new_img = original_img.copy()
  23. width, height = new_img.size
  24. pixels = new_img.load()
  25. count = 0
  26. while count < 7:
  27.     x = random.randint(0, 1)
  28.     if x == 0:
  29.         reverse_col_colors(pixels, random.randint(0, height // 10 - 1), height)
  30.     else:
  31.         reverse_row_colors(pixels, random.randint(0, width // 10 - 1), width)
  32.     count += 1
  33. new_img.save("new.png")
复制代码
分析脚本
reverse_row_colors()函数是把一行颜色反转。
reverse_col_colors()函数是把一列颜色反转。
  1. while count < 7:
  2. x = random.randint(0, 1)
  3. if x == 0:
  4.      reverse_col_colors(pixels, random.randint(0, height // 10 - 1), height)
  5. else:
  6.      reverse_row_colors(pixels, random.randint(0, width // 10 - 1), width)
  7. count += 1
复制代码
这一段就是随机把一行大概一列颜色反转。
那么咱们就只能手工修复了。
  1. reverse_row_colors(pixels, 1, width)  #行
  2. reverse_col_colors(pixels, 0, height)  #列
  3. reverse_col_colors(pixels, 2, height)
  4. reverse_col_colors(pixels, 5, height)
复制代码
先用以上段调出四个角
这是调了4次,还有3次要调。
由上面的QRcoed的特性来调。
  1. reverse_row_colors(pixels, 12, width)
  2. reverse_col_colors(pixels, 10, height)
  3. reverse_col_colors(pixels, 11, height)
复制代码
最后得出二维码
  1. from PIL import Imageimport randomdef reverse_color(x):    return 0 if x == 255 else 255def reverse_row_colors(pixels, row, width, block_size=10):    for x_block in range(width // block_size):        x = x_block * block_size        y = row * block_size        for x_small in range(x, x + block_size):            for y_small in range(y, y + block_size):                pixel = pixels[x_small, y_small]                pixels[x_small, y_small] = reverse_color(pixel)def reverse_col_colors(pixels, col, height, block_size=10):    for y_block in range(height // block_size):        x = col * block_size        y = y_block * block_size        for x_small in range(x, x + block_size):            for y_small in range(y, y + block_size):                pixel = pixels[x_small, y_small]                pixels[x_small, y_small] = reverse_color(pixel)original_img = Image.open("new.png")new_img = original_img.copy()width, height = new_img.sizeprint(width,height)pixels = new_img.load()reverse_row_colors(pixels, 1, width)  #行
  2. reverse_col_colors(pixels, 0, height)  #列
  3. reverse_col_colors(pixels, 2, height)
  4. reverse_col_colors(pixels, 5, height)reverse_row_colors(pixels, 12, width)
  5. reverse_col_colors(pixels, 10, height)
  6. reverse_col_colors(pixels, 11, height)new_img.show()
复制代码
GIF动图的分析

可以用Stegsolve工具来逐帧分析
  1. 打开jsp.gif文件
  2. Analyse-->Frame Browser
复制代码



即可得出。
Logistic混沌变换加密
  1. 图片的混沌加密是先把所有像素点平坦化了,按照一位数组处理的,然后再重组为图片
复制代码
  1. import cv2
  2. import numpy as np
  3. from PIL import Image
  4. def logistic(Img, x, u,times):
  5.     M = Img.shape[0]
  6.     N = Img.shape[1]
  7.     for i in range(1, times):
  8.         x = u * x * (1 - x)
  9.     array = np.zeros(M * N)
  10.     array[1] = x
  11.     for i in range(1, M * N - 1):
  12.         array[i + 1] = u * array[i] * (1 - array[i])
  13.     array = np.array(array * 255, dtype='uint8')
  14.     code = np.reshape(array, (M, N))
  15.     xor = Img ^ code
  16.     v = xor
  17.     return v
  18. x = 密码1
  19. u = 密码2
  20. times = 密码3
  21. Img = cv2.imread('图片路径')
  22. Img = Img[:, :, [2, 1, 0]]
  23. (r, g, b) = cv2.split(Img)
  24. R = logistic(r, x, u, times)
  25. G = logistic(g, x, u, times)
  26. B = logistic(b, x, u, times)
  27. merged = np.ones(Img.shape, dtype=np.uint8)
  28. merged[:, :, 2] = B
  29. merged[:, :, 1] = G
  30. merged[:, :, 0] = R
  31. Img = Image.fromarray(merged)
  32. Img.save('flag.png')
复制代码
webp图片隐写

stegpy隐写

在kali中使用
  1. stegpy 文件
复制代码
转为其他文件

stego文件头


stego文件头的图片可以在linux中显示为图片。
通道低位隐写

当图片的位深度大于24位时,就有可能存在通道低位隐写
如下图片属性,这里留意到是48位的图片位深度

48位的图片,均匀RBG位16,人眼是看不到低于8bit位的像素信息的。
  1. # 提取低位
  2. import cv2
  3. import numpy as np
  4. img = cv2.imread("turing.png", cv2.IMREAD_UNCHANGED)
  5. img2 = img & 0xFF   
  6. img2 = img2.astype(np.uint8)
  7. cv2.imwrite("turing1.png", img2)
复制代码
humbnail隐写(缩略图隐写)

这里是缩略图隐写的方式,叫做thumbnail隐写
用Magic打开即可看到
  1. ctfshow{dbf7d3f84b0125e833dfd3c80820a129}
复制代码
未经作者答应,请勿转载!!!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

欢乐狗

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表