您的位置:首页 > 其它

【汇编】sar与shr的坑爹之旅。

2015-11-22 23:02 585 查看
一道简单逆向题目卡了我好久。。(主要还是汇编太渣。

是关于sar和shr的具体功能不熟悉导致的。

首先说下理论:

汇编语言中SAR和SHR指令都是右移指令,SAR是算数右移指令(shift arithmetic right),而SHR是逻辑右移指令(shift logical right)。

两者的区别在于SAR右移时保留操作数的符号,即用符号位来补足,而SHR右移时总是用0来补足。

例如10000000算数右移一位是11000000,而逻辑右移一位是01000000。

逆向题目的反汇编代码如下:

loc_8048400:
mov     ecx, eax
sar     ecx, 1Bh //就是这货
shl     eax, 5
xor     eax, ecx
movzx   ecx, byte ptr [edx]
add     edx, 1
xor     eax, ecx
cmp     edx, ebx
jnz     short loc_8048400


我一开始的python代码如下:

with open('1','r') as f:
xx = f.read()
i=890
for x in xx:
i=((i>>0x1b)^(i<<0x5 & 0xffffffff)^ ord(x))& 0xffffffff
print hex(i)
raw_input()


分析

之后通过gdb动态调试得到每次循环的值进行比对,才发现出现错误的具体原因。sar在符号位为1时,右移时填充1,符号位为0时填充0。

而python默认的右移运算为逻辑右移运算,右移时默认填充0,与符号位无关。

下面是我修改之后的python代码:

with open('1','r') as f:
xx = f.read()
i=890
l = []
l1 = []
for x in xx:
if(i&0x80000000):
i=((i>>0x1b | 0xffffffe0)^(i<<0x5 & 0xffffffff)^ ord(x))& 0xffffffff
else:
i=((i>>0x1b)^(i<<0x5 & 0xffffffff)^ ord(x))& 0xffffffff
l.append(i)
s = ''
for x in l:
s += hex(x).replace('0x','').replace('L','')+'\n'
with open('2','w') as f:
f.write(s)
print hex(i)
raw_input()


结果:0x7eeb184f

THE END
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: