可爱又嘴硬的sydney

本文最后更新于:2023年5月11日 晚上

起因

起因是这样的,群里有个小伙伴问了一段汇编:

1
2
3
4
5
6
7
call dword ptr ds:[<&lstrcmpw>] ; 字面意思比较 2 个字符串,结果为小于返回负数,等于返回 0 ,大于返回正数
neg eax ; 对返回值 eax 寄存器取反,非 0 值会改变标志寄存器CF标志位的值为 1
sbb eax,eax ; eax 置 0 并减去CF的值
pop esi
inc eax ; eax 自增 1
pop ebp
ret ; 效果为当比较的两值相等 eax 为 1 ,不等 eax 为 0

问这里为什么要先 neg 然后又 sbb 然后又 inc ,刚好我之前学了点 X86 的知识,不行,我要装逼。但是我这种菜鸡咋知道为啥要这样要那样,我就想着让bing帮我梳理一下逻辑,试着从伟大的人工智能那里求得一条通往代码审计与逆向的殿堂的弯道。

过程

于是我先是问了bing这是干嘛的:
期待的询问
ok,先搞定一个问题,这是用来判断字符串是不是相等的。但后面的看着不对劲啊,因为她说如果eax为0或者正数,则结果为0。我全凭感觉到了不对劲,有猫腻!但我又看不懂,咋办!我就让她举个栗子:
想到=>相等
她举了2个例子,但还有第3种情况没举,啊,你小子,露出了马脚,于是我又问:
有点怀疑
这…她说-2-(-2)-1=0但是这时候我已经被她忽悠的瘸了,我就想着让她从新梳理一下。我从新理解,因为 sbb 的运算有标志位CF的参与,又因为非 0 值 neg 取反会改变标志位,所以我就想换个思路:
从新思考
我一看不对劲啊。好家伙,比较abcabc比较的值为1,abdabc比较的值也为1,这怎么判断啊。于是我又看了下第二段与第三段的差异,CF的值一致。减法,是减法。但是我要知道她是故意的还是不小心,于是我开始质问她:
明确怀疑
她否认并且给了一个正确的示例。我又问,她带入到刚刚的运算里面居然能算出一个一模一样的错误答案:
bing牛皮
她说她不想继续这个话题!!她不想。牛皮。

结语


可爱又嘴硬的sydney
https://shenysec.github.io/2023/05/10/可爱又嘴硬的sydney/
作者
sheny
发布于
2023年5月10日
更新于
2023年5月11日
许可协议