x86_64 执行 Shellcode 失败:

2024-01-20

我在 64 位 Linux 上使用 Python 2.7。我有以下 Python 脚本,应该执行一个简单的 Hello World shellcode。

import urllib2
import ctypes

shellcode = "\xb8\x01\x00\x00\x00\xbf\x01\x00\x00\x00\x48\xbe\xd8\x00\x60\x00\x00\x00\x00\xba\x0e\x00\x00\x00\x0f\x05\xb8\x3c\x00\x00\x00\xbf\x00\x00\x00\x00\x0f\x05"


#Create buffer in memory
shellcode_buffer = ctypes.create_string_buffer(shellcode, len(shellcode))

#Funktionszeiger
shellcode_func  = ctypes.cast(shellcode_buffer, ctypes.CFUNCTYPE(ctypes.c_void_p))

#Shellcode execute
shellcode_func()

如果我跑python Scriptname.py我收到内存访问错误。这里有人知道为什么我的脚本不起作用吗?

编辑: 原始 ASM 代码:

section .data
    text db "Hello",10

section .text
    global _start

_start:
    ;syscall sys_write(1, text, 14)
    mov rax, 1
    mov rdi, 1
    mov rsi, text
    mov rdx, 14
    syscall

    ;syscall sys_exit(0)
    mov rax, 60
    mov rdi, 0
    syscall

您将需要 python 代码来使您的 shellcode 在具有读/写/执行权限的内存位置中运行。因为你的 shell 代码运行的内存不在可执行内存中。您可以创建一个函数来为您执行此操作(testshellcode.py):

import ctypes, mmap, sys

# Convert string to bytes object. Differs between Python2 and Python3
if sys.version_info >= (3, 0):
    def b(string, charset='latin-1'):
        if isinstance(string, bytes) and not isinstance(string, str):
            return (string)
        else:
            return bytes(string, charset)
else:
    def b(string):
        return bytes(string)

def create_shellcode_function (shellcode_str):
    shellcode_bytes = b(shellcode_str)

    # Allocate memory with a RWX private anonymous mmap
    exec_mem = mmap.mmap(-1, len(shellcode_bytes),
                         prot = mmap.PROT_READ | mmap.PROT_WRITE | mmap.PROT_EXEC,
                         flags = mmap.MAP_ANONYMOUS | mmap.MAP_PRIVATE)

    # Copy shellcode from bytes object to executable memory
    exec_mem.write(shellcode_bytes)

    # Cast the memory to a C function object
    ctypes_buffer = ctypes.c_int.from_buffer(exec_mem)
    function = ctypes.CFUNCTYPE( ctypes.c_int64 )(ctypes.addressof(ctypes_buffer))
    function._avoid_gc_for_mmap = exec_mem

    # Return pointer to shell code function in executable memory
    return function

# linux machine code
shellcode = "shell code string here"

# Create a pointer to our shell code and execute it with no parameters
create_shellcode_function(shellcode)()

该代码应适用于 Python2.7+ 和 Python3


即使您将 shell 代码字符串插入到上面测试程序中的字节对象中,它也会失败。您的 shell 代码字符串似乎缺少字符串本身(hello);似乎没有正确编码,并且您依赖于静态内存位置text标签。您将需要一个与位置无关的地址。

要修复代码使其与位置无关,您可以使用 RIP 相对寻址。将字符串放入.text在代码部分之后并忘记.data共。这个版本应该足够了(shellcode.asm):

section .text
    global _start

_start:
    ;syscall sys_write(1, text, text_len)
    mov rax, 1
    mov rdi, 1
    lea rsi, [rel text]     ; RIP Relative addressing for Position independent code
    mov rdx, text_len       ; text length computed by assembler
    syscall

    ;syscall sys_exit(0)
    mov rax, 60
    mov rdi, 0
    syscall

    text db "Hello",10
text_len EQU $-text         ; Rather than hard coding length compute text length

使用 OBJDUMP 将 shell 代码程序转换为 shell 代码字符串可能会出现问题。我写了一个堆栈溢出答案 https://stackoverflow.com/a/48109240/3857942讨论 OBJDUMP 方法的一些缺陷。如果您要创建一个可执行文件来独立测试您的 shell 代码,那么最好将其汇编并链接到可执行文件;使用 OBJCOPY 将可执行文件转换为二进制文件,然后使用某些东西(如 HEXDUMP)将二进制文件转换为 shell 代码字符串。以下命令应该有效:

nasm -f elf64 shellcode.asm -o shellcode.o 
ld shellcode.o -o shellcode
objcopy -O binary shellcode shellcode.bin

如果您运行独立的二进制文件shellcode它应该输出:

Hello

然后您可以转换shellcode.bin到 shell 代码字符串:

hexdump -v -e '"\\""x" 1/1 "%02x" ""' shellcode.bin

输出看起来像这样:

\xb8\x01\x00\x00\x00\xbf\x01\x00\x00\x00\x48\x8d\x35\x13\x00\x00\x00\xba\x06\x00\x00\x00\x0f\x05\xb8 \x3c\x00\x00\x00\xbf\x00\x00\x00\x00\x0f\x05\x48\x65\x6c\x6c\x6f\x0a

然后您可以在上面的 python 程序中插入这个 shell 代码字符串(testshellcode.py) 替换shell代码字符串在这里与上面的字符串。您可以使用以下命令运行上面的脚本:

python testshellcode.py

输出应该是:

Hello


这是更高级的,并且有 shell 代码教程,解释了许多要避免的技巧\x00字符串中的字节。

通常,对于 shell 代码,您希望消除 NUL (\x00) 字节用于真正的字符串漏洞利用。一个版本shellcode.asm这可能看起来像这样:

section .text
    global _start

_start:
    jmp afterdata
    text db "Hello",10
text_len EQU $-text

afterdata:
    ;syscall sys_write(1, text, text_len)
    xor eax, eax
    inc eax
    mov edi, eax
    lea rsi, [rel text]
    xor edx, edx
    mov dl, text_len
    syscall

    ;syscall sys_exit(0)
    xor eax, eax
    mov al, 60
    xor edi, edi
    syscall

如果您使用前面提到的命令创建 shell 代码字符串,HEXDUMP 应该生成如下内容:

\xeb\x06\x48\x65\x6c\x6c\x6f\x0a\x31\xc0\xff\xc0\x89\xc7\x48\x8d\x35\xed\xff\xff\xff\x31\xd2\xb2\x06 \x0f\x05\x31\xc0\xb0\x3c\x31\xff\x0f\x05

此版本与您的代码执行相同的操作,但请注意没有\x00字符串中的字节。运行时,它也应该打印:

Hello

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

x86_64 执行 Shellcode 失败: 的相关文章

  • 如何使用 eval dataframe 方法在自定义函数中返回 numpy 数组或列表?

    我正在使用 python 3 X 我正在尝试使用eval https pandas pydata org pandas docs stable generated pandas eval html pandas eval数据框方法 包括这样
  • 为什么 LED 保持亮起而不是闪烁?

    这是使用 pic16f676 中的 TIMER0 中断使 LED 闪烁的 MPASM 代码 端口 A 的引脚 0 RA0 未切换至关闭位置 请帮忙 我是图片组装的新手 我想掌握图片 有没有高手帮我学习一下 我需要以 1 秒的间隔眨眼 代码是
  • Python bash 管道

    我想将 python 脚本的输出通过管道传输到 bash 脚本 到目前为止我所做的是尝试使用os popen sys subprocess 并试图给出一个管道的例子 os popen echo P 1 1 591336 4927369 1
  • 给定一个正整数 n,如何打印高度为 n-1 的数字三角形?

    HackerRank 三角任务 https www hackerrank com challenges python quest 1 problem 仅使用算术运算 单个for loop 和一个单一的print陈述 不允许进行字符串操作 约
  • 倒计时:01:05

    如何在 Python 中创建一个看起来像 00 00 分钟和秒 的倒计时时钟 它独立成一行 每次减少一actual秒 则应将旧计时器替换为低一秒的新计时器 01 00变成00 59它实际上击中了00 00 这是我开始使用但想要改造的基本计时
  • 为什么我的查询在参数化后会中断?

    我有 2 张桌子 Sales and Product Sales可以将产品存储为Idn or Name 传统设计 和Type列指定实际type与之相关 Product等是连接的子集表into这个表来获取真实的数据 在这个例子中 Produc
  • 具有动态特性的 Python 嵌套作用域

    需要帮助理解以下句子PEP 227 http www python org dev peps pep 0227 和Python 语言参考 http docs python org reference executionmodel html
  • 提高mysql导入速度[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我有一个很大的数据库22GB 我曾经用过进行备份mysqldumpgzip 格式的命令 当我提取 gz 文件时 它会生成 sql文件的
  • Python 删除额外的特殊 unicode 字符

    我正在 python 中处理一些文本 它内部已经采用 unicode 格式 但我想删除一些特殊字符并用更标准的版本替换它们 我目前有一条看起来像这样的线路 但它变得越来越复杂 我发现它最终会带来更多麻烦 tmp infile lower r
  • Python NameError,变量“未定义”

    它返回的错误是 NameError name lives is not defined 我知道代码并不是尽可能高效 这是我的第一个项目 但是无论我尝试做什么 都会弹出这个错误 我尝试为其创建一个全局变量 但这没有帮助 我真的很感激一些帮助
  • TensorFlow 运算符重载

    有什么区别 tf add x y and x y 在 TensorFlow 中 当您使用以下命令构建图表时 您的计算图表会有什么不同 代替tf add 更一般地说 有 或者其他张量超载的操作 如果至少有一个x or y is a tf Te
  • MAMP Python-MySQLdb 问题:调用 Python 文件后 libssl.1.0.0.dylib 的路径发生变化

    我正在尝试使用 python MySQLdb 访问 MAMP 服务器上的 MySQL 数据库 当我最初尝试使用 python sql 调用 Python 文件来访问 MAMP 上的数据库时 我得到了image not found关于错误li
  • 转置 pandas 数据框

    如何将列表列表转换为 panda 数据框 它不是以列的形式 而是以行的形式 usr bin env python from random import randrange import pandas data randrange 0 100
  • 找出段落中出现的单词

    sentence Alice was not a bit hurt and she jumped up on to her feet in a moment words Alice jumped played 我可以使用filterpyth
  • 熊猫:SettingWithCopyWarning:[重复]

    这个问题在这里已经有答案了 我尝试使用以下代码将列转换为 日期 df DATE pd to datetime df DATE or df DATE pd to datetime df DATE 但我收到以下错误 Users xyz anac
  • Python Pandas 系列失败日期时间

    我认为这一定是 pandas 的失败 有一个 pandas 系列 v 18 1 和 19 如果我为该系列分配一个日期 第一次将其添加为 int 错误 第二次将其添加为 int 错误 添加为日期时间 正确 我无法理解原因 例如使用以下代码 i
  • 如何在google colaboratory上使用GPU升级tensorflow

    目前google colaboratory使用tensorflow 1 4 1 我想升级到1 5 0版本 每次当我执行时 pip install upgrade tensorflow命令 notebook实例成功将tensorflow版本升
  • Python - 使用 BeautifulSoup 从 URL 列表中抓取文本的最简单方法

    使用 BeautifulSoup 从几个网页 使用 URL 列表 中抓取文本的最简单方法是什么 有可能吗 最好的 乔治娜 import urllib2 import BeautifulSoup import re Newlines re c
  • 从多个 .csv 文件创建混淆矩阵

    我有很多具有以下格式的 csv 文件 338 800 338 550 339 670 340 600 327 500 301 430 299 350 284 339 284 338 283 335 283 330 283 310 282 3
  • 使用和不使用 SciPy 计算 k 组合的数量

    我对这个函数感到困惑combSciPy 的 http docs scipy org doc scipy 0 14 0 reference generated scipy misc comb html看起来比简单的 Python 实现要慢 这

随机推荐

  • 继承对象的 XML 反序列化

    我有一个对象InputFile它有数组和对象来保存文件的内容 我也有ABCFile and XYZFile两者都继承自InputFile它将读取不同类型的文件并将它们存储到的投影成员中InputFile 由于这两个对象的序列化和反序列化与父
  • Flutter Web 中的分段文件上传

    有没有办法将文件分段上传到 Flutter Web 原生的服务器 因为 Flutter iOS 和 Android 有很多方法可以做到这一点 对于 Android IOS 我们使用 multiPFile await MultipartFil
  • 无法使用 AKS 和 ACR 提取新映像

    我突然在使用 AKS 从 Azure 容器注册表中提取最新映像时遇到问题 之前工作正常 If I run kubectl describe pod
  • CodeIgniter htaccess 修改为半 https 且无 www 版本

    htaccess 修改与核心 PHP 中不同 因此 经过一番搜索 我得到了以下代码 在那之前 我的要求是我的项目的标准 整个网站严禁使用 www 即直接重定向到非 www 版本 HTTPS 适用于某些页面 结帐 登录页面 其他页面严格采用
  • Android 自定义对话框的昏暗背景

    正如标题所示 我似乎无法调暗我制作的自定义对话框的背景 网上无数的解决方案都提到了下面第一个片段中的最后 3 行代码 这对对话框的 UI 没有影响 请看下面的代码 Dialog dialog new Dialog MainActivity
  • iOS SDK中逐行读取文件

    我有一个文本文件如下 line1 line2 line3 line4 line5 我想从文件读入两个字符串数组 以便line1 line3 line 5 进入array1 and line 2 line 4 line 6 进入array2
  • 将 ISO 8601 日期时间字符串反序列化为 C# DateTime

    我正在尝试使用 JsonConvert DeserializeObject
  • 按钮动画像ios游戏中心按钮

    我正在尝试让我的按钮像 ios 游戏中心中的按钮一样具有动画效果 它们似乎像气泡一样在屏幕上摇摆和漂浮 我尝试过在屏幕上随机移动按钮 使它们同时以恒定的圆形路径移动 但效果不一样 我需要一种摇摆效果 任何想法表示赞赏 结合几个CAKeyfr
  • Scenebuilder 2.0 中的自定义组件

    在 Scenebuilder 1 1 中 您可以将整个自定义组件作为一个整体导入 然而 在 2 0 中 它将组件作为单独的部分 容器和节点 导入 由于我的自定义组件依赖于与其控制器和 ID 的统一工作 因此这会破坏它 到目前为止我能做些什么
  • 动态编译依赖于特定类加载器加载的类的java代码

    我们有能力即时动态编译 Java 代码 我至少知道Java 运行时编译器 https github com OpenHFT Java Runtime Compiler and 内存Java编译器 https github com trung
  • WCErrorCodeDeliveryFailed:无法交付有效负载

    我正在开发一款在 iPhone 和 Apple Watch 之间共享数据的应用程序 使用WCSession方法sendMessage replyHandler errorHandler 实施该方法后 我收到如下错误 WCSession on
  • GitHub SSH 密钥声称未使用

    为什么 在我的 GitHub 帐户上的 设置 gt SSH 密钥 下 它显示 由 GitHub for Mac 于 2014 年 10 月 24 日添加 从未使用过 没用过 我用过 我的个人资料中显示了很多贡献 从that机器 我还有另一把
  • Android:使用 onTouchListener() 循环执行线程

    您好 我的应用程序中有 8 个按钮 每个按钮都配置为 onclickListener 当单击该按钮时 字符串将写入套接字 现在我希望当我按住按钮时 字符串必须循环写入 这就是我正在尝试做的事情 bLeft setOnTouchListene
  • 在 Ubuntu 上安装 Java 7

    Note 这个问题是在 Oracle 将 OpenJDK 作为 Oracle JDK 的免费版本之前提出的 历史答案反映了这一点 从 2022 年起 您不应使用 Java 7 除非您必须使用无法在 OpenJDK 8 上运行的项目 为了安装
  • ELK 未将元数据从 filebeat 传递到 Logstash

    通过以下方式安装 ELK 服务器 https www digitalocean com community tutorials how to install elasticsearch logstash and kibana elk sta
  • R 编程:从数据框中查找所有因子

    我正在尝试获取数据框列的类类型 我正在做的是 sapply mydata class 但现在 我只想找到那些作为因素的列名 我尝试了以下方法 sapply data is factor 但它给了我 ResponseFlag Gender M
  • ANTLR 隐式乘法

    我是 ANTLR 的新手 我正在尝试扩展所提供的简单计算器的示例here https stackoverflow com a 1932664 具体来说 我尝试添加一些简单的函数 负数等 以熟悉 ANTLR 然而 我在尝试实现 隐式 乘法时遇
  • 如何收集与输入函数匹配通配符的Snakemake输入文件?

    我有一组使用 BWA MEM 生成并使用 GATK IndelRealigner 等进一步处理的 BAM 文件 我正在以较小的块对 BAM 文件进行预处理 以加快处理速度 然而 我必须在变体调用之前将这些单独的文件合并到一个 BAM 文件中
  • 为什么我不能从互斥锁中可变地借用单独的字段? [复制]

    这个问题在这里已经有答案了 尝试通过以下方式获取对单独字段的可变引用MutexGuard struct MyObject pub a i32 pub b i32 fn func 1 mtx Mutex
  • x86_64 执行 Shellcode 失败:

    我在 64 位 Linux 上使用 Python 2 7 我有以下 Python 脚本 应该执行一个简单的 Hello World shellcode import urllib2 import ctypes shellcode xb8 x