首页
社区
课程
招聘
[求助]关于书中17章 虚拟机存在的疑问
2018-4-13 11:06 3070

[求助]关于书中17章 虚拟机存在的疑问

2018-4-13 11:06
3070
首先感谢版主的辛苦工作,给我们提供这么好的学习资源,拜谢!
这是我从之前一位坛友所发的帖子里d的一张图,这张图和我看加解密17章虚拟机所画的内存分布图是一致的,这是VStartVM之后的状态。
疑问1:ESP和EBP谁才是虚拟机内部执行指令时使用的堆栈栈底地址?
两种假设我都做了,但是都有矛盾,假设ESP是虚拟机执行指令使用的栈,那么17.2这张图就讲不通,因为ESP在比EDI更低的位置,堆栈再怎么成长也不会影响到VMContext。假设EBP所指向的地址是虚拟机执行指令所用的栈,那么17.2这张图就可以讲通,但是,通篇都没有把ESP移回EBP的操作,ESP的指针是如何回到比EDI地址更高的位置的?因为只有ESP回到更到的位置,才能符合17.2的图
疑问2:我理解的EBP是整个虚拟机所使用的真实栈的栈底地址,也就是栈的平衡点,但是在VCheckESP中,这种认知被打破了,edi+100h和ebp做比较,EBP不是起到栈底标识作用的吗?不是不会移动吗?如果EBP能移动是否就是说EBP是虚拟机内部栈的栈顶指针(内部ESP),如果是的话,所有的handler用的为啥都是ESP而不是EBP?
疑问3:同样在VCheckESP里,在指令rep movsb之后两个pop指令比较迷糊,上面执行过sub esp,0x40,此时pop edi和pop esi根据我画的图得不到正确的地址啊,esp栈顶和存储edi和esi的位置相差0x40,如何pop出来的?
疑问4:所有的handler程序内部直接使用push和pop指令,操作的应该是ESP指针的位置,那也就是说是ESP所指向的位置,ESP并没有主动调高地址(代码里没有体现),也就是ESP仍然处于所有模块更低的内存位置,图17.2又矛盾了,那之前分配的0x200h的空间是留作什么用的?
以上,请明白这一块的大牛能够不吝赐教,小弟拜谢,这里看了无数遍,始终矛盾重重,看不清晰,无奈发求助帖,再次拜谢!!

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (3)
雪    币: 182
活跃值: (475)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
glider菜鸟 1 2018-4-13 16:20
2
0

我也是新手,个人的一些理解。
虚拟机内部 虚拟堆栈操作使用的是 ebp寄存器。理由,可以看下虚拟指令push的解释源码:

//解释push
BOOL CInterpretHandler::InterpretPush(VMTable* table,char* asmtext,int len)
{
    char scalestr[6] = {0};
    int sizeidx = 0;
    if( table->bitnum[0] == 8 )
    {
        sizeidx = 0;
        strcpy_s(scalestr,6,"byte");
    }
    else if( table->bitnum[0] == 16 )
    {
        sizeidx = 1;
        strcpy_s(scalestr,6,"word");
    }
    else if( table->bitnum[0] == 32 )
    {
        sizeidx = 2;
        strcpy_s(scalestr,6,"dword");
    }

    sprintf_s(asmtext,len,"%ssub ebp,%d\n",asmtext,table->bitnum[0] / 8);//从堆栈中腾出空间
    if( table->optype[0] == MEMTYPE )
    {
        sprintf_s(asmtext,len,"%smov %s,%s ptr %s[eax]\n",asmtext,vregname[sizeidx][RT_Eax],scalestr,GetSegStr(table->Segment));//得到内存数的值
    }
    sprintf_s(asmtext,len,"%smov %s ptr [ebp],%s\n",asmtext,scalestr,vregname[sizeidx][RT_Eax]);
    return TRUE;
}

还有其他的虚拟指令翻译,都是用的ebp操作的。
17.2 图中画的其实是虚拟环境的esp,真实操作的是ebp。
那么为什么书中的handler使用esp,而不是ebp。我的理解是这些handler是辅助用的,并不绝对需要在虚拟的堆栈中运行,可以在真实的堆栈中运行。
所以它分为 辅助handler和普通handler,辅助handler就是用来操作真实堆栈。

 

分配的0x200用处

 ____________
|            |   高地址
|            |
|  vm stack  |   解释虚拟指令所需堆栈  大小0x100
|            |
|            |
|————————————|
|            |
|            |   vm context 大小0x100
| vm context |
|____________|   低地址    
|            |
|            |
| real stack |   虚拟机本身堆栈  大小0x40
|____________|

个人理解,有错误欢迎指正。

雪    币: 545
活跃值: (323)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
zdcode 2018-4-13 16:25
3
0
glider菜鸟 我也是新手,个人的一些理解。 虚拟机内部 虚拟堆栈操作使用的是 ebp寄存器。理由,可以看下虚拟指令push的解释源码: ``` //解释push BOOL CInterpretHandler ...
太感谢你了,大佬,看了你得说明豁然开朗了,小弟跪谢!
雪    币: 290
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
今天不吃面 2018-10-10 17:43
4
0
我看了下也感觉有问题
P475开头的代码
mov edx,edi
mov ecx,esp
sub ecx,edx
其实就是ecx(待拷贝的字节数) = esp-edi,但esp比edi低啊,且不说别的,这个减法一减,减出来一个超大的数,然后拷贝,确定不会出事?
游客
登录 | 注册 方可回帖
返回