起因
需求想要拷贝 这块内存+0x40的字符串,+0x3c是字符串长度。
这里的i
是内存起始地址,本意是想通过先修改内存步长转换为1,紧接着取 4个字节的数值,所以强转为(UINT32),获取其字符串长度,问题代码如下
调试分析
通过 x64dbg
进行调试,断点断在拷贝出现异常。
找到程序代码拷贝的地方,发现长度变为0x7FFFFFF6
,找到问题原因为什么会导致长度变为 7FFFFFF6
对 7FFFFFF6
进行左移运算,发现其结果为带了 F ,怎么会带上了符号!?
对汇编的分析,发现通过 movsx eax, byte ptr ds:[rbx+0x3C]
给长度赋值,但是我明明用得是uint 无符号类型进行赋值,应该不会用到movsx
,换了几个变量类型,发现一直都是有符号的。
最后细看了想了想,能出现问题也只有强转会发生问题。从新捋一遍强转的流程发现,之前的写法只取了一个字节,然后将这个字节强转为无符号的int类型。导致越界的产生。 修改后的代码如下
总结
1、看到movsx
如果代码定义是无符号类型的变量,可以推测是强转出现问题,优先去找哪里修改了变量类型
2、出现问题,千万别按照之前的思维去看问题,很容易就认为之前的写发是对的。