RE4B Challenge 2
2017-10-18
Challenge
Link: https://challenges.re/2/
What does this code do?
Optimizing GCC 4.8.2 -m32
<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
Reslove
- x86下通过栈传递参数,返回值保存在eax中。
-
这个函数没有构建栈帧 - 直接使用esp获得参数
-
bswap: swap little endian and big endian
for example: eax = 0x11223344, after
bswap eax
, eax = 0x44332211this instruction work only on 32-bit data
这个函数是顺序执行的。主要进行各种计算操作,可以推断出参数为int类型。
-
0x4 ~ 0x1B
反序整个数字。eg: 0x12345678 -> 0x87654321
-
0x1D ~ 0x41
反序每一个字节的bit。eg: 10101010 -> 01010101
-
0x43
or指令已经将最终值保持在eax中。直接通过ret返回结果eax。
-
函数作用:将一个整数的bit反序排列
使用C重写和汇编是几乎等价的,还会更麻烦一些。所以没有列出C的代码。