首页
社区
课程
招聘
[旧帖] [求助]汇编指令CMP求解 0.00雪花
发表于: 2008-8-15 16:01 8646

[旧帖] [求助]汇编指令CMP求解 0.00雪花

2008-8-15 16:01
8646
00403B2F |. 89C6    MOV ESI,EAX     ; 把EAX内我们输入的用户名送到 ESI
00403B31 |. 89D7    MOV EDI,EDX    ; 把EDX内的数据“Registered User”送到EDI
00403B33 |. 39D0    CMP EAX,EDX   ; 用“Registered User”和我们输入的用户名作比较
00403B35 |. 0F84 8F000000   JE CrackMe3.00403BCA     ; 相同则跳

小弟刚接触汇编,有几个疑问,这里EAX里面是指针?机器怎么判断寄存器里的数据是指针还是实际数据呢?汇编教程上寄存器要加[]才表明里面数据是指针
这里的CMP指令比较原理是怎么样的呢?相减么?字串地址相减或比较有意义么?
不懂了,希望各位不吝赐教!

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

收藏
免费 0
支持
分享
最新回复 (21)
雪    币: 102
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
首先我先声明一下,我的表达能力不强,以下是我的个人见解:
在低级语言中对数据没有什么严格的定义,数据可以当指针用,指针也可以当数据用。
就是这么简单。
00403B33 |. 39D0    CMP EAX,EDX  ====>这里只是检测eax和edx是否是同一个指针,
或说是否指向同一个地址。估计肯定是不同的。
2008-8-15 16:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
还有几点不明:
1\我想总有标明什么时候用的是数据什么时候用的是指针吧,传的是地址但没加[]指明寻址,那么这样和加[]寻址有什么区别和联系吗?
2\也就是说下面紧跟的CMP指令怎么知道两个寄存器里的职是数据还是指针?
3\是数据就好理解,但指针比较又是个什么原理呢?

这两个地址相同的可能性极小,那么如果他们指向的数据是相同的,CMP那不是判断不相等么,那用这个CMP不就没意义了么?
2008-8-15 16:28
0
雪    币: 362
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
4
"机器怎么判断寄存器里的数据是指针还是实际数据呢?"
答:机器不需要判断.
2008-8-15 16:50
0
雪    币: 102
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼主要多动手试。光是讲理论是很难理解的。
2008-8-15 16:59
0
雪    币: 6092
活跃值: (699)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
6


天啊    三个字       F    A   Q
2008-8-15 17:20
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
现在就是这几点不明和参考书上讲的有些出入,思路跟不上了:

00403B2F |. 89C6   MOV ESI,EAX     ; 把EAX内我们输入的用户名送到 ESI
00403B31 |. 89D7   MOV EDI,EDX    ; 把EDX内的数据“Registered User”送到EDI
00403B33 |. 39D0   CMP EAX,EDX    ; 用“Registered User”和我们输入的用户名作比较
00403B35 |. 0F84 8F000000   JE CrackMe3.00403BCA       ; 相同则跳

1\上面代码紧跟的CMP指令怎么知道两个寄存器里的职是数据还是指针?
2\是数据就好理解,接CMP马上是JE指令肯定CMP指令已得出结果但指针比较又是个什么原理呢?
两操作数相减么?
太菜希望大家别见笑
2008-8-15 17:20
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).

寄存器里面为数据,比较后,若相等则JE实现跳转(根据零ZF判断)
2008-8-15 17:40
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
个人理解:
CMP 是对两数进行相减,进行比较
所以是指针的比较
2008-8-15 18:28
0
雪    币: 261
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
CMP 是对两数进行相减修改标志位,而跳转指令只是根据相关的标志位而决定是否跳转。
所以cpu不需要理会那数有什么意义
2008-8-15 19:02
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我想是我没表达清楚,如果是指针数据相减有意义么?
如果上指针相减比较成立,那么我要实际比较假如1,2这两个数的话
那就是
第一种情况:                                      第二种情况:
1h,2h为实实在在的数                 1h,2h为地址如果他们所指的内容相同

mov eax,1h                                     mov eax,1h
mov edx,2h                                     mov edx,2h
MOV ESI,EAX                                   MOV ESI,EAX
MOV EDI,EDX                                  MOV EDI,EDX
CMP EAX,EDX                                  CMP EAX,EDX
...                                                    ...
这两种情况是不是都得出同一个结果,两种情况都是1h,和2h做减法么?
那我第二中情况不是达不到逻辑比较意义么?本身相等的数据却变成不等了
2008-8-15 21:07
0
雪    币: 175
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
CPU里面把寄存器的内容都当做数据
只有我们要求CPU把他当做指针时他才是指针
如下:
假设我们在00430000处有一字符串
我们mov   ebx,00430000;<这里把00430000看做是一个立即数据传入ebx
push        [ebx];加上[]后,CPU就把先前的数据当指针使用了
2008-8-15 21:36
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
我是个菜鸟,开始也有同样的疑惑,慢慢调试后这么理解,不知道对不对:
mov     esi, eax
mov     edi, edx
cmp     eax, edx

eax,edx里的存放的数据是个地址。

CMP eax, edx,就是比较数据相不相同,也就是比较是不是指向同一地址。
说错了请高手不要见笑!
2008-10-1 06:20
0
雪    币: 261
活跃值: (32)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
14
00403B31 |. 89D7    MOV EDI,EDX    ; 把EDX内的数据“Registered User”送到EDI
EDX中的数据不可能是“Registered User”,它是16个字节,EDX只有4个字节,所以是地址,楼主的这段代码00403B33 |. 39D0    CMP EAX,EDX   要么是有什么特殊用途,比如真的是比较地址是否相同,要么就是楼主的注解错的,比较的是数据,而且不是“Registered User”
2008-10-2 13:27
0
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
虽然不知道这段代码后面怎么写的,我猜是比较字符串地址是否相同,也就是比较指针是否相等。
验证爆破之一?防止后面的运算中,正确注册字符串和自身比较?
2008-10-2 13:54
0
雪    币: 200
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
楼主所说的这段程序是CrackMe3中用来判断是否输入用户名的一部分
00403B2F |. 89C6    MOV ESI,EAX     ; 把EAX内我们输入的用户名送到 ESI//当我们没有输入用户名的时候EAX内的数据应该是“Registered User”
00403B31 |. 89D7    MOV EDI,EDX    ; 把EDX内的数据“Registered User”送到EDI
00403B33 |. 39D0    CMP EAX,EDX   ; 用“Registered User”和我们输入的用户名作比较
00403B35 |. 0F84 8F000000   JE CrackMe3.00403BCA     ; 相同则跳//我从网上很多地方看到说JE是根据ZF零标志位判断是否跳转的,当我们不输入用户名的时候,EAX和EDX内的数据应该是一样的,CMP使用的是减法比较,比较过后相同,应该是在零标志位ZF=1,表示运算结果的所有位为0,JE判断后直接跳过下面的运算程序,就跳出“wrong serial,try again!”了。
我感觉12楼说的应该对一些。在此CMP没有必要判断比较的是指针还是数据,因为都是二进制,CMP只要判断2个二进制是否相同就可以,相同表示没有输入用户名,然后就直接跳。
另外说一点对于JE的理解   
我脱WIN98的壳的时候看到很多JE SHORT  WIN98记事本* *******
我从网上找了很多,在此参照楼主的帖子,我感觉   JE后边的那个名字就是要在那个程序内部跳
我听过程序领空和系统领空,大概一个程序内部的地址就是一个程序的领空,防止跳出程序出现错误。另外再说一点,也许大家都知道,就是怕大家忘了。
JE和JZ    相等则跳
JNE和JNZ    不相等则跳
JB   小于则跳
JA  大于则跳
JG  大于则跳
JGE  大于等于则跳
JL  小于则跳
JLE   小于等于则跳
JMP  无条件跳
CALL   调用子程序    (子程序相对来说大概就像C语言的函数库,方便使用)
POP   出栈
PUSH   入栈
RETN     返回主程序(感觉有些壳找不到JMP跳,就是使用的RETN跳的)
NOP   空指令
2008-10-17 19:58
0
雪    币: 200
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
不过我又拿OD看看一下,感觉上边我说的有问题,没有输入用户名的时候EAX内好像不是“Registered User”而是"Unregistered..."
堆栈 ss:[0012F9AC]=00D46BC4, (ASCII "Unregistered...")
eax=0000000F
2008-10-17 20:07
0
雪    币: 210
活跃值: (56)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
18
鄙人才疏学浅,简单分析下,没得到原程序
00403B2F |. 89C6    MOV ESI,EAX     ; 把EAX内我们输入的用户名送到 ESI//当我们没有输入用户名的时候EAX内的数据应该是“Registered User”
00403B31 |. 89D7    MOV EDI,EDX    ; 把EDX内的数据“Registered User”送到EDI
00403B33 |. 39D0    CMP EAX,EDX   ; 用“Registered User”和我们输入的用户名作比较
(复制来的)
如果楼上的没分析错,一般来讲,此时EAX (说是输入的用户名)里面应该是个内存地址,是存放输入用户名的首地址!我觉得怎么也不可能是用户名的ASC吧,一个寄存器的位数是有限的,而要存储的字符ASC确是没有限制的!所以如果楼上的看程序分析得对,此三句的意思就是比较两个地址是否相同了.理论上是不会同的,要不还不乱套了?作者故意的?
比较字符串是否相等,似乎要按位比较吧,没见过一句话就能比较一个字串的
好象一般用API函数取得的字符串,返回的都是他们的位数
大胆猜测下,难道是比较位数是否相等?吼吼
乱想下了
2008-10-20 10:44
0
雪    币: 210
活跃值: (56)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
19
鄙人才疏学浅,简单分析下,没得到原程序
00403B2F |. 89C6    MOV ESI,EAX     ; 把EAX内我们输入的用户名送到 ESI//当我们没有输入用户名的时候EAX内的数据应该是“Registered User”
00403B31 |. 89D7    MOV EDI,EDX    ; 把EDX内的数据“Registered User”送到EDI
00403B33 |. 39D0    CMP EAX,EDX   ; 用“Registered User”和我们输入的用户名作比较
(复制来的)
如果楼上的没分析错,一般来讲,此时EAX (说是输入的用户名)里面应该是个内存地址,是存放输入用户名的首地址!我觉得怎么也不可能是用户名的ASC吧,一个寄存器的位数是有限的,而要存储的字符ASC确是没有限制的!所以如果楼上的看程序分析得对,此三句的意思就是比较两个地址是否相同了.理论上是不会同的,要不还不乱套了?作者故意的?
比较字符串是否相等,似乎要按位比较吧,没见过一句话就能比较一个字串的
好象一般用API函数取得的字符串,返回的都是他们的位数
大胆猜测下,难道是比较位数是否相等?吼吼
乱想下了
2008-10-20 10:54
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
假设(AX)=0056H,(BX)=0156H
那么再执行CMP AX,BX  ;之后,各个标志位是多少?
答:CF=1、OF=0、ZF=0、AF=0、PF=1、SF=1。

再假设(AX)=FFEFH,(BX)=1D3FH
那么执行SUB AX,BX    ;之后,各个标志位是多少。
答:CF=0、OF=0、ZF=0、AF=0、PF=0、SF=1。
2008-10-20 15:18
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
自己Google一下,可以找到很多的,建议楼主好好学学汇编
2008-10-20 15:19
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
比效指令 CMP(CoMPare)

格式: CMP OPRD1,OPRD2

功能: 对两数进行相减,进行比较.
说明:

1. OPRD1为任意通用寄存器或存储器操作数.

   OPRD2为任意通用寄存器或存储器操作数,立即数也可用作源操作数OPRD2.

2. 对标志位的影响同SUB指令,完成的操作与SUB指令类似,唯一的区别是不将OPRD1-OPRD2的结果送回OPRD1,而只是比较.

3. 在8088/8086指令系统中,专门提供了一组根据带符号数比较大小后,实现条件转移的指令.
2008-10-20 15:27
0
游客
登录 | 注册 方可回帖
返回
//