20200805 -
最近使用ida pro分析了乙個去頭的elf樣本(datacon比賽),它是乙個殭屍網路的樣本。本身對自己的逆向能力也不是很強,基本上就是捋清楚了程式的邏輯,對照著mirai的原始碼,得到了一些理解。不過這中間也遇見了很多問題。
這個問題發生在,我將反編譯出來的函式原始碼直接複製到了c語言的原始碼中,然後進行了編譯,但是始終這個結果就是不對。那麼這也就是說,反編譯出來的原始碼的功能並不一定是正確的?雖然執行沒有問題,但是卻出不來相應的結果。這裡很納悶,等後面結果出來了再說吧。
(我個人覺得,可能大致上語義是爭取的,但是如果你將這個原始碼賦值出去,實際上這部分的變數分配也好,記憶體也好,很多已經不符合原來的語義了,所以就感覺是不對了的。)
(20200806 增加)
我今天看到的乙個例子,通過讀取偽**的語義能夠看出來他是對的,但是實際上可能你直接複製這段**就不一定對;我來具體說明一下這個**。
在**開頭部分的變數宣告中,多出了很多變數,但是他們在堆疊上的記憶體分布是連續的;然後他的代呢,本意是對這塊記憶體進行賦值,但是他所生成的偽**並不是使用了某個變數,而是採用了這個變數前面的變數作為指標,然後進行複製。我覺得,這裡就說明這個記憶體的部分還是很重要的。
static修飾的c語言函式,並不需要call的執行,他在反彙編的原始碼中,是直接就生成在了呼叫它的函式**塊中。
當前見到的巨集,包括_byte、_dword等,這部分的內容可以在文章[1]中找到。
在當時搜尋相關的內容的時候,發現他們直接提供了ida指令碼來輔助解密,不過我最後是單獨寫了python指令碼來進行解密。我覺得,後續的過程中,也應該學習一些這個自動化的方式。這裡記錄兩個**,乙個介紹ida指令碼編寫的[2], 另乙個是介紹解密指令碼的[3],我直接把指令碼放下面了。
sea = screenea(
)max_size =
0xff
for i in
range
(0x00
, max_size)
: b = byte(sea+i)
decoded_byte =
(b ^
(0xfebceade
>>8*
(i %4)
))&0xff
; patchbyte(sea+i,decoded_byte)
if b ==
0x00
or decoded_byte ==
0x00
:break
這個金鑰就是原版的mirai的金鑰。但是,目前我還不清楚這個指令碼怎麼使用。
elf格式的樣本在逆向時,很多socket函式在進入後,都使用了同乙個中斷函式;這裡不同的函式是通過傳遞進去的引數來進行區分的。關於具體的中斷號可以參考文章[4]。
[1]ida逆向常用巨集定義
[2]idapython指令碼編寫指南(二)
[3]torii botnet - not another mirai variant
[4]分析linux中套接字的實現-------建立
IDA pro使用筆記之資料顯示視窗
反彙編視窗 圖形檢視和列表檢視 在反彙編視窗中使用空格鍵切換 options general use graph view by default更改檢視 圖形檢視 將乙個函式分解為許多基本塊,顯示該函式由乙個塊到另乙個塊的控制流程。基本塊是乙個不包含分支,從頭執行到尾的最大指令序列。因此,每乙個基本...
通過乙個例子介紹 IDA pro 的簡單使用
from 通過乙個簡單的題來了解一下ida的基本操作,題目是bugku的乙個簡單的逆向,easy re。有一些字串提示,讓你輸入乙個字串,提示輸入flag,隨便輸入幾個字元,看一下有什麼提示。然後開始進入分析階段,首先通過detect it easy這個軟體檢視一下程式的基本資訊。這一步我們主要想看...
Socket使用的經驗
3次握手 synsyn ack ack這3次是系統之間的互動,應用程式不需要關心 如果伺服器端沒有工作,只有 兩個響應 synrst ack 要求進行重置,客戶端就不會請求了。send模式下阻塞與非阻塞 試想 發生了同時呼叫socket進行傳送的執行緒,其中乙個傳送非常大的資料導致socket bu...