沒有pdb也要定位問題 一次注入崩潰的定位過程

2021-06-28 10:57:41 字數 2934 閱讀 8875

最近遇到乙個注入過程中崩潰的問題,花了比較長的時間定位,寫下來記錄一下

一、背景

我寫了乙個程序s,s程序會執行時會監控程序中是否有i程序在執行,如果i程序運動的話,s程序就注入乙個my.dll到i程序中,並在i程序中執行乙個myfunc的函式

如下圖

我寫完程式後,執行測試,功能是沒有錯誤的,一切正常。。。

二、    問題和分析

我的程式安裝採用了winrar的自解壓檔案,自解壓完成後,自解壓程式會執行s程式

然後手工啟動i程序後,發現i程序崩潰了。崩潰報告使用vs2008去除錯可以看到如下內容

從崩潰上,崩潰在某個執行緒上,熟悉注入**同學應該可以猜到應該是崩潰在注入時使用的createremotethread上了。

下面介紹一下我寫的注入的過程

1、  利用windows apicreateremotethread在i程序中建立遠端執行緒

2、  執行緒的執行緒函式為i程序中的某個函式位址

3、  這個函式位址中有如下**流程將被執行

上面的函式中的**以二進位制的形式被注入到程序的記憶體中,這段**是沒有pdb檔案也沒有**原始檔的

**如下

hmodule huser32= loadlibrary("user32.dll");

farproc pmessagebox = getprocaddress(huser32," messagebox ");

// load the injected dll into this process

hmodule h = loadlibrary("mydll.dll");

if(!h)

// get the addressof the export function

farproc p =getprocaddress(h, "myfunc");

if(!p)

// so we do notneed a function pointer inte***ce

__asm call p

// exit the threadso the loader continues

exitthread(0);

我懷疑了

i程序還沒有載入到必須的dll

i程序是否主視窗沒有完全顯示,

許可權不足

做了一些嘗試後,基本上排除了上面的可能性,這也是定位過程的「走彎路時間t_t」

因為我在myfunc的入口處也寫了日誌,myfunc完全沒有呼叫,然後通過prces***plorer發現mydll.dll並沒有被載入

也就是說**崩潰在上面的**中我使用黃色底色標識出的那幾行中,到底為什麼會崩潰呢?

因為createremotethread的函式位址我們是知道的,直接使用ollydbg檢視那段記憶體。

一目了然啊,在getprocesaddress這個位址上,崩潰的程序的記憶體中明顯是個錯誤位址。

getprocessaddress函式位址=kernal32.dll的load address + getprocessaddress偏移位址(如下圖getprocessaddress的偏移位址是0x00011222)

通過prces***plorer發現崩潰時kernal32.dll的load address和未崩潰時的kernal32.dll的load address是一致的。

也就是說getprocessaddress

偏移位址被修改了,導致了崩潰

基本上就是懷疑winrar自解壓程式修改getprocessaddress的偏移位址,為了驗證寫了乙個驗證程式

**如下,列印getprocaddress的位址

farproc getprocaddress = null;

// get the address of the main dll

hmodule kernel32  =loadlibrarya("kernel32.dll");

getprocaddress =getprocaddress(kernel32,   "getprocaddress");

debugprintf(_t("*****====get procadd 0x%8x"),getprocaddress);

測試結果:

第一條日誌是直接執行測試程式的輸出,也是正確的getprocaddress的位址,

第二條是winrar自解壓執行的結果,是錯誤的。

解決這個問題,我放棄了使用winrar自解壓程式做安裝包,改用inno setup。

三 總結

原來定位問題都需要pdb來定位到**行才可以去分析問題,個別極端情況下,沒有pdb,但是了解了**實現思路,使用olldbg也可以非常精準的定位問題。

一次GC問題定位

同事有段 執行時間過長,需要進行優化,hashmultimapmap for 400w 96 剛開始以為是計算過程docompute效率低造成的,所以想各種方法優化計算,提前計算 多執行緒 等等等等,最終如下 多執行緒計算 計算結果放入佇列 concurrentlinkedqueue queue q...

一次Mycat聚合排序問題定位

mycat mysql實現分庫分表 功能需要遍歷表,資料量有點大,於是通過id排序分頁查詢。在實現過程中發現有部分id查不出來,功能排期只能被迫延後。在確認了 和sql語句沒有問題後,目光轉至mycat與mysql排序邏輯上來。確認了mycat與mysql排序邏輯有問題,至少mycat與mysql排...

一次sql注入攻擊

喜歡學習 但是不想找漏洞 好麻煩 還不一定有乙個漏洞 是我在google上搜到的 畫面看著高大上 乙個頁面乙個頁面的找,尋找有輸入引數的地方,然後進行測試 本來我以為沒有注入的時候 突然 看到了一小句話 wow 有報錯資訊 可以進行報錯注入 想著可以提交烏雲了 然後先 order by 測試下有幾個...