将Shellcode写到PNG图片

使用Python将Shellcode写入图片中实现Bypass 且不损坏原始图片内容

1. 读取PNG图像数据

读取PNG图像数据。使用Python内置的open()函数打开图像文件,使用rb模式以二进制格式读取文件内容,并将读取到的数据存储在变量img_data中。

1
2
with open('demo.png', 'rb') as f:
img_data = f.read()

2. 创建shellcode

要插入的shellcode。这里暂时使用\x90。在实际应用中,需要根据实际情况插入具体的shellcode。

1
shellcode = b'\x90\x90\x90\x90\x90\x90\x90\x90\x90'

3. 创建PNG数据块

需要创建一个PNG数据块,并将shellcode插入到其中。PNG数据块结构为:长度(4个字节)+类型(4个字节)+数据(长度字节)+CRC校验(4个字节)。其中,CRC校验用于保证数据的完整性。使用Python内置的struct模块和zlib模块,分别用于将数据打包成二进制格式和计算CRC校验。

1
2
3
4
5
6
7
chunk_type = b'shel'
chunk_data = shellcode
chunk_crc = struct.pack('!I', 0xffffffff & (0xffffffff ^ zlib.crc32(chunk_type + chunk_data)))

chunk_len = struct.pack('!I', len(chunk_data))
chunk = chunk_len + chunk_type + chunk_data + chunk_crc
img_data = img_data[:33] + chunk + img_data[33:]

4. 保存修改后的图像

最后,使用Python内置的open()函数打开文件,使用wb模式以二进制格式写入文件内容,并将修改后的PNG图像数据存储在文件中。

1
2
with open('modified_image.png', 'wb') as f:
f.write(img_data)

5. 完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import struct
import zlib

with open('demo.png', 'rb') as f:
img_data = f.read()

shellcode = b'\x90\x90\x90\x90\x90\x90\x90\x90\x90'

chunk_type = b'shel'
chunk_data = shellcode
chunk_crc = struct.pack('!I', 0xffffffff & (0xffffffff ^ zlib.crc32(chunk_type + chunk_data)))

chunk_len = struct.pack('!I', len(chunk_data))
chunk = chunk_len + chunk_type + chunk_data + chunk_crc

img_data = img_data[:33] + chunk + img_data[33:]

with open('modified_image.png', 'wb') as f:
f.write(img_data)

请注意写入Shellcode的图片不可使用压缩编辑软件 以及会压缩图片的图床 会导致内容丢失