将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的图片不可使用压缩编辑软件 以及会压缩图片的图床 会导致内容丢失