FzzrRW
2017-01-04 15:43
采纳率: 88.9%
浏览 910

有人能看懂这段代码吗,他是怎么改变esp的 坐等大牛

 #include "stdio.h"
#include "conio.h"
#include "windows.h"

char Msg[] = "Hello C++! I Love you forever!";

int __stdcall RelocThread(int Param)
{
    int Addr = 0;
    char *pMsg = NULL;
    if (!Param)
    {
        Addr = ((int(__stdcall*)(void))RelocThread)();
        Addr = 5 + Addr + *(int*)(Addr + 1);
        pMsg = (char*)(Addr + (int)&Msg - (int)&RelocThread);

        printf("In RelocThread:\n");
        printf("I can Found My start address myself=0x%08X\nand Global Value Msg=0x%X\n", Addr, pMsg);
        printf("%s\n", pMsg);

        ExitThread(0);
    }
    return (*(int*)((int)&Param - 4)) - 5;
}

void main(void)
{
    HANDLE hThread = CreateRemoteThread(GetCurrentProcess(), NULL, 0, (LPTHREAD_START_ROUTINE)RelocThread, 0, 0, NULL);
    WaitForSingleObject(hThread, INFINITE);
    printf("In function main:\nRelocThread=0x%08X,Msg=0x%08X\n", RelocThread, Msg);
    getch();
}


他是怎么改变esp的

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • threenewbee 2017-01-04 15:52
    已采纳

    堆栈上有函数的返回地址,通过故意越界的地址强行改写,当函数清栈退出的时候,就自动会将esp设置为这个返回地址(已经被改写)

    已采纳该答案
    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题