首页
社区
课程
招聘
[讨论]加密与解密4-第20章.错误太多了
发表于: 2018-10-16 17:36 5696

[讨论]加密与解密4-第20章.错误太多了

2018-10-16 17:36
5696
1. 741页
push 指向地址的字节码
jmp vStartVM

2. 741页

3. 742页

4. 742页

vCheckEsp
   lea eax,[edi+100]
   cmp eax,ebp
   jl VMDispatcher
   ......
   ......
5. 743页 

vPushReg32
  mov eax,[esi]
  add esi,4
  mov eax,[esi+eax]
  push eax
  jmp VMDispatcher
6. 743页 
vPushMem32
  mov edx,0
  mov ecx,0
  mov eax,[esp]
  test eax,eax
  cmovge edx,[edi+eax]
  mov eax,[esp+4]
  text eax,eax
  cmovge ecx,[edi+eax]
  imul ecx[esp+8]
  add ecx,[esp+0xc]
  add edx,,ecx
  add esp,0x10
  push edx
  jmp VMDispatcher 
7. 744页
vAdd
  mov eax,[esp+4]
  mov eax,[esp]
  add ebx,eax
  add esp,8
  push ebx
8. 749
vRetn
  xor eax,eax
  mov eax,[esi]
  add esi,2
  mov ebx,[ebp]
  add ebp,4
  add ebp,eax
  push ebx
  push ebp
  ......

push ebp
mov ebp,esp
sub esp,xx      vRetn的EBP,指向这里。看第2处的图,EBP位置
......
add eax,1        VM这条指令,你想想栈顶能是保存返回地址的地方吗?
......
mov esp,ebp   //
pop ebp          //这里还没平衡堆栈
ret

1.
综合上面的1,2,3,4处
是不是代码写错了?菜鸡请指教!
vCheckEsp
   lea eax,[edi+100]
   cmp eax,ebp        // edi和ebp不会变,所以eax永远小于ebp
   jl VMDispatcher
   ...... 
   ......

2.
综合上面的2,5,7处
esp->edi这块区域 (0x40) 不是vm使用的栈吗?
为什么第5-7处是push和add esp?

3
从第8处看,好像这个函数有问题
从虚拟机代码中看,它把函数里面的所有指令都vm了,平衡了堆栈所以返回地址不会出错
当只VM一条指令的时候vRetn从EBP里面获取返回地址就是错误的,参考第8处的第2个函数
说好的push数据,然后vRetn从esp里面取数据当成返回地址呢?居然用ebp获取返回地址
vmp才是用的ebp啊,你书里面不是用的esp吗,你这是闹哪样?

解决了:
第2和第5处的代码,上面是VM堆栈,下面是VM环境 的方式写的代码   用了esp
第4和第8处的代码,上面是VM环境,下面是VM堆栈 的方式写的代码   用了ebp
3个月预定等了那么久,效验这么多次,错误还是那么明显

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2018-10-17 20:14 被你坏编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (19)
雪    币: 65
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
书开始发货了?
2018-10-16 18:30
0
雪    币: 14
活跃值: (11)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
大山猪 书开始发货了?
已经到了
2018-10-16 18:32
0
雪    币: 65
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不懂看看大佬回答
2018-10-16 18:33
0
雪    币: 65
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
大佬可以发一下你买书的链接吗?
2018-10-16 18:36
0
雪    币: 53
活跃值: (578)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
狗日的京东还没发货
2018-10-16 19:45
0
雪    币: 911
活跃值: (1358)
能力值: ( LV12,RANK:280 )
在线值:
发帖
回帖
粉丝
7
问题一:随意挑了vmp中的两handle 就显而易见了
AC              lods byte ptr ds:[esi]
8B1438          mov edx,dword ptr ds:[eax+edi]
83ED 04         sub ebp,0x4
8955 00         mov dword ptr ss:[ebp],edx
---------------------
66:8CE8         mov ax,gs
83ED 02         sub ebp,0x2
66:8945 00      mov word ptr ss:[ebp],ax
顺便说下,只有push( sub ebp)才会check,
问题二:和问题一其实差不多,你需要搞清楚vm的栈,以及handle是如何操作vm栈的
顺便说下,vmp中:
8B45 00         mov eax,dword ptr ss:[ebp]        
0145 04         add dword ptr ss:[ebp+0x4],eax   
9C              pushfd
8F45 00         pop dword ptr ss:[ebp]   
stacktop --> eflags
+4          --> answer
然后再把eflags放入vmcontext,也就是之后跟了条
lods byte ptr ds:[esi] // 取index
mov edx,dword ptr ss:[ebp]     
add ebp,0x4
mov dword ptr ds:[eax+edi],edx
问题三:如果push到stack之后,是个popad之类的,寄存器不就恢复了么
2018-10-16 22:39
0
雪    币: 14
活跃值: (11)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8


最后于 2018-10-16 23:56 被你坏编辑 ,原因:
2018-10-16 23:22
0
雪    币: 14
活跃值: (11)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
waiWH 问题一:随意挑了vmp中的两handle 就显而易见了AC       & ...
vPushReg32
  mov eax,[esi]
  add esi,4
  mov eax,[esi+eax]
  push eax  //这里是push,你说的是ebp
  jmp VMDispatcher

问题1:
加密与解密4,第20章作者不是那VMP来举例的
你看看你贴出的handler和我贴出的对比看看
一个是操作esp的push,一个是操作ebp的sub,mov

既然你这么说,那么我说的问题1,就真的是代码错误了
handle里面都是对esp的操作,而问题1里面的vCheckEsp handle,检查的是:ebp
vPushReg32
   push xx
vAdd
   add esp,xx

问题2:
你仔细看我第2处的图,esp->edi 有0x40的空间,但是作者没有用它
它在handle中都是push,当前esp已经vm栈的顶部了,在push就出去了

问题3:
可能是我没说明白,我觉得有问题的地方是返回地址
根据图2的堆栈图,ebp是在调用者的栈顶,不属于vm的栈了
但是这里是存放数据的地方啊,怎么会有返回地址给你,
书上面说vRetn是虚拟机退出代码, 返回地址绝对不正确
书中给的代码也就那么点,第2处的堆栈图,已经告诉了你ebp在什么位置
push ebp
mov ebp,esp
sub esp,xx
......
add eax,1        VM这条指令,你想想栈顶能是保存返回地址的地方吗?
......
mov esp,ebp
pop ebp
ret

最后于 2018-10-17 00:08 被你坏编辑 ,原因:
2018-10-16 23:57
0
雪    币: 911
活跃值: (1358)
能力值: ( LV12,RANK:280 )
在线值:
发帖
回帖
粉丝
10
没书,不过大概都差不多
问题一:去看jmp到check的handle,操作ebp的。你所挑的没啥联系
问题二:还是去看看其他handle,注意赋值问题
问题三:如果把返回地址提前放入呢
还有,多注意ebp等寄存器的赋值,需要明白ebp,edi,esi的作用
最后于 2018-10-17 08:40 被waiWH编辑 ,原因:
2018-10-17 08:36
0
雪    币: 14
活跃值: (11)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
waiWH 没书,不过大概都差不多问题一:去看jmp到check的handle,操作ebp的。你所挑的没啥联系问题二:还是去看看其他handle,注意赋值问题问题三:如果把返回地址提前放入呢还有,多注意ebp等寄 ...
书中大概就这么多代码了,jmp到check的handle书里面没有
21章是vmp的解析和还原,20章作为虚拟机的设计,应该是为21做铺垫把,所以很多东西没讲到
ebp 只有在vStartVM和vBegin和vRetn中用到了,就那么点代码,我找了
最后于 2018-10-17 14:20 被你坏编辑 ,原因:
2018-10-17 14:16
0
雪    币: 14
活跃值: (11)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
waiWH 没书,不过大概都差不多问题一:去看jmp到check的handle,操作ebp的。你所挑的没啥联系问题二:还是去看看其他handle,注意赋值问题问题三:如果把返回地址提前放入呢还有,多注意ebp等寄 ...
问题解决了,书中错误太多了。
最后于 2018-10-17 19:00 被你坏编辑 ,原因:
2018-10-17 17:39
0
雪    币: 1198
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
我在淘宝买了快两个月还没发货,今天在京东买了, 立马发货
2018-10-17 18:50
0
雪    币: 47147
活跃值: (20455)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
14
你坏 waiWH 没书,不过大概都差不多问题一:去看jmp到check的handle,操作ebp的。你所挑的没啥联系问题二:还是去看看其他handle,注意赋值问题 ...
感谢反馈!
最后于 2018-10-20 11:06 被kanxue编辑 ,原因:
2018-10-17 20:59
0
雪    币: 290
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
waiWH 问题一:随意挑了vmp中的两handle 就显而易见了AC       & ...
p742
lea eax,[edi+100]            //eax = edi+100,也就是VMContext的地址+100
cmp eax,ebp
jl VMDispatcher              //小于则跳转
否则,也就是说ebp不断sub快追上VMContext了
mov edx,edi
mov ecx,esp
sub ecx,edx                    //ecx = esp-edi
但是esp是比edi小的,这个减法必定减出来一个超大数,之后的rep movsb要用这个ecx做循环,这里是不是有点问题
2018-10-19 19:16
0
雪    币: 290
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
p743
图20.2
esp地址应该比VMContext低,这个图里应该是ebp吧
最后于 2018-10-19 19:21 被今天不吃面编辑 ,原因:
2018-10-19 19:21
0
雪    币: 911
活跃值: (1358)
能力值: ( LV12,RANK:280 )
在线值:
发帖
回帖
粉丝
17
vmp checkstack提供参考
8D47 50         lea eax,dword ptr ds:[edi+0x50]
39C5            cmp ebp,eax                             
77 ??           ja DISPATCHER1
89E2            mov edx,esp
8D4F 40         lea ecx,dword ptr ds:[edi+0x40]
29D1            sub ecx,edx
8D45 80         lea eax,dword ptr ss:[ebp-0x80]
24 FC           and al,0xFC
29C8            sub eax,ecx
89C4            mov esp,eax                             
9C              pushfd
56              push esi
89D6            mov esi,edx
8D7C01 C0       lea edi,dword ptr ds:[ecx+eax-0x40]
57              push edi
89C7            mov edi,eax                              
FC              cld
F3:A4           rep movs byte ptr es:[edi],byte ptr ds:[esi]
5F              pop edi
5E              pop esi
9D              popfd
EB ??           jmp DISPATCHER1
另注意entry中
89E5            mov ebp,esp
81EC C0000000   sub esp,0xC0
89E7            mov edi,esp
然后就明白esp,edi,ebp了
btw:handle操作esp,就只有checkstack,retf/iret/retn,call
最后于 2018-10-19 20:24 被waiWH编辑 ,原因:
2018-10-19 20:20
0
雪    币: 14
活跃值: (11)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
18
今天不吃面 p743图20.2esp地址应该比VMContext低,这个图里应该是ebp吧
edi+100 和 ebp 比较
永远是跳转到VMDispatcher
jl VMDispatcher 下面的代码不会执行的
vm堆栈在上面,vm环境在下面,这种是不会覆盖vm环境的
书上面的checkESP是针对把ebp作为保存操作数的堆栈检测,书上面是esp
这个函数在书上是画蛇添足
只有vmp这种,堆栈中是用ebp来存放操作数的的堆栈结构这个函数才会有用
ps:
加密解密4的虚拟机设计,是从加密解密3直接拿过来的,有人早就质疑过这章的问题了
我也是后面才知道的,哎
最后于 2018-10-21 17:14 被你坏编辑 ,原因:
2018-10-21 17:11
0
雪    币: 14
活跃值: (11)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
19
waiWH vmp checkstack提供参考8D47 50      &n ...
你看第2处,vm环境和vm堆栈的位置,根据书上代码画的
VMP和书上的不同:
vmp堆栈的低地址是vm环境,高地址是vm堆栈
书上堆栈的低地址是vm堆栈,高地址是vm环境,
所以书上push数据的时候不是ebp,而是esp
sub esp不会覆盖vm环境,这个代码在书上就是个坑

还有第8处的代码,按照指令,作为它的参数
根据书上的堆栈图应该是push,从esp里面取
但是你看着代码,从ebp里面取返回地址
ret的返回地址应该被作为操作数,书上的结构操作数就应该是从esp里面取
然而书上既用了esp取操作数,又用到了ebp来取操作数
第8处的代码在vm一条指令的时候也会因为从ebp处取返回地址(前函数的栈顶),导致出错 ,因为前函数开辟了堆栈用来存储临时数据
有很多话想说的! 作为一本书这样真的好吗?
最后于 2018-10-21 17:53 被你坏编辑 ,原因:
2018-10-21 17:20
0
雪    币: 418
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
我的京东已经发货了
2018-10-22 11:12
0
游客
登录 | 注册 方可回帖
返回
//