shellcode

1 篇文章 0 订阅
1 篇文章 0 订阅
写过shellcode的都写过这样的语句
unsigned char 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 ,,,,,,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值