so文件混淆與修復

一、對section header進行混淆

由於linker不會對section header進行加載,所以對section header進行改動,不會影響so文件正常加載到內存,因此有些程序對section header進行了混淆,導致IDA無法正常進行靜態分析。

在這裏插入圖片描述

混淆方法:
1.將section header table中的addr、offsize等字段值清0,如果清空的是dynsym段,就會使IDA無法找到函數符號
2.對section header中的name字段進行修改,可以更改段名

二、對Program header進行混淆

linker在加載so文件的時候會用到LOAD段,但是沒有直接用到其他段的數據,比如說Dynamic段中的數據,在linker源碼中會通過switch的方式對Dynamic中的字段進行賦值,也就是說如果對Dynamic中的字段進行復制混淆一樣不會影響linker進行加載,因爲同樣的字段,後面的會覆蓋前面的,但這樣的靜態混淆有個明顯的缺陷,同字段的值,一定是最後一個是有效的。

在這裏插入圖片描述

三、so文件的修復

3.1 最簡單的修復方式

如果elf header中的section header offset是一個異常的值,IDA加載時會報錯,並且無法正常的靜態分析

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

最簡單的修改方法是將以下幾個值清0,這樣IDA就不會報錯,但是修復的程序非常有限

在這裏插入圖片描述
在這裏插入圖片描述

3.2 手動修復

雖然section header的addr完全清0了,但是恢復並不是沒有辦法

在這裏插入圖片描述
section header的0段addr和off永遠是0。
sectioin header的1段size是0x13,對比Program header的INTERP段可以看出,它的size也是13,就可以猜測對應的是INTERP段,所以section header的1段addr和offset是0x134
在這裏插入圖片描述

有了1段的addr和offset就可以根據size和align計算出下一個段的addr和offset
在這裏插入圖片描述
計算到段13的時候,發現0x8b88+340=0x8ec8,這時候根據LOAD段,可以得知它的地址其實應該包含到第二個LOAD段中了,它的offset是9da8,addr是ada8

在這裏插入圖片描述

當修正到段[23]時,修改值是45da4,第二個LOAD段的offset+filesize=45da4,所以下面的段[24]的修正需要採用另一種方法

在這裏插入圖片描述
注意到這個段的類型是NOBITS,它的段名應該是.bss,而bss的後面的段是comment段

在這裏插入圖片描述
可以看到comment段和bss段的offset是一樣的
在這裏插入圖片描述
所以修改如下
在這裏插入圖片描述

對address的修正
在這裏插入圖片描述
最後幾個address爲0
在這裏插入圖片描述

在010中找到對應的字段全部修正,保存,再用IDA打開。
修復前

在這裏插入圖片描述

修復後

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章