跳转到帖子
  • 游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

    赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

    TheHackerWorld官方

Invoke-PSImage利用率分析


RenX6

推荐的帖子

0x00 前言

最近在github看到一个有趣的项目:Invoke-PSImage,将powershell代码作为有效载荷插入到png文件的像素中(不影响原图的正常浏览)。在命令行下,只有一行powershell代码可以执行隐藏在像素中的有效载荷。

这是隐写术的一个应用。我在上一篇文章中对png的隐写术做了一些介绍,以供参考:

《隐写技巧——PNG文件中的LSB隐写》

《隐写技巧——利用PNG文件格式隐藏Payload》

本文将结合自己的经验对Invoke-PSImage进行分析,介绍原理,解决测试中遇到的问题,学习脚本中的编程技巧,提出自己的优化思路。

Invoke-PSImage地址:

https://github.com/peewpw/Invoke-PSImage

0x01 简介

本文将介绍以下内容:

脚本分析

隐写术原理

实物试验

编程技能

优化思维

0x02 脚本分析

1、参考说明文件

https://github.com/peewpw/Invoke-PSImage/blob/master/README.md

(1)选择每个像素的两种颜色的4比特来保存有效载荷。

(2)图像质量会受到影响。

(3)输出格式为png

2、参考源代码对上述说明进行分析

(1)像素为RGB模式,选择颜色分量中G和B的低4位(共8位)以节省有效载荷。

(2)由于G和B的低4位同时替换,会影响画质。

补充:

LSB隐写术是替换RGB三个分量的最低1位。人眼不会注意到前后的变化,每个像素可以存储3位信息。

Guess Invoke-PSImage为了方便选择每像素存储8位(8位=1字节),所以牺牲了图像质量。

(3)输出格式为png,需要无损

Png图像是无损压缩(bmp图像也是无损压缩),jpg图像是有损压缩。所以在实际测试过程中,当你输入jpg图片,输出png图片时,你会发现png图片比jpg图片大很多。

(4)注意有效载荷的长度,每个像素保存一个字节,像素个数需要大于有效载荷的长度。

0x03 隐写原理

参考源代码举例(跳过看原图的部分)

1、修改像素的RGB值,替换为payload

代码开始位置:

https://github . com/pee wpw/Invoke-PS image/blob/master/Invoke-PS image . PS1 # L110

对for循环做一个简单的修改,假设需要读取0x73并写入第一个像素RGB(0x67,0x66,0x65)。

(1) 读取payload

代码:

$ pay byte 1=[math]:Floor($有效载荷[$counter]/16)

说明:

$payload[$counter]/16表示$payload[$counter]/0x10。

即取0x73/0x10,商等于0x07。

因此,$paybyte1=0x07

代码:

$ pay byte 2=($ payload[$ counter]-band0x0f)

说明:

即0x730x0f,结果为0x03。

因此,$paybyte2=0x03

代码:

$ pay byte 3=($ randb[($计数器2)9)-波段0x0f)

说明:

对于随机数填充,$paybyte3可以忽略。

注:

原码会比较有效载荷的长度和图片的像素长度,图片多余的像素会用相同格式的随机数填充。

(2) 向原像素赋值,添加payload

原始像素是RGB(0x62,0x61,0x60)

代码:

$ RGB values[($ counter * 3)]=($ RGB values[($ counter * 3)]-波段0xf0) -bor $paybyte1

说明:

即0x60 & 0xf0 0x07

因此,$rgbValues[0]=0x67

代码:

$ RGB values[($ counter * 3 1)]=($ RGB values[($ counter * 3 1)]-波段0xf0) -bor $paybyte2

说明:

即0x61 & 0xf0 0x03

因此,$rgbValues[1]=0x63

代码:

$ RGB values[($ counter * 3 ^ 2)]=($ RGB values[($ counter * 3 ^ 2)]-波段0xf0) -bor $paybyte3

说明:

随机数填充,可以忽略不计。

总结一下,新像素的修改过程如下:

r:高位不变,低位4位用随机数填充。

g:高位不变,低位4位填入有效载荷的低位4位。

b:高位保持不变,低4位填充有效载荷的高4位。

2、读取RGB,还原出payload

对输出做一个简单的修改,读取第一个像素的有效载荷并恢复它。

取第0个像素的代码如下:

sal一个新对象;

“添加类型程序集名称”系统。图纸';

$g=一个系统。drawing . Bitmap(' C:\ 1 \ evil-kiwi . png ');

$p=$g.GetPixel(0,0);

$ p;

恢复有效负载,并使用以下代码输出有效负载的第一个字符:

$ o=[math]:Floor(($ p . B-band 15)* 16)-bor($ p . G-band 15);

*下限(($ p . B-级15)* 16)-bor($ p . G-级15));

0x04 实际测试

使用参数:

调用-PS image-脚本。\test.ps1 -Image。\kiwi.jpg -Out。\evil-kiwi.png

Test.ps1:包含有效负载,比如“start calc.exe”

Kiwi.jpg:输入图片,像素数需要大于有效载荷长度。

Evil-kiwi.png:输出图片路径

脚本执行后,会输出读取图片、解密有效载荷并执行的代码。

实际演示

0x05 优化思路

结合前面的分析,选择替换RGB中两个分量的低4位来节省有效载荷,会在一定程度上影响画质。我们可以参考LSB隐写术的原理,只替换三个分量的最低位,从而达到人眼无法分辨的效果。

当然,这种方法只是隐写术的一种应用,并不能绕过Win10的AMSI拦截。

在Win10系统上测试也需要考虑绕过AMSI。

0x06 小结

分析Invoke-PSImage的代码,介绍加密解密原理,分析其优缺点,提出优化思路,帮助大家更好的学习和研究。

留下回复

链接帖子
意见的链接
分享到其他网站

黑客攻防讨论组

黑客攻防讨论组

    You don't have permission to chat.
    • 最近浏览   0位会员

      • 没有会员查看此页面。
    ×
    ×
    • 创建新的...