關於同一條消息有other問題,但是當我嘗試執行一系列調用某些函數的機器代碼時,我似乎碰到了這個問題。在我的情況下,我打電話退出(0),在同一個程序中用C語言調用時可以正常工作。但是,如果作爲練習,我將EIP設置爲某些機器代碼的地址(你可以稱之爲「shellcode」),例如機器指令中出口(0)處的「訪問衝突讀數」?
const char code[] =
"\x6A\x00" // push 0"
"\xFF\x15\x00\x00\x00\x00" //system call, 'read access violation': call dword ptr [__imp__exit]
"\x5D" //pop ebp
"\xC3"; //ret
我會得到消息「Access violation reading location 0x00000000。」。 「\ x6A \ x00」指令將運行,但對exit(0)的調用將拋出此異常。
這是在VS2010中用/ GS-編譯的C,並且還運行帶有執行權限的「shellcode」,但是仍然存在某種不可執行的內存或堆棧保護嗎?爲什麼這條指令會導致錯誤?
int main()
{
void *exec = VirtualAlloc(0, sizeof(code), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(exec, code, sizeof(code));
//EIP = exec in debug->immediate
exit(0);
}
你的字節值中顯然有很多零。這不會奇蹟般地被加載器重定位到__imp_exit,它不知道你的char []應該是代碼。你必須自己做。 –