前言
最近在github看見一個有趣的項目:Invoke-PSImage,在png文件的像素內插入powershell代碼作為payload(不影響原圖片的正常瀏覽),在命令行下僅通過一行powershell代碼就能夠執行像素內隱藏的payload,這是一種隱寫(Steganography)技術的應用。
本文將結合自己的一些心得對Invoke-PSImage進行分析,介紹原理,解決測試中遇到的問題,學習腳本中的編程技巧,提出自己的優化思路。
簡介
本文將要介紹以下內容:
·腳本分析
·隱寫原理
·實際測試
·編程技巧
·優化思路
腳本分析
1、參考說明文件
(1) 選取每個像素的兩個顏色中的4位用于保存payload
(2) 圖像質量將受到影響
(3) 輸出格式為png
2、參考源代碼對上述說明進行分析
(1) 像素使用的為RGB模式,分別選取顏色分量中的G和B的低4位(共8位)保存payload
(2) 由于同時替換了G和B的低4位,故圖片質量會受影響
補充:
LSB隱寫是替換RGB三個分量的最低1位,人眼不會注意到前后變化,每個像素可以存儲3位的信息
猜測Invoke-PSImage選擇每個像素存儲8位是為了方便實現(8位=1字節),所以選擇犧牲了圖片質量
(3) 輸出格式為png,需要無損
png圖片為無損壓縮(bmp圖片也是無損壓縮),jpg圖片為有損壓縮。所以在實際測試過程,輸入jpg圖片,輸出png圖片,會發現png圖片遠遠大于jpg圖片的大小
(4) 需要注意payload長度,每個像素保存一個字節,像素個數需要大于payload的長度
隱寫原理
參照源代碼進行舉例說明(跳過讀取原圖片的部分)
1、修改像素的RGB值,替換為payload
代碼起始位置:
對for循環做一個簡單的修改,假定需要讀取0x73,將其寫入第一個像素RGB(0x67,0x66,0x65)
?。?) 讀取payload
代碼:
說明:
$payload[$counter]/16表示$payload[$counter]/0x10
即取0x73/0x10,取商,等于0x07
所以,$paybyte1 = 0x07
代碼:
說明:
即0x73 & 0x0f,結果為0x03
所以,$paybyte2 = 0x03
代碼:
說明:
作隨機數填充,$paybyte3可忽略
注:
原代碼會將payload的長度和圖片的像素長度進行比較,圖片多出來的像素會以同樣格式被填充成隨機數
?。?) 向原像素賦值,添加payload
原像素為RGB(0x62,0x61,0x60)
代碼:
說明:
即0x60 & 0xf0 | 0x07
所以,$rgbValues[0] = 0x67
代碼:
說明:
即0x61 & 0xf0 | 0x03
所以,$rgbValues[1] = 0x63
代碼:
說明:
隨機數填充,可忽略
綜上,新像素的修改過程為:
R: 高位不變,低4位填入隨機數
G: 高位不變,低4位填入payload的低4位
B: 高位不變,低4位填入payload的高4位
2、讀取RGB,還原出payload
對輸出做一個簡單的修改,讀取第一個像素中的payload并還原
取第0個像素的代碼如下:
還原payload,輸出payload的第一個字符,代碼如下:
實際測試
使用參數:
test.ps1: 包含payload,例如”start calc.exe”
kiwi.jpg: 輸入圖片,像素數量需要大于payload長度
evil-kiwi.png: 輸出圖片路徑
腳本執行后會輸出讀取 圖片解密payload并執行的代碼
實際演示略
優化思路
結合前面的分析,選擇替換RGB中兩個分量的低4位保存payload,會在一定程序上影響圖片質量,可參照LSB隱寫的原理只替換三個分量的最低位,達到人眼無法區別的效果
當然,該方法僅是隱寫技術的一個應用,無法繞過Win10 的AMSI攔截
在Win10 系統上測試還需要考慮對AMSI的繞過
小結
本文對Invoke-PSImage的代碼進行分析,介紹加解密原理,分析優缺點,提出優化思路,幫助大家更好的進行學習研究?! ?/p> 1024你懂的国产日韩欧美_亚洲欧美色一区二区三区_久久五月丁香合缴情网_99爱之精品网站
責任編輯:韓希宇
免責聲明:
中國電子銀行網發布的專欄、投稿以及征文相關文章,其文字、圖片、視頻均來源于作者投稿或轉載自相關作品方;如涉及未經許可使用作品的問題,請您優先聯系我們(聯系郵箱:cebnet@cfca.com.cn,電話:400-880-9888),我們會第一時間核實,謝謝配合。