如何验证 x86 命令的输出?
How can one validate output of x86 commands?
当执行 x86 命令时,我很难找出存储在特定寄存器中的适当地址和值。
我尝试使用分配给这两个寄存器的初始值来执行以下指令:
eax = 0x40000, ebx = 0x100000
下面,每行的左侧列出了执行的命令。然后,在每一行中,答案都包含地址的目标寄存器,最后是我想出的 value/address 。
每一个新行都会影响寄存器的后续值;例如在第一行 eax
更改了 ebx
的地址,因此 ebx
不再指向 0x100000 值:
mov [ebx], eax -> answer: [0x100000] 0x40000
lea esp, [ebx+eax*4] -> answer: esp [0x440000]
xor edx, edx -> answer: edx 0x00000
sub edx, eax -> answer: edx 0x40000
adc ebx, eax -> answer: ebx 0x80000
shl eax, 13 -> answer: eax 0x100000000
add ebx, eax -> answer: ebx 0x100040000
push ebx -> answer: esp 0x100040000
sar eax, 31 -> answer: eax 0x00000002
push eax -> answer: esp 0x00000002
mov eax, [esp+4] -> answer: eax 0x00000202
not eax -> answer: ecx 0x2
sub eax, [esp] -> answer: eax 0x200
我对以下命令有特殊问题:lea
、not
和 sar
,我不确定 xor
命令是否将寄存器设置为“0” ' 是否在 xor edx, edx
命令中。
如果您更正我的结果并解释棘手的问题,我将不胜感激parts/commands。
P.S。要查看 table 中的完整操作列表,请查看照片。
,这是最好的方法。
关于 LEA
的规范问答之一是 What's the purpose of the LEA instruction?。 (TL;DR:这是一条使用内存操作数语法和机器编码的移位加法指令)。
要检查其他指令的答案,只需 assemble 将该代码转换为可执行文件并在 gdb 中单步执行它,同时观察寄存器值的变化。见底x86 tag wiki.
顺便说一句,"command" 是描述 x86 指令的错误词。一些汇编语言显然使用 "command" 作为常用术语的一部分,但 x86 没有。
mov [ebx], eax -> answer: [0x100000] 0x40000
这不会更改 EAX
或 EBX
的值。只有 0x00100000 处的双字。
lea esp, [ebx+eax*4] -> answer: esp [0x440000]
这里执行的计算是EBX
加上4次EAX
。
0x00100000 + 0x00040000 * 4 = 0x00200000
xor edx, edx -> answer: edx 0x00000
正确。
sub edx, eax -> answer: edx 0x40000
从零中减去 0x00040000 会给你一个负面的结果。你写的是正数!
adc ebx, eax -> answer: ebx 0x80000
将 0x00040000 与 0x00100000 相加得出比该值更大的数字:0x00140000。
这不是一个太难的练习!只需考虑每个操作的作用(在手册中查找),然后进行数学计算。
当执行 x86 命令时,我很难找出存储在特定寄存器中的适当地址和值。
我尝试使用分配给这两个寄存器的初始值来执行以下指令:
eax = 0x40000, ebx = 0x100000
下面,每行的左侧列出了执行的命令。然后,在每一行中,答案都包含地址的目标寄存器,最后是我想出的 value/address 。
每一个新行都会影响寄存器的后续值;例如在第一行 eax
更改了 ebx
的地址,因此 ebx
不再指向 0x100000 值:
mov [ebx], eax -> answer: [0x100000] 0x40000
lea esp, [ebx+eax*4] -> answer: esp [0x440000]
xor edx, edx -> answer: edx 0x00000
sub edx, eax -> answer: edx 0x40000
adc ebx, eax -> answer: ebx 0x80000
shl eax, 13 -> answer: eax 0x100000000
add ebx, eax -> answer: ebx 0x100040000
push ebx -> answer: esp 0x100040000
sar eax, 31 -> answer: eax 0x00000002
push eax -> answer: esp 0x00000002
mov eax, [esp+4] -> answer: eax 0x00000202
not eax -> answer: ecx 0x2
sub eax, [esp] -> answer: eax 0x200
我对以下命令有特殊问题:lea
、not
和 sar
,我不确定 xor
命令是否将寄存器设置为“0” ' 是否在 xor edx, edx
命令中。
如果您更正我的结果并解释棘手的问题,我将不胜感激parts/commands。
P.S。要查看 table 中的完整操作列表,请查看照片。
关于 LEA
的规范问答之一是 What's the purpose of the LEA instruction?。 (TL;DR:这是一条使用内存操作数语法和机器编码的移位加法指令)。
要检查其他指令的答案,只需 assemble 将该代码转换为可执行文件并在 gdb 中单步执行它,同时观察寄存器值的变化。见底x86 tag wiki.
顺便说一句,"command" 是描述 x86 指令的错误词。一些汇编语言显然使用 "command" 作为常用术语的一部分,但 x86 没有。
mov [ebx], eax -> answer: [0x100000] 0x40000
这不会更改 EAX
或 EBX
的值。只有 0x00100000 处的双字。
lea esp, [ebx+eax*4] -> answer: esp [0x440000]
这里执行的计算是EBX
加上4次EAX
。
0x00100000 + 0x00040000 * 4 = 0x00200000
xor edx, edx -> answer: edx 0x00000
正确。
sub edx, eax -> answer: edx 0x40000
从零中减去 0x00040000 会给你一个负面的结果。你写的是正数!
adc ebx, eax -> answer: ebx 0x80000
将 0x00040000 与 0x00100000 相加得出比该值更大的数字:0x00140000。
这不是一个太难的练习!只需考虑每个操作的作用(在手册中查找),然后进行数学计算。