PHDay CTF 2012 Quals F100

此题为图片隐藏信息提取题。图片如下,

一开始当作QR码提取数据出来,
7F454C46010000000000000000004305020003001A0043051A00430504000000B931004305B220CD80252000010093CD803030343330354232323043443830323532303030303130303933434438300A
发现为ELF文件,执行后输出004305B220CD80252000010093CD80
此路不通。改之。

使用图信息提取工具setgsolve.jar.可以方便的提前图片中的信息。比python暴力搜索更高效,直观。
图片变换的方式此处通常为LSB和MSB,行或者列变幻,RGB或RBG或GBR顺序

“  1、MSB
  MSB是Most Significant Bit/Byte的首字母缩写,通常译为最重要的位或者最
重要的字节。它通常用来表明在一个bit序列(如一个byte是8个bit组成的一个序
列)或者一个byte序列(如word是两个byte组成的一个序列)中对整个序列取值影
响最大的那个bit/byte。
  2、LSB
  LSB是Least Significant Bit/Byte的首字母缩写,通常译为最不重要的位或
者最不重要的字节。它通常用来表明在一个bit序列(如一个byte是8个bit组成的
一个序列)或者一个byte序列(如word是两个byte组成的一个序列)中对整个序
列取值影响最小的那个bit/byte。

通过python PIL库可以更直观的看出此题的解题过程:

from PIL import Image

# Open the image in read mode
im = Image.open('.png', 'r')
# pixels is an object which allows access to
# individual pixels
pixels = im.load()
# Get the size of the picture
width, height = im.size

binary_ans = ''
for y in xrange(height): # Iterate through each pixel
    for x in xrange(width):
        #pixels[x, y] returns a tuple with RGB vals
        red_pix = pixels[x, y][0]
        green_pix = pixels[x, y][1]
        blue_pix = pixels[x, y][2]
        #print pixels[x, y]

        if red_pix == 255:
            binary_ans += '1'
        elif red_pix == 254:
            binary_ans += '0'

        if green_pix == 255:
            binary_ans += '1'
        elif green_pix == 254:
            binary_ans += '0'

        if blue_pix == 255:
            binary_ans += '1'
        elif blue_pix == 254:
            binary_ans += '0'

# This just converts the binary to ASCII
answer = ''
for i in xrange(len(binary_ans)/8):
    answer += chr(int(binary_ans[i*8:i*8+8], 2))
f=open('answer.txt','w')
f.write(answer)
f.close()
#print answer

发现输出结果为加密的rar文件,用之前的密码即可解出得到最终KEY