写过shellcode的都写过这样的语句
unsigned char shellcode[]={};
((void (*)())(&shellcode))();
((void (*)())(&shellcode))();
然而输出shellcode,&shellcode, &shellcode[0]它们的值却是一样的,但在这里为什么却只能用&shellcode?
如果将它们自身的值各自增一再输出你就会看到不同的结果,这是为什么?
现以windows 汇编为 例,汇编中要把一个地址所指向的内存的一个字节放到一个寄存器中会这样修饰一个地址
Mov al,byte ptr[x]
两个字节会这样
Mov ax,word ptr[x]
如果你用*shellcode,*(&shellcode),(&shellcode[0]同shellcode)去访问该地址存放的数据会得到不同的汇编语句,
如果数组shellcode占四个字节
*shellcode会被编译器 编译成byte ptr[shellcode]
*(&shellcode) 被编译成dword ptr[shellcode]
说了这么多为什么只能用&shellcode?
假设shellcode[0]=mov,shellcode[1]=eax,shellcode[2]=3;
因为如果把shellcode当作函数的地址,此函数只有一个字节的text―mov, cpu在执行此条指令时虽然能识别这是mov指令,但却找不到其源操作数和目地操作数,
而把&shellcode当作地址函数会有四个字节text―mov eax,3,CPU会正确执行此条指令,,,,,,
This is why ,,,,,,
This is why ,,,,,,