日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

SG Input 软件安全分析之逆向分析

發(fā)布時(shí)間:2023/12/20 编程问答 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SG Input 软件安全分析之逆向分析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

通過(guò)本文介紹怎么對(duì)一個(gè) windows 程序進(jìn)行安全分析。分析的軟件版本為 2018-10-9 , 所有相關(guān)文件的鏈接

鏈接:https://pan.baidu.com/s/1l6BuuL-HPFdkFsVNOLpjUQ 提取碼:erml

逆向分析

定位核心代碼

拿到一個(gè)軟件首先需要進(jìn)行攻擊面的探測(cè),即找到盡可能多的可以與程序進(jìn)行交互的入口點(diǎn),有數(shù)據(jù)交互的地方就有可能會(huì)出現(xiàn)漏洞。首先對(duì)軟件的功能做一個(gè)大概的了解,發(fā)現(xiàn)搜狗輸入法能夠安裝用戶自定義的皮膚,這是一個(gè)比較好的入口點(diǎn),于是下面分析分析處理皮膚文件的邏輯。

先從官網(wǎng)隨便下個(gè)皮膚,然后拿 010editor 簡(jiǎn)單看看能不能拿到一些有用的信息。

使用 binwalk 也沒(méi)有識(shí)別出文件格式,于是猜測(cè)應(yīng)該是輸入法自己實(shí)現(xiàn)的格式。

后來(lái)在對(duì)皮膚相關(guān)的功能進(jìn)行瀏覽的時(shí)候發(fā)現(xiàn)有皮膚編輯器這個(gè)軟件

https://pinyin.sogou.com/skins/design.php

下載下來(lái)隨便創(chuàng)建一個(gè)皮膚,發(fā)現(xiàn)此時(shí)的皮膚格式為 zip 格式,雙擊也能正常安裝。皮膚編輯器的最近更新在 13 年,估計(jì)輸入法是為了做兼容,同時(shí)支持兩種格式的皮膚文件。

下載下來(lái)的皮膚雙擊就可以安裝,這樣的安裝方式我們不好定位具體安裝皮膚的程序,這時(shí)我們可以使用 api montor 監(jiān)控當(dāng)雙擊皮膚文件時(shí)系統(tǒng)所執(zhí)行的命令,以便進(jìn)行下一步的分析。

打開(kāi) api monitor , 然后打開(kāi)皮膚文件可以監(jiān)控到搜狗輸入法處理皮膚文件執(zhí)行的命令

"C:\Program Files (x86)\SogouInput\SogouExe\SogouExe.exe" "C:\Program Files (x86)\SogouInput\9.1.0.2657\SGTool.exe"-line 0 -border --appid=skinreg -list "C:\Users\XinSai\Desktop\test.ssf"

通過(guò)使用 Procmon.exe 分析,其實(shí)最后調(diào)用

"C:\Program Files (x86)\SogouInput\9.1.0.2657\SGTool.exe" -line 0 -border --appid=skinreg -install -c "C:\Users\XinSai\Desktop\test.ssf" -q -ef

通過(guò)執(zhí)行這條命令就可以把皮膚安裝到輸入法內(nèi)部。

下面把 SGTool.exe 拖到 IDA 里面, 使用命令行選項(xiàng)來(lái)搜索字符串的交叉引用去找到相關(guān)的處理代碼。通過(guò)對(duì)命令行參數(shù)的交叉引用逐步向上追溯,在 0x07A04D0 發(fā)現(xiàn)程序會(huì)根據(jù) appid 參數(shù)的值,決定下一步進(jìn)行處理的函數(shù)

然后調(diào)試發(fā)現(xiàn)一直斷不到這,于是用 drrun 看看程序到底走了哪些路徑

drrun.exe -t drcov -- "C:\Program Files (x86)\SogouInput\9.1.0.2657\SGTool.exe" -line 0 -border --appid=skinreg -install -c "C:\Users\XinSai\Desktop\test.ssf" -q -ef

發(fā)現(xiàn)直接點(diǎn)擊 ssf 文件還是沒(méi)有進(jìn)入這個(gè)分支。

經(jīng)過(guò)不斷的嘗試 + 使用一些監(jiān)控軟件,發(fā)現(xiàn)在關(guān)閉所有搜狗輸入法相關(guān)進(jìn)程的情況下,雙擊 .ssf 文件,會(huì)首先使用

"C:\Program Files (x86)\SogouInput\9.1.0.2657\SGTool.exe" -daemon

開(kāi)啟一個(gè)類似于服務(wù)器的進(jìn)程,然后在使用

"C:\Program Files (x86)\SogouInput\9.1.0.2657\SGTool.exe" -line 0 -border --appid=skinreg -install -c "C:\Users\XinSai\Desktop\test.ssf" -q -ef

另外再起一個(gè) SGTool.exe 的進(jìn)程向剛剛啟動(dòng)服務(wù)進(jìn)程發(fā)送消息,后續(xù)的皮膚處理在服務(wù)進(jìn)程進(jìn)行。猜測(cè)可能是使用了 windows 本地通信機(jī)制實(shí)現(xiàn) C/S 架構(gòu)

后續(xù)在瞎試的時(shí)候,將一個(gè)非皮膚文件命名成 .ssf 后綴,然后雙擊會(huì)出現(xiàn)報(bào)錯(cuò)信息。

根據(jù)這些字符串在 od 里面找,可以找到一些信息,最后通過(guò)對(duì)

皮膚解壓失敗:skin.ini不存在

交叉引用, 然后不斷回溯, 發(fā)現(xiàn)了一個(gè)有趣的函數(shù) 0x07A72D0

這個(gè)函數(shù)首先 調(diào)用 0x7A84F0檢測(cè)了某些參數(shù)。

從我們的參數(shù)進(jìn)行對(duì)比,猜測(cè)這里校驗(yàn)的應(yīng)該是最后那兩個(gè)參數(shù)

然后猜測(cè) -q 應(yīng)該是安靜模式,于是刪掉 -q 試了一試

發(fā)現(xiàn)居然會(huì)有提示框,那這個(gè)提示框的代碼附件應(yīng)該離處理 皮膚文件的代碼更加近了。

對(duì)字符串交叉引用,發(fā)現(xiàn)其實(shí)就是上面的那個(gè)代碼(0x007A75DC)

所以從這里開(kāi)始,應(yīng)該就開(kāi)始對(duì)皮膚文件進(jìn)行處理了。

分析皮膚處理相關(guān)的代碼

經(jīng)過(guò)不斷的調(diào)試以及查看函數(shù)調(diào)用的參數(shù),發(fā)現(xiàn)當(dāng)我們點(diǎn)擊 確認(rèn) 的時(shí)候,會(huì)調(diào)用位于0x914980 的函數(shù)。

這個(gè)函數(shù)傳入的參數(shù)是一個(gè)對(duì)象指針,對(duì)象內(nèi)部有我們皮膚文件的路徑,這個(gè)函數(shù)會(huì)對(duì)傳入的 皮膚文件 進(jìn)行第一次的判斷。

函數(shù)首先會(huì)打開(kāi)文件, 然后取出開(kāi)頭的4個(gè)字節(jié)作為文件類型,判斷是不是Skin。如果是的話就認(rèn)為是最新的皮膚格式然后進(jìn)入后續(xù)的操作。

如果不是就認(rèn)為是第一代皮膚格式 ,即用zip格式打包的皮膚。

調(diào)試時(shí),可以看到 type 的值。 下面是打開(kāi)的官網(wǎng)下載的皮膚文件,所以 type 為 Skin.

當(dāng)皮膚文件的type值不為Skin時(shí),程序會(huì)進(jìn)入decompress_skin_ini (0x063F340), 這個(gè)函數(shù)里面會(huì)調(diào)用ziplib.dll 里面的函數(shù)對(duì)皮膚文件進(jìn)行解壓,提取并解析skin.ini文件。

總的來(lái)說(shuō),0x914980 函數(shù)其實(shí)只是校驗(yàn)了皮膚文件的版本信息,對(duì)于 文件頭 不是 Skin 的文件,則認(rèn)為是第一代皮膚格式文件,然后會(huì)使用 ziplib.dll 里面的函數(shù)提取 skin.ini 文件并嘗試解析它。

在進(jìn)行完第一次的校驗(yàn)后,會(huì)回到 0x7A72D0, 將文件拷貝到用戶的皮膚保存目錄,然后對(duì)皮膚文件進(jìn)行解析,提取出里面的文件。

其中 0x7A6230 deal_skin 就是解析皮膚文件的入口,它會(huì)調(diào)用 0x63E3F0 完成具體文件解析流程。

這個(gè)函數(shù)首先判斷文件頭 , 如果是 Skin , 表示為最新格式的皮膚文件

則通過(guò) decompress_skinv3 0x053B320 進(jìn)行解析并提取出皮膚包里面包含的文件。否則就認(rèn)為是第一代皮膚文件, 使用 ziplib 里面的函數(shù), 把皮膚包里面的文件解壓出來(lái)。

for ( i = v25 - 3; v28 < v27; ++v28 ) { ........................................................................................................................................................................................................................................................................if ( decompress_file_from_zip(v46, v65, &path, target, &len, &buf) ){v47 = len;if ( len <= 0x80000000 && len ){len = target;(*v51)(&v51, &len, 0);v48 = buf;v54 = v47;v53 = buf;sub_53ACE0(obj1, &v50, 0);// 做一些析構(gòu)操作sub_49F5C0(ziplib_obj, v65, v47, v48);}v24 = v62;}........................................................................................................................................................................................................................................................................}

下面對(duì)decompress_skinv3(0x053B320)進(jìn)行分析,以便理解最新皮膚包的格式

首先打開(kāi)皮膚包,讀取文件內(nèi)容到內(nèi)存,然后把文件內(nèi)容,大小傳給 handle_skinv3 0x0053A8C0 進(jìn)行處理。

通過(guò)對(duì)這個(gè)函數(shù)的逆向,可以明白.ssf文件開(kāi)頭 8個(gè)字節(jié)的結(jié)構(gòu)為 4字節(jié)的 Skin 和 4 字節(jié)的 version 字段

校驗(yàn)完版本信息后, 會(huì)對(duì)文件頭部后的數(shù)據(jù)使用程序自己實(shí)現(xiàn)的算法進(jìn)行解碼,然后對(duì)解碼之后的數(shù)據(jù)使用zlib再次解碼。

zlib 解碼完成后,把解碼后的數(shù)據(jù)傳入 0x53bf50 (調(diào)試時(shí)確認(rèn))對(duì)文件進(jìn)行提取

這個(gè)函數(shù)對(duì)傳入的數(shù)據(jù)進(jìn)行解析,提取出相關(guān)的文件

// 調(diào)用者 0x53AAE1 unsigned int __thiscall skin_v3_step2(int this, unsigned int *buf, unsigned int size, int a4) {len = *buf; // 取出 buf 開(kāi)始的 4 個(gè)字節(jié), 表示數(shù)據(jù)的長(zhǎng)度if ( *buf > size )return -1;new_size = size - 4;sizea = size - 4;if ( *buf ){if ( (**(this + 4))(this + 4, buf + 1, new_size, a4) < 0 )// 調(diào)用0x53c110L,第 2, 3個(gè)參數(shù)為 buf + 4, size-4// 就是忽略掉頭4個(gè)字節(jié)// 函數(shù)作用復(fù)制 zlib 解碼后的數(shù)據(jù) 0x8-0x40 到對(duì)象里面do // 循環(huán)的從 zlib 解壓過(guò)的文件里面提取出文件{offset = *(v12 + 4 * v9);if ( offset < data_len ){v17 = (**v15)(cur, sizea, a4); // 調(diào)用 0x923f70L, 提取文件名if ( v17 < 0 )goto LABEL_19;v18 = &cur[v17];v19 = (*v22[3])(v18, sizea - v17, a4);// 調(diào)用的是 0x53c1c0L, 提取文件內(nèi)容}++v9;}while ( v9 < v11 );

文件格式匯總

老版本的皮膚格式

其實(shí)就是一個(gè) zip 包, 里面有配置文件和一些圖片。

新版本的皮膚格式

首先是 .ssf 文件
開(kāi)頭 8個(gè)字節(jié)為 4字節(jié)的 Skin 和 4 字節(jié)的 version

  • 然后調(diào)用 0x0639610 對(duì) 文件偏移 8開(kāi)始進(jìn)行解碼, 解碼后的數(shù)據(jù) A 偏移 4 字節(jié)開(kāi)始 為 zlib 壓縮的數(shù)據(jù)。
  • 然后對(duì) A + 4 使用 zlib 解碼,得到 zlib 解碼后的數(shù)據(jù) B
  • 然后把 B 和 B 的長(zhǎng)度傳入 0x53bf50 繼續(xù)處理

B 的結(jié)構(gòu)為

開(kāi)頭4個(gè)字節(jié)為數(shù)據(jù)的總長(zhǎng)度

然后根據(jù) 0x53C110 , 后面緊跟著的 4 個(gè)字節(jié)為文件映射表的長(zhǎng)度,即 0x38 字節(jié)。每一個(gè)表項(xiàng)4個(gè)字節(jié),代表表項(xiàng)指示其所表示的文件在整個(gè)文件中的偏移地址。

如圖所示, 第一個(gè)表項(xiàng)的值為 0x40, 所以第一個(gè)文件應(yīng)該在 0x40 處。

經(jīng)過(guò)一定的觀察發(fā)現(xiàn)一個(gè)文件的表示方式為

  • 4字節(jié): 文件名的長(zhǎng)度
  • 文件名( unicode 編碼)
  • 4字節(jié): 文件數(shù)據(jù)的長(zhǎng)度
  • 文件數(shù)據(jù)

發(fā)現(xiàn)漏洞

分析完整個(gè)皮膚處理的代碼后發(fā)現(xiàn)整個(gè)代碼的邏輯還是不怎么復(fù)雜的。于是可以直接讀反編譯的代碼來(lái)找找看是否存在什么漏洞。在讀代碼找漏洞時(shí)重點(diǎn)關(guān)注緩沖區(qū)的操作, 內(nèi)存的分配大小以及對(duì)文件中表示長(zhǎng)度的字段的使用是否合理。

經(jīng)過(guò)一番仔細(xì)的走查發(fā)現(xiàn)在對(duì)皮膚文件第一步用自己實(shí)現(xiàn)的解密算法解密后的開(kāi)始 4 個(gè)字節(jié)為 deocded_data_size , 之后會(huì)把它加上 8 然后去分配內(nèi)存。

deocded_data_size 是從解密后的文件中取出的,當(dāng)把 deocded_data_size 改成 0xffffffff 時(shí),在分配內(nèi)存時(shí)會(huì)整數(shù)溢出導(dǎo)致分配比較小的內(nèi)存塊,然后后續(xù)的代碼在使用這個(gè)緩沖區(qū)時(shí)會(huì)造成一個(gè)堆溢出。漏洞已于3個(gè)月前提交并修復(fù)。

總結(jié)

在分析軟件功能實(shí)現(xiàn)時(shí),可以采用一些監(jiān)控軟件比如 api monitor 來(lái)輔助定位關(guān)鍵代碼。一些程序中的提示,報(bào)錯(cuò)信息也可以用來(lái)定位。最重要的就是多調(diào)試,多調(diào)試。程序從文件內(nèi)容中取 size 時(shí)要注意校驗(yàn)。

轉(zhuǎn)載于:https://www.cnblogs.com/hac425/p/10772834.html

總結(jié)

以上是生活随笔為你收集整理的SG Input 软件安全分析之逆向分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。