这部分ascii shellcode使用和指令(%...)将eax设置为零。在调试器和实践中,这个PIC代码一直在工作,但为什么呢? AND指令算法是:
Operand target ← Operand target ∩ Operande Source
flag CF ← 0
flag OF ← 0
如果先前的eax值不好,那么eax寄存器可能没有设置为零?
#include <stdlib.h>
int main()
{
asm("\
and eax, 0x454e4f4a;\
and eax, 0x3a313035;\
");
return 0;
}
编译行:
gcc -m32 -W -Wall -std=gnu99 -masm=intel -g eaxZero.c -o eaxZero
gdb指令:
(gdb) b 5
..
(gdb) r
..
(gdb) x/i $eip
..
(gdb) x/x $eax
..
(gdb) nexti
..
(gdb) x/x $eax
..
(gdb) nexti
..
(gdb) x/x $eax
..