首页
社区
课程
招聘
请riijj看这个crackme,我前面说的问题都在里面!
发表于: 2005-1-20 21:27 5507

请riijj看这个crackme,我前面说的问题都在里面!

2005-1-20 21:27
5507
关于 rol dword ptr 【eax】,5 和ror dword ptr 【eax+4】,7的问题
这两个东西始终有不同,按照你第一次说得那个可以解决后面这个问题,但是不能解决前面一个,我实在是搞不懂到底是一个字节一个字节循环还是四个字节一起进行!你可以看看这个crackme,这是一个key文件的注册方式!文件名是spook.key,内容要求有8个字节!我试的是12345678,伪造好文件后,直接在00401511出设断点(ollydbg),刚好开始这段运算,也是这个crackme的运算开始,算法很简单,但是我在求逆运算后回来总是在上面两个不地方出错!
  
  crackme见附件!请riijj有时间给看看,小弟在此感谢!请提出意见和解决方法或者可能的问题!

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

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
bbs.pediy.com/upload/file/2005/1/noodles-rackme2.rar_353.rar
2005-1-20 21:44
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
怎么总是上传不上去,其实就是看雪论坛上面的“看雪论坛精华”的CrackMe-PEDIY5中的keyfile中的noodles-crackme2,直接在00401511设置断点就可以开始!
2005-1-20 21:52
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
4
第二次是说法是正确的,当你的 ROL 目标是 dword ptr [eax] 的时候,是把 32 bit 一起循环的

你的第一个例子

ROR DWROD PTR D:[EAX+4],7
[EAX]=31 32 33 34 35 36 37 38

31 32 33 34  是 00110001001100100011001100110100  (留意最左边是两个 0 )

把这 32 bit 的左边 5 bit 放到右边

= 001001100100011001100110100 00110
也就是 100110010001100110011010000110 ,跟你的答案相同

你给的第二个例子也成功得到答案

(下一次把相同的讨论都发在同一个帖里,不要分开发帖)
2005-1-20 22:17
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
按照这种位移循环,可以解决rol的问题,我试了好几个都没有问题,但是对于ror好像不行!倒是好像对于ror用单个字节反而是对的!例子如下:
【eax】=31 32 33 34=00110001 00110010 00110011 00110100
【eax+4】=61 62 63 64=01100001 01100010 01100011 01100100
第一个:
rol 【eax】,5 =>001 00110010 00110011 00110100 00110
               = 00100110 01000110 01100110 10000110
               = 26 46 66 86 结果和电脑结果完全正确!
第二个:
ror 【eax+4】,7=>1100100 01100001 01100010 01100011 0
                 = 11001000 11000010 11000100 11000110
                 = C8 C2 C4 C6 和电脑的顺序不通!
电脑结果为:       11000100 11000110 11001000 11000010
                 = C4 C6 C8 C2
我试了好多个,结论都是这样的,也就是用32个字节对rol都是对的,但对于ror来说,总是顺序不对,虽然都是这几个字节!总不至于下面的要错位看吧!我想了好久但始终不明白其中的道理!
2005-1-21 00:15
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
6
【eax+4】=61 62 63 64=01100001 01100010 01100011 01100100

对 【eax+4】 进行 ror 7

以 dword 方式读取 ,排列次序 : 64 63 62 61  = 64636261

01100100 01100011 01100010 01100001

把 32 bit 的右边 7 bit 放到左边

ð        11000010110010001100011011000100

成为 C2 C8 C6 C4

在内存里的排列 :  C4 C6 C8 C2
2005-1-21 08:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
多谢riijj的讨论,从中学到不少东西,现在我已经全部解决了这个crackme,你真的是一个很耐心的人能给我说这么详细!要不然我可能一直都搞不懂,从这个问题中我又想到了一个问题,想提出来讨论一下:

1)上面的问题是加了dword ptr,要是没有加这个修饰符的话,是不是应该将这64位一起循环呢?也就是说这个修饰符的地方就是说明是多少字节参与循环?不知道是不是这样的!
2)如果是按dword ptr循环,但是后面并没有32位的时候,是不是继续往下面的临近内存再取值,直到有了32位为止,而不管下面内存中的是不是正常的数据!
2005-1-21 12:07
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
多谢riijj的讨论,从中学到不少东西,现在我已经全部解决了这个crackme,你真的是一个很耐心的人能给我说这么详细!要不然我可能一直都搞不懂,从这个问题中我又想到了一个问题,想提出来讨论一下:

1)上面的问题是加了dword ptr,要是没有加这个修饰符的话,是不是应该将这64位一起循环呢?也就是说这个修饰符的地方就是说明是多少字节参与循环?不知道是不是这样的!
2)如果是按dword ptr循环,但是后面并没有32位的时候,是不是继续往下面的临近内存再取值,直到有了32位为止,而不管下面内存中的是不是正常的数据!
2005-1-21 15:11
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
9
这是从 Intel 指令集里的描述
(opcode)   (instruction)     (description)
D0 /0     ROL r/m8,1      Rotate 8 bits r/m8 left once
D2 /0     ROL r/m8,CL     Rotate 8 bits r/m8 left CL times
C0 /0 ib  ROL r/m8,imm8   Rotate 8 bits r/m8 left imm8 times
D1 /0     ROL r/m16,1     Rotate 16 bits r/m16 left once
D3 /0     ROL r/m16,CL    Rotate 16 bits r/m16 left CL times
C1 /0 ib  ROL r/m16,imm8  Rotate 16 bits r/m16 left imm8 times
D1 /0     ROL r/m32,1     Rotate 32 bits r/m32 left once
D3 /0     ROL r/m32,CL    Rotate 32 bits r/m32 left CL times
C1 /0 ib  ROL r/m32,imm8  Rotate 32 bits r/m32 left imm8 times
D0 /1     ROR r/m8,1      Rotate 8 bits r/m8 right once
D2 /1     ROR r/m8,CL     Rotate 8 bits r/m8 right CL times
C0 /1 ib  ROR r/m8,imm8   Rotate 8 bits r/m16 right imm8 times
D1 /1     ROR r/m16,1     Rotate 16 bits r/m16 right once
D3 /1     ROR r/m16,CL    Rotate 16 bits r/m16 right CL times
C1 /1 ib  ROR r/m16,imm8  Rotate 16 bits r/m16 right imm8 times
D1 /1     ROR r/m32,1     Rotate 32 bits r/m32 right once
D3 /1     ROR r/m32,CL    Rotate 32 bits r/m32 right CL times
C1 /1 ib  ROR r/m32,imm8  Rotate 32 bits r/m32 right imm8 times

r/m8 =  指 8 bit 的 register (暂存器) 或 memory (内存)
r/m16 =  指 16 bit 的 register (暂存器) 或 memory (内存)
r/m32 =  指 32 bit 的 register (暂存器) 或 memory (内存)
imm8 =   指 8 bit immediate value (即时值) ,意思是任何 8 bit 的数字

汇编的 dword ptr指引 ROR 工作方式是 r/m32

例如说,你试用 VC 6 写以下的程序

#include <windows.h>
#include <stdio.h>

int main()
{
   DWORD var1;
   Var1 = 0x64636261;  // 64 63 62 61

   __asm ror var1, 7;

   printf( “%X\n” , var1 );

   return 0;
}

这里的 ror 指令,反汇编后得到
0040102F C1 4D FC 07          ror         dword ptr [ebp-4],7

VC6 知道 var1 是 DWORD 类型,所以编译时使用了 dword ptr 方式的机器码

如果我们不用 dword,改用 word 或 unsigned char ,我们会得到相关的指令。机器码本身已经指明了使用的方式,是  8 bit, 16 bit , 或 32 bit

如果我们使用 32 bit ror 对一个存放 word 的内存位置,对于 CPU 来说它会依然存取 4 个 byte (32 bit)
2005-1-21 19:22
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
谢谢riijj的帮助,我已经全部搞懂了!
2005-1-21 19:40
0
游客
登录 | 注册 方可回帖
返回
//