Assembly 或者,XOR计算(XOR->;XOR->;或->;JNZ)
我正在尝试解决下面的代码(就像跳转不被接受一样),但我觉得这是一个陷阱Assembly 或者,XOR计算(XOR->;XOR->;或->;JNZ),assembly,xor,Assembly,Xor,我正在尝试解决下面的代码(就像跳转不被接受一样),但我觉得这是一个陷阱 XOR EDX,EDI (00268725,00000000) XOR EAX,ECX (AF51B153, user input) OR EDX, EAX (00268725,EAX) JNZ some address 这里的诀窍是什么。我试图将最后一个OR值设置为0,但如果我在最后一条指令中输入了将抵消为0的值,那么在上一条指令中显然会出错 EDI似乎总是00000000。(但我怀疑是否应该) EAX似乎总是
XOR EDX,EDI (00268725,00000000)
XOR EAX,ECX (AF51B153, user input)
OR EDX, EAX (00268725,EAX)
JNZ some address
这里的诀窍是什么。我试图将最后一个OR值设置为0,但如果我在最后一条指令中输入了将抵消为0的值,那么在上一条指令中显然会出错
- EDI似乎总是00000000。(但我怀疑是否应该)
- EAX似乎总是AF51B153
- EDX似乎总是为00268725
- 没有办法做到这一点。在您展示的代码中,将始终采用条件分支。为什么会这样?那么,让我们分析一下代码:
如果我读对了,右边的括号表示法指定了执行这行代码时
EDX
和EDI
寄存器中的值。如果它们确实都是常量,那么这条指令似乎毫无意义,为什么在运行时用两个常量值进行异或运算,而您可以在编译时执行此操作并将EDX
设置为结果
无论如何,00268725 XOR 0
=00268725
,因为任何数字XOR 0都是相同的数字。XOR的真值表如下所示:
| Input | Output |
| A | B | |
|-----|-----|--------|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
因此,执行此指令后,EDX
包含00268725
,这与您的观察结果一致
(当你说你怀疑EDI
是否应该包含0时,我不知道你是什么意思。要么寄存器包含定义的值,要么它接收到不可预测的输入值。在前一种情况下,你可以分析代码。在后一种情况下,你不能。)
这里,AF51B153
(在EAX
中)将与用户输入(在ECX
中)进行异或。由于用户输入不是一个常量值,我们无法预测结果会是什么,但一旦我们查看下一条指令,这并不重要
现在,第一条指令(在EDX
中)的结果与第二条指令(在EAX
中)的结果进行OR运算。以下是OR函数的真值表:
| Input | Output |
| A | B | |
|-----|-----|--------|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
因为我们知道EDX
的值是00268725
,所以EAX
的值是多少并不重要。没有可用于或00268725
获取0的值。从OR函数中获取0的唯一方法是使两个输入都为0,并且您知道EDX
始终为非零
因此,此指令(在EDX中)的结果始终为非零,因此将永远不会设置零标志(
ZF
)。这意味着JNZ
将永远占据分支。也许是我,但我不明白这个语法,你想实现什么?要使eax
等于0,将其与自身进行异或xor eax,eax
这是以jnz结尾的3条指令。所以xor 1,xor 2,最后是or,后面是jnz。我需要最后一个OR的结果为0。所以要从OR中得到0,两个输入都必须为0。因此edi=0
和eax=0
。要使eax
为零,它必须等于ecx
。如果只有“用户输入”可修改,则无法解决此问题。XOR EDX、EDI
将保持EDX
设置为00268725
00268725
或。感谢您用图表详细解释。这有助于我进一步了解为什么EDI总是0。这就是问题所在!。
XOR EAX,ECX (AF51B153, user input)
OR EDX, EAX (00268725,EAX)
| Input | Output |
| A | B | |
|-----|-----|--------|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |