在 c 可执行文件中运行数据 shellcode

2023-12-03

我正在研究这个c 程序。我在 64 位 x64 linux 上用 gcc 编译它:

#include <stdio.h>

char buffer[]={0x90,0x90,0xC3};

int main(int argc, char *argv[])
{
    void (*fct)();
    fct=buffer;
    fct();
    return 0;
}

0x90 操作码为 NOP

0xC3操作码是RET

我想知道我应该做什么才能运行这个程序。运行时出现段错误...

Thanks


TL;DR编译用-z execstack为您的可执行文件启用 Linux 的 read-implies-exec 功能。尽管有这个名字,但它适用于all页,而不仅仅是堆栈。


该程序出现故障是因为buffer符号进入.data该部分依次与其他部分一起进入映射为读写的 ELF 段,但是不可执行.

为了使buffer可执行文件的最佳做法是创建一个带有 RWE 标志的新 ELF 段并为其分配一个新段,然后告诉 GCC 将buffer在这个新部分中。
这可以做到,原则使用以下链接器脚本:

PHDRS
{
        MYSEG PT_LOAD FLAGS (7);
}
SECTIONS
{
        MYSECT : { *(MYSECT) } : MYSEG
}

,更改源:

#include <stdio.h>

char buffer[] __attribute__ ((section ("MYSECT"))) ={0x90,0x90,0xC3};

int main(int argc, char *argv[])
{
    void (*fct)();
    fct=buffer;
    fct();
    return 0;
}

和编译通过-T切换到海湾合作委员会。

但是这个won't work.
GCC 使用基于命令行和-T开关完全取代它。
可以通过以下方式获取 GCC 使用的脚本-Wl,-verbose并更新它。

如果我们通过首先调用 GCC 来分割编译和链接-c然后 LD,我们只会得到一个片段,因为这就是我们放入链接器脚本中的内容 - 从而破坏了我们所有的努力only buffer唯一的可执行数据。


With -z execstack我们实际上只告诉 GCC 使用链接器脚本来设置GNU_STACKELF 段 RWE。
这是一个标记段(大小和 lma 为零),加载程序使用它来设置堆栈页的正确权限。
但实际上它是用作兼容性开关- 当堆栈设置为可执行文件时,加载程序将设置all将可写页作为可执行文件。

如果你正在玩 shellcode-z execstack会让这一切变得简单,但是它会让您的应用程序遭受大量攻击,但我想这就是您首先需要的。

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

在 c 可执行文件中运行数据 shellcode 的相关文章

  • 在LPC2148 ARM处理器上创建中断向量的汇编代码

    我最近刚刚开始使用 LPC2148 ARM 处理器 我试图理解一些有关创建中断向量的汇编代码 这是代码 Runtime Interrupt Vectors Vectors b start reset start ldr pc undf un
  • 与 SSE 比较 16 字节字符串

    我有 16 字节的 字符串 它们可能更短 但您可能会假设它们在末尾用零填充 但您可能不会假设它们是 16 字节对齐的 至少不总是 如何编写一个例程将它们与 SSE 内在函数进行比较 是否相等 我发现这个代码片段可能会有帮助 但我不确定它是否
  • 简单内核无法在 GRUB 中启动

    我正在学习一些操作系统开发的知识OSDev org http osdev org 我有一个内核 我正在尝试使用 qemu 在 GRUB Legacy 0 97 中启动 但是 当我输入kernel 200 9 我收到消息 Multiboot
  • Glassfish 上的内存管理

    我的 Glassfish 服务器上运行着几个后台任务 由 TimerService实例 这些服务的目标是从文件中提取数据并将该数据插入数据库 我最初尝试在 JPA 中执行此操作 但系统很容易就停滞了 我现在已将该过程转换为 JDBC 它的响
  • _addcarry_u64 和 _addcarryx_u64 与 MSVC 和 ICC

    MSVC 和 ICC 都支持内在函数 addcarry u64 and addcarryx u64 根据英特尔的内在指南 https software intel com sites landingpage IntrinsicsGuide
  • Visual Studio:如何正确构建和指定 x64 和 x86 的配置和平台

    使用 Visual Studio 2012 Professional 和 Ultimate 以及所有最新更新 如何正确指定配置和平台以正确构建 x86 和 x64 当您第一次创建 Winforms 应用程序时 Visual Studio 会
  • 内存映射图形输出

    我正在探索使用内存映射图形绘制像素和线条 我在 Windows 的 Textpad 中使用 TASM 当我单击 运行 时 整个屏幕变成蓝色 就是这样 没有绘制像素 model small stack data saveMode db xVa
  • __stack_chk_fail_local 和 -fno-stack-protector - 如何让它工作?

    Update 我刚刚发现问题出在我的项目 libxml2 中包含的预构建库上 它是在启用堆栈保护的情况下构建的 因此依赖于 stack chk fail local方法 我现在已经重建了该库 fno stack protector也是 一切
  • 在汇编中使用 printf 会导致管道传输时输出为空,但可以在终端上使用

    无输出 https stackoverflow com questions 54507957 printf call from assembly do not print to stdout即使在终端上 当输出不包含换行符时也有相同的原因
  • 查找用户输入中的第一个和最后一个大写字母

    输入将从 a z 或 A Z 中获取 并且输入以星号结束 我们需要将输入字符的第一个和最后一个大写字母作为输出 另外 我们应该显示每次输入的内容 注意 我们逐个字符地获取输入 而不是作为字符串 测试用例1 输入 aAbCcP 输出 AP 测
  • 在汇编中,指令指定数据类型吗?

    我是汇编语言编程 x86 的初学者 以下说法是否正确 在汇编中 BYTE WORD DWORD 等数据类型分别表示 8 位 16 位和 32 位模式 而不仅仅是整数 它们本身没有意义 它们只是位模式 使用它们的指令赋予了它们意义 汇编 代码
  • 将 1 字节立即值添加到 2 字节内存位置

    The add说明文档来 自这一页 http x86 renejeschke de html file module x86 id 5 html说如下 请注意我突出显示的两条说明 我在 NASM 中尝试了以下代码 符合第一个突出显示的指令
  • MFENCE/SFENCE/etc“序列化内存但不序列化指令执行”?

    英特尔系统编程指南第 8 3 节中有关 MFENCE SFENCE LFENCE 的说明 以下指令是内存排序指令 而不是序列化指令 这些指令会耗尽数据内存子系统 它们不序列化指令执行流 我试图弄清楚为什么这很重要 在多线程代码中 对内存的写
  • 使用非规范地址检索内存数据会导致 SIGSEGV 而不是 SIGBUS

    我无法使用以下汇编代码产生 总线错误 这里我使用的内存地址不是合法的 规范地址 那么 我怎样才能触发该错误呢 我在带有 NASM 2 14 02 的 Ubuntu 20 04 LTS 下运行这段代码 但它会导致负载出现 SIGSEGV 分段
  • 有人对 Apple iOS Remote 应用程序用于通过 IP 控制 Apple TV 的协议进行逆向工程吗?

    我很好奇我是否可以编写可以控制 Apple TV 的程序 特别是运行 tvOS 9 1 1 的 Apple TV 第四代 就像 Apple 的 iOS 远程应用程序一样 我想向它发送用于在四个基本方向上导航 选择屏幕上的项目 向上导航堆栈的
  • 函数地址不是实际代码地址

    在 Visual Studio 2008 C 中调试一些代码时 我注意到函数指针变量中的地址不是函数本身的实际地址 这是一个外部 C 函数 int main void printaddr const char print debug sho
  • x86 asm 的 NASM 语法中的括号是什么意思?

    给出以下代码 L1 db word 0 mov al L1 mov eax L1 括号里是什么意思 L1 代表 这个问题专门针对 NASM Intel 语法汇编的另一个主要风格是 MASM 风格 当不涉及寄存器时 括号的工作方式有所不同 S
  • 如何在数据部分(RAM)中保留一定范围的内存并防止同一应用程序使用该内存的堆/堆栈?

    我想在 RAM 中保留 分配一定范围的内存 并且同一应用程序不应覆盖或使用该范围的内存进行堆 堆栈存储 如何在内存中分配一定范围的内存以防止堆栈 堆覆盖 我考虑过向应用程序本身添加 或分配 一个数组并保留内存 但它被编译器优化了 因为它在应
  • 使用8086汇编语言画圆[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我试图使用 8086 汇编器画一个圆 我尝试利用中点圆算法 https en wikipedia org wiki Midpoin
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的

随机推荐

  • 从字符串中去除中文字符(vba)

    我正在使用 Microsoft Project VBA 将我的活动名称从英文翻译成中文 我的问题是我在一些英文活动名称中嵌入了一些中文翻译 我想在将字符串传递给 Microsoft Translator 之前去掉中文字符 关于我如何做到这一
  • Android ListView ArrayList 上的空指针异常

    我有一个显示数组列表内容的列表视图 我正在使用一个简单的适配器来实现这一点 就像这样 public static ArrayList
  • Docker 使用 Java 实现两个容器之间的通信

    有两个java文件 Server java和Client java 两者都在单独的容器中 码头工人文件 我用于服务器的 dockerfile 在名为 服务器 的文件夹中 是 FROM java 8 COPY Server java RUN
  • 会话过期后从数据库中删除它吗?

    这可能是一个愚蠢的问题 但我想知道每 15 分钟从数据库中删除所有过期的 会话 是否是一个好主意 或者只是把它留在那里 会话在 X 分钟后过期 不再有用 似乎只是占用空间 当我的团队在 NET 应用程序中部署 SQL Server 会话状态
  • 使用 NSGlyph 和内存分配

    在跟踪换行符的方法中频繁地 for a NSTextView visibleRect 我正在分配内存NSGlyph to use NS布局管理器 getGlyphs range 我应该 可以找出这应该有多少内存 因为我有范围的参考 不影响布
  • FindAll 包含涉及复杂的多对多关系 (sequelizejs)

    这有软件工程 SE 中的一个兄弟问题 考虑Company Product and Person 之间存在多对多的关系Company and Product 通过联结表Company Product 因为给定的公司可能生产不止一种产品 例如
  • init_fs_encoding:无法获取文件系统编码的Python编解码器

    我正在 apache 上运行 Django 网站 这是我的尾巴httpd conf file ServerName 127 0 0 1 8080 Django Project LoadFile c python39 python39 dll
  • 在 Linux 上使用可滚动 x(时间/水平)轴绘制数据

    我想绘制 x 轴较长的数据 如果我绘制整个 x 轴 那么绘图就会缩小并且几乎无法读取 我发现了this回答 SO 指向下列的scipy matplotlib 代码 但是当我尝试运行上述代码时 出现以下错误 Traceback most re
  • Java-不透明颜色

    我正在尝试画一些线 问题在于颜色 例如 我有几条红色线 然后我画了一条蓝色线 或相反 有时 对于最后一个来说 那条线更多 是不透明的 我尝试制作新颜色并使用 alpha 复合 0 7 设置颜色 对于更多线条 我保留默认的一种颜色 不透明 a
  • 如何使用 iOS 获取 UIKeyboard 大小

    有没有办法以编程方式获取 UIKeyboard 大小 横向高度为 216 0f 高度为 162 0f 以下似乎已被弃用 有没有某种方法可以在 3 0 iPhone OS SDK 和 4 0 iPhone OS SDK 中没有任何警告的情况下
  • 在Python中动态定义/更新ctypes结构

    我已经在 ctypes 中创建了子结构和结构 如下所示 我在结构内部定义了具有某种预定义大小的子结构数组 根据要求SIZE可以设置为0最初 可能会根据用户输入而变化 from ctypes import class MySubStructu
  • 使用回调将 C 库 (GSL) 包装在 cython 代码中

    我是新手cython and c 我想使用 cython 来加快代码的性能 我想用gsl integration我的代码中的库用于集成 更新 test gsl pyx cdef extern from math h double log d
  • 如何在Android中每分钟获取gps坐标?

    我想每分钟获取我的坐标 即使用户没有移动 所以我使用 requestLocationUpdates 和以下参数 locMgr requestLocationUpdates LocationManager GPS PROVIDER 60000
  • NSMutableArray 内的块泄漏 (ARC)

    我有一些在块内的操作 此操作 仅更新一个UIImage像这样 UIImage image self myImage image 我的图像是通过访问互联网来计算的NSURLConnection 当我从互联网上收到图像时 我称该块为NSMuta
  • 如何优化在 postgresql 中查询这些数据?

    我的查询对于特定行来说速度很慢 Postgres 选择做一个Seq Scan而不是使用Index Scan对于某些行 我认为是因为它实际上比使用索引更快 以下是针对正常工作负载使用索引的查询计划 http explain depesz co
  • 高效构建FEM/FVM矩阵

    这是 FEM FVM 方程系统的典型用例 因此可能会引起更广泛的兴趣 从三角形网格 la 我想创建一个scipy sparse csr matrix 矩阵行 列表示网格节点处的值 该矩阵在主对角线上以及两个节点通过边连接的地方都有条目 这是
  • 本地化 MPMoviePlayerViewController 的“完成”按钮

    我正在使用 MPMoviePlayerViewController 来呈现视频 一切都按预期工作 但如果我将设备的语言切换为例如德语 完成 按钮未本地化 我尝试访问该按钮并将其设置为我自己的按钮实现 如下所示 MPMoviePlayerVi
  • 使 openGL 线连接起来

    现在我创建了一个多边形 然后我做了同样的事情 但使用 line loop 来绘制轮廓 我现在的问题是 如果我将线条粗细设置为高 则线条不会连接 它们的末端需要更长 线宽 有没有办法解决这个问题 Thanks glMatrixMode GL
  • Rails 条件验证

    所以我这里有两个模型 class Screen lt ActiveRecord Base belongs to user validates screen size numericality gt less than or equal to
  • 在 c 可执行文件中运行数据 shellcode

    我正在研究这个c 程序 我在 64 位 x64 linux 上用 gcc 编译它 include