Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 正确的EAX值和eiz是什么?_Assembly_X86_Gdb_Reverse Engineering_Ida - Fatal编程技术网

Assembly 正确的EAX值和eiz是什么?

Assembly 正确的EAX值和eiz是什么?,assembly,x86,gdb,reverse-engineering,ida,Assembly,X86,Gdb,Reverse Engineering,Ida,我正在进行CMU炸弹挑战,我被困在(第6阶段) 在使用GDB进行调试时,我无法理解两件事,请查看屏幕截图以清楚地显示 疑问1: 如您所见,当前要执行的指令是 mov eax,DWORD PTR [edx+ecx*1] 和寄存器中的值: EDX:0xc ECX:0x1 执行前:第一个屏幕截图 因此,在计算之后,移动的值应该是0xd,但是它是0x4,如下面的第二个屏幕截图所示 执行后:第二个屏幕截图 疑问2: 在上面的屏幕截图(标记为2)中,gdb显示的eiz是什么 IDA拆卸相同的2

我正在进行CMU炸弹挑战,我被困在(第6阶段)

在使用GDB进行调试时,我无法理解两件事,请查看屏幕截图以清楚地显示

疑问1: 如您所见,当前要执行的指令是

mov    eax,DWORD PTR [edx+ecx*1] 
和寄存器中的值:

EDX:0xc
ECX:0x1

执行前:第一个屏幕截图

因此,在计算之后,移动的值应该是0xd,但是它是0x4,如下面的第二个屏幕截图所示

执行后:第二个屏幕截图

疑问2: 在上面的屏幕截图(标记为2)中,gdb显示的eiz是什么

IDA拆卸相同的2个说明



更新: 在一些评论之后,虽然疑问2被澄清,但对寄存器寻址提出了一些基本疑问

疑问3: 假设:edx=0xffffd120和[edx]=2

mov    eax,DWORD PTR [edx+ecx*4]
上述表达式是否等效于:eax=[edx]+[ecx]*4(即2+3*4=0xd)

或者说:eax=[edx+ecx*4](即7)

i、 e.
0xffffd120+0xffffd130*4=0x4ffff15e0==>[0x4ffff15e0]

EIZ是一个伪寄存器。它只是计算为零。
lea-esi[esi*eiz*1+0x0]
实际上只是沿着NOP,它除了将esi加载到自身中之外什么都不做。出于性能原因,这种类型的NOP用于将循环顶部与16字节边界对齐。您会注意到,下一条指令位于一个地址上,该地址可被16整除(地址较低的4位为0)
mov-eax,DWORD-PTR[edx+ecx*1]
获取由
edx+ecx*1
指向的内存地址处的内容,并将32位值放入eax。第一步中的
ecx
0xffd130
,非
0x01
1
看起来是存储在该地址的内存中的值,但我更希望看到内存视图来确定哪些字节存储在内存中。我猜它显示了
dword
值。如果为1,
mov eax[edx+ecx*1]
将尝试从地址
0x0d
获取值,这将导致任何处于用户模式的现代操作系统由于内存访问无效而导致segfault(零附近的低地址禁止读取)。2完全独立的问题,但现在支持多个重复目标,我们可以照顾他们两个。(您显然认为,
mov-eax,[edx+ecx]
没有加载,而是加载了
eax=edx+ecx
)是的,确切地说,
[0xff1d30+0xc]
(edx+ecx)是从中读取值的内存地址,根据输出,该值恰好是4(加载到eax中)