我有一個令人遺憾的復雜問題,我希望有人能夠幫助我。
我撰寫了一個相當大的程式,已將其轉換為與位置無關的代碼(請參閱此處以供參考:
在崩潰時檢查堆疊的內容表明:

查看 IntermedBuf 的內容(這是傳遞給 strstr 呼叫的引數之一),我可以看到程式正在將資料從 IOBuf 復制到 IntermedBuf 并按預期洗掉空格,但是程式在復制 ~80k 后崩潰。
IOBuf(原始資料):

IntermedBuf(去掉空格后)

我對這里發生的事情的初步理解是,strstr(可能還有 memcpy)在每次呼叫時都會將資料推送到堆疊,并且給定回圈的長度(lengthIOBuf 約為 325K,每隔 2-11 個字符隨機出現空格)在 while 回圈完成和堆疊展開之前堆疊溢位。但是,這并不能解釋為什么這兩種情況下在 x64 中以及在 x86 中當 PIC 程式在用戶制作的程式中運行而不是注入到合法行程中時都能成功。
我在本地注入器中運行了 x86 PIC 程式,它成功了,并且還附加了 Windbg 以檢查那里發生的不同情況。堆疊同樣包含與上面螢屏截圖中相同的字符模式,但是在回圈的后面(因為程式再次成功),堆疊似乎......跳轉?我在 while 回圈的早期檢查了堆疊的內容(在 strstr 上設定了 bp),發現它包含在遠程注入器會話中的堆疊中看到的幾乎相同的模式:

這次我還在 while 回圈中添加了另一個 MessageBox,設定為在 j > lenIOBuf - 500 時彈出,以便在程式接近完成 while 回圈時捕獲它。
char* locSpace;
while (j < lenIOBuf)
{
if (j > lenIOBuf - 500)
{
((MEMSET)Apis.memsetFunc)(tools, 0, 100 * sizeof(char));
((SPRINTF)Apis.sprintfFunc)(tools, StringVars->poi, IntermedBuf);
((MESSAGEBOXA)Apis.MessageBoxAFunc)(NULL, tools, NULL, NULL);
}
locSpace = ((STRSTR)Apis.strstrFunc)(IOBuf j, StringVars->space);
if (locSpace == 0)
locSpace = IOBuf lenIOBuf;
strLen = locSpace - IOBuf - j;
((MEMCPY)Apis.memcpyFunc)(IntermedBuf i, IOBuf j, strLen);
i = strLen, j = strLen 1;
}
當這個 MessageBox 彈出時,我暫停執行,發現 ESP 現在是 649fd80;以前是 13beb24 左右?

所以看起來堆疊重新定位,或者本地注入器向堆疊添加了更多記憶體或其他東西(我對這些東西很天真)。在執行的這個階段查看“原始”堆疊位置表明,當回圈接近完成時,之前的資料仍然存在:

因此,底線是,在 x64 本地/遠程和 x86 本地中的所有帳戶成功運行的這段代碼在 x86 中的另一個行程中運行時會崩潰。看起來,在本地注入器的情況下,堆疊填充的方式與遠程注入器崩潰的方式相似,但是本地注入器正在重新定位堆疊或添加更多堆疊空間或遠程注入器中沒有發生的事情。有誰知道為什么,或者更重要的是,我如何更改代碼以實作以不同方式從大型任意緩沖區中洗掉空格的目標,而我可能不會遇到當前的溢位?
謝謝你的幫助
uj5u.com熱心網友回復:
typedef void*(WINAPI* MEMCPY)(void * destination, const void * source, size_t num);
typedef char*(WINAPI* STRSTR)(const char *haystack, const char *needle);
是錯誤的宣告。這兩個 API 都使用了__cdecl呼叫約定——這意味著呼叫者必須add esp,4*param_count在呼叫后上堆疊()。但是因為您將其宣告為__stdcall(== WINAPI) 編譯器不會生成add esp,4*param_count指令。所以你push的引數不平衡。
你需要使用
typedef void * (__cdecl * MEMCPY)(void * _Dst, const void * _Src, _In_ size_t _MaxCount);
typedef char* (__cdecl* STRSTR)(_In_z_ char* const _String, _In_z_ char const* const _SubString);
等等..
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/515598.html
標籤:Intel Collective C循环温纳皮x86堆栈溢出
