【汇编】sar与shr的坑爹之旅。
2015-11-22 23:02
585 查看
一道简单逆向题目卡了我好久。。(主要还是汇编太渣。
是关于sar和shr的具体功能不熟悉导致的。
两者的区别在于SAR右移时保留操作数的符号,即用符号位来补足,而SHR右移时总是用0来补足。
例如10000000算数右移一位是11000000,而逻辑右移一位是01000000。
而python默认的右移运算为逻辑右移运算,右移时默认填充0,与符号位无关。
结果:0x7eeb184f
THE END
是关于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
相关文章推荐
- 【郝斌数据结构自学笔记】35-46_队列的定义、分类_链式队列伪算法的讲解_循环队列伪算法的讲解
- linux下firefox手工安装flash插件
- swift2.0 如何隐藏和设置状态栏
- WPF实现窗口最小化到托盘,并且实现右击菜单
- python装饰器
- Linux最常用20条命令
- web cache
- Android AIDL:跨进程调用Service (AIDL Service)
- Java单向(非可逆)加密--MD5、SHA和HMAC
- SpringMVC—Struts2拦截器学习网址整理
- 简易运算 (运用封装实现)
- 【转载】COM 组件设计与应用(二)——GUID 和 接口
- 实验一
- PHP7 RC7 Release对比PHP5.6快速排序20000数据性能体验以及新语法尝鲜
- 关于Redis的一些好玩东西
- nginx
- Sparse coding推导及Python编码
- applicationContext-common.xml 之spring tx:advice 和 aop:config 配置事务属性详解
- 机器学习笔记_逻辑回归
- arm-linux-gcc交叉工具安装配置