我正在尝试从https://challenges.re/2/解决逆向工程问题-这是挑战2,目标是获得对代码功能的最高理解。

<f>:
   0:          mov    eax,DWORD PTR [esp+0x4]
   4:          bswap  eax
   6:          mov    edx,eax
   8:          and    eax,0xf0f0f0f
   d:          and    edx,0xf0f0f0f0
  13:          shr    edx,0x4
  16:          shl    eax,0x4
  19:          or     eax,edx
  1b:          mov    edx,eax
  1d:          and    eax,0x33333333
  22:          and    edx,0xcccccccc
  28:          shr    edx,0x2
  2b:          shl    eax,0x2
  2e:          or     eax,edx
  30:          mov    edx,eax
  32:          and    eax,0x55555555
  37:          and    edx,0xaaaaaaaa
  3d:          add    eax,eax
  3f:          shr    edx,1
  41:          or     eax,edx
  43:          ret


这是我的解决方法,以注释方式。因为代码没有给我一个初始的起点,所以我假设初始值分配为12 34 56 78

图片-似乎是一些没有目的的随机数学运算,可能我错了。有什么作用?

评论

这可能只是编译器优化。在您看来,一个看起来很简单的公式看起来可能完全不同。例如2 * 8。与其将2移到一个寄存器中,然后将8移到另一个寄存器中,然后对这两个值执行多路运算,不如将一个值移到一个寄存器中,然后向左或向右移动它,但是不管有多少位都以相同的值结束。

@dsasmblr它是经过优化的,挑战作者将其写在他的页面上。我的想法是,没有优化,此代码是否有真正目的?

我认为您只是想得太多。此代码段可以表示任何内容,例如混淆/加密例程。否则它可能根本没有任何意义,而您需要了解的是该例程需要一个值,对其进行修改并返回修改后的值。如果您面临更高的挑战,我想也许作者希望您猜测这段代码在C语言中的样子,但是您将按照所指出的编译器研究编译器优化,等等。你做的就足够了。 =)

#1 楼

这是一个反转算法。我不确定操作示例中显示的数字是否正确。如果我以0x12345678(作为DWORD)或

0001 0010 0011 0100 0101 0110 0111 1000


开始(在MS VStudios内联汇编程序中),那么我将其位反转为0x1E6A2C48或br />
0001 1110 0110 1010 0010 1100 0100 1000


该算法看起来类似于Henry S. Warren Jr.第二版,第129页的“骇客喜悦”一书中的“广义位反转”(在我的pdf版本中),但未经验证。 Quote:

if (k & 1) x = (x & 0x55555555) << 1 | (x & 0xAAAAAAAA) >> 1;
if (k & 2) x = (x & 0x33333333) << 2 | (x & 0xCCCCCCCC) >> 2;
if (k & 4) x = (x & 0x0F0F0F0F) << 4 | (x & 0xF0F0F0F0) >> 4;
if (k & 8) x = (x & 0x00FF00FF) << 8 | (x & 0xFF00FF00) >> 8;
if (k & 16) x = (x & 0x0000FFFF) << 16 | (x & 0xFFFF0000) >> 16;
// The last two 'and' operations can be omitted.


评论


是!来源实际上来自:github.com/torvalds/linux/blob/…

–吉山
18年7月25日在1:16

#2 楼

如果您以12345678开头,则josh的and操作可能有错误
是正确的。

mov eax,DWORD PTR [esp+0x4]     eax =       12 34 56 78
bswap eax                       eax =       78 56 34 12
mov edx,eax                     edx = eax = 78 56 34 12
and eax,0x0f0f0f0f              eax =       08 06 04 02
and edx,0xf0f0f0f0              edx =       70 50 30 10
shr edx,0x4                     edx =       07 05 03 01
shl eax,0x4                     eax =       80 60 40 20
or eax,edx                      eax =       87 65 43 21
mov edx,eax                     edx =       87 65 43 21
and eax,0x33333333              eax =       03 21 03 21
and edx,0xcccccccc              edx =       84 44 40 00
shr edx,0x2                     edx =       21 11 10 00
shl eax,0x2                     eax =       0c 84 0c 84
or eax,edx                      eax =       2d 95 1c 84
mov edx,eax                     edx = eax = 2d 95 1c 84
and eax,0x55555555              eax =       05 15 14 04
and edx,0xaaaaaaaa              edx =       28 80 08 80
add eax,eax                     eax =       0a 2a 28 08
shr edx,1                       edx =       14 40 04 40
or eax,edx                      eax =       1e 6a 2c 48
ret