在堆栈上为 execve 创建一个 arg 数组

2024-04-02

我想编写一个汇编程序,通过 EXECVE(系统调用 #0x3C)使用开关 -al 执行程序 /bin/ls。

手册页 (man 2 execve) 指出该调用需要三个值:

int execve(const char *filename, char *const argv[], char *const envp[]);

我不太明白如何建立这三个论点。据我所知,第一个论点是RDI,第二个进入RSI,第三个进入RDX。我相信要设置第一个,就足够了

    push 0x736c2f2f         ;sl//
    push 0x6e69622f         ;nib/
    mov rdi, rsp

对于第三个,事情很简单:

    xor r11, r11
    mov rdx, r11

我的问题是我不知道如何构建第二个参数,它应该是一个包含['/bin//ls', '-aal']

我需要为 x86-64 编写它,所以请不要int 0x80建议。


你可以把argv数组入栈并将其地址加载到rsi。第一个成员是argv是指向程序名称的指针,因此我们可以使用加载到的相同地址rdi.

xor edx, edx        ; Load NULL to be used both as the third
                    ; parameter to execve as well as
                    ; to push 0 onto the stack later.
push "-aal"         ; Put second argument string onto the stack.
mov rax, rsp        ; Load the address of the second argument.
mov rcx, "/bin//ls" ; Load the file name string
push rdx            ; and place a null character
push rcx            ; and the string onto the stack.
mov rdi, rsp        ; Load the address of "/bin//ls". This is
                    ; used as both the first member of argv
                    ; and as the first parameter to execve.

; Now create argv.
push rdx            ; argv must be terminated by a NULL pointer.
push rax            ; Second arg is a pointer to "-aal".
push rdi            ; First arg is a pointer to "/bin//ls"
mov rsi, rsp        ; Load the address of argv into the second
                    ; parameter to execve.

这还纠正了问题中代码的其他一些问题。它使用 8 字节推送作为文件名,因为 x86-64 不支持 4 字节推送,并且它确保文件名具有空终止符。

此代码确实使用带有 4 字节立即数的 64 位推送来推送“-aal”,因为该字符串适合 4 个字节。这也使得它以空终止,而无需在代码中使用空字节。

我使用了带有双字符的字符串,因为它们在问题中是为了避免代码中出现空字节,但我的偏好是这样的:

mov ecx, "X-al"     ; Load second argument string,
shr ecx, 8          ; shift out the dummy character,
push rcx            ; and write the string to the stack.
mov rax, rsp        ; Load the address of the second argument.
mov rcx, "X/bin/ls" ; Load file name string,
shr rcx, 8          ; shift out the dummy character,
push rcx            ; and write the string onto the stack.

请注意,文件名字符串通过移位获得空终止符,从而避免了额外的推送。此模式适用于双字符不起作用的字符串,并且也可以用于较短的字符串。

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

在堆栈上为 execve 创建一个 arg 数组 的相关文章

  • NASM 轮班操作员

    您将如何在寄存器上进行 NASM 中的位移位 我读了手册 它似乎只提到了这些操作员 gt gt lt lt 当我尝试使用它们时 NASM 抱怨移位运算符处理标量值 您能解释什么是标量值并举例说明如何使用 gt gt and lt lt 另外
  • g++.exe 和 x86_64-w64-mingw32-g++.exe 有什么区别?

    同样的问题也适用于 gcc ar 等 在 Code Blocks 中将工具链可执行文件从 Something exe 更改为 x86 64 w64 mingw32 something exe 时 代码仍然可以完美编译 此外 32 位和 64
  • 汇编基础知识:输出寄存器值

    我刚刚开始学习汇编语言 我已经陷入了 在屏幕上显示存储在寄存器中的十进制值 的部分 我使用 emu8086 任何帮助将不胜感激 model small Specifies the memory model used for program
  • 尝试使用 x86 程序集 GNU GAS 在数组索引处赋值时出现错误

    我在用x86GNU 与 GCC 的程序集 并尝试实现相当于以下内容的程序集c c int x 10 x 0 5 但是 当我尝试运行 使用命令 a out 我的汇编代码如下 第一次编译后gcc filename s 错误Segmentatio
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • Nasm 打印到下一行

    我用 nasm Assembly 编写了以下程序 section text global start start Input variables mov edx inLen mov ecx inMsg mov ebx 1 mov eax 4
  • 从 NASM 调用 C 函数 _printf 会导致分段错误

    我一直在尝试使用 NASM 在 Mac OS 和 Windows 上学习 64 位汇编 我的代码是 extern printf section data msg db Hello World 10 0 section text global
  • 大会,你好世界问题

    我正在 Linux 上学习 asm noobuntu 10 04 我得到了以下代码 http asm sourceforge net intro hello html http asm sourceforge net intro hello
  • 如何在 Linux x86_64 上模拟 iret

    我正在编写一个基于 Intel VT 的调试器 由于当 NMI Exiting 1 时 iret 指令在 vmx guest 中的性能发生了变化 所以我应该自己处理vmx主机中的NMI 否则 guest会出现nmi可重入错误 我查了英特尔手
  • 程序集比较标志理解

    我正在努力理解汇编程序中的以下代码片段 if EAX gt 5 EBX 1 else EBX 2 在汇编程序中 可以写如下 根据我的书 模拟jge操作说明 https www felixcloutier com x86 jcc您通常会使用
  • 如何将输入传递到扩展汇编中?

    考虑这段代码 来自我的先前的问题 https stackoverflow com questions 37955538 segfault on movq instruction int main asm movq 100000000 rcx
  • 如何使用movntdqa避免缓存污染?

    我正在尝试编写一个 memcpy 函数 该函数不会将源内存加载到 CPU 缓存中 目的是避免缓存污染 下面的 memcpy 函数可以工作 但会像标准 memcpy 一样污染缓存 我正在使用带有 Visual C 2008 Express 的
  • MikeOS 引导加载程序中的堆栈段

    我不明白这段代码 mov ax 07C0h Set up 4K of stack space above buffer add ax 544 8k buffer 512 paragraphs 32 paragraphs loader cli
  • 如何编译GCC生成的asm?

    我正在玩一些汇编代码 有些事情困扰着我 我编译这个 include
  • 为什么 FMA _mm256_fmadd_pd() 内在函数有 3 个 asm 助记符:“vfmadd132pd”、“231”和“213”?

    有人可以向我解释一下为什么融合乘法累加指令有 3 种变体 vfmadd132pd vfmadd231pd and vfmadd213pd 而只有一个 C 内在函数 mm256 fmadd pd 为了简单起见 在 AT T 语法中 有什么区别
  • 为什么我的代码显示垃圾?

    当我也想打印列表中的每个数字时 我的代码显示垃圾 有什么问题吗 输出应如下所示 给定的数组是 2G 4 PT为什么这是垃圾总数是 7 Code ASSUME CS CODE DS DATA SS STK ORG 0000H DATA SEG
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • NASM 中的 equ 和 db 有什么区别?

    len equ 2 len db 2 它们是否相同 产生可以用来代替的标签2 如果不是 那么每种申报表的优点或缺点是什么 它们可以互换使用吗 第一个是equate 与 C 类似 define len 2 因为它实际上并没有在最终代码中分配任
  • 为什么X86中没有NAND、NOR和XNOR指令?

    它们是您可以在计算机上执行的最简单的 指令 之一 它们是我亲自实施的第一个指令 执行 NOT AND x y 会使执行时间和依赖链长度和代码大小加倍 BMI1 引入了 andnot 这是一个有意义的补充 是一个独特的操作 为什么不是这个问题
  • 汇编器8086将32位数字除以16位数字

    我尝试将 32 位数字除以 16 位数字 例如 10000000h 除以 2000h 根据我尝试做的设计除以 右 4 位数字除以除数 然后左 4 位数字除以除数 这是我的代码 DATA num dd 10000000h divisor dw

随机推荐

  • 如何防止 Map 中的 null 值和 bean 中的 null 字段通过 Jackson 序列化

    我有一个Map
  • UserDetailsChecker 实现覆盖 isAccountNotLocked 方法

    我正在使用 UserDetails 实现进行身份验证 其中有方法 Override public boolean isAccountNonExpired return true Override public boolean isAccou
  • 泛型友好的类型处理程序映射

    我正在尝试创建一个返回特定类型的处理程序的 注册表 public class HandlerRegistry Map
  • XDocument 和 BOM(字节顺序标记)的问题

    有没有办法输出没有BOM的XDocument的内容 当使用Flash读取输出时 会导致错误 如果您使用 XmlWriter 编写 XML 则可以将编码设置为已初始化的编码以省略 BOM EG System Text UTF8Encoding
  • 具有基本身份验证的 Solr Cloud 失败 - Solr 管理员未经授权的 401 错误

    我已经使用 Solr 6 6 0 和 Zookeeper 3 4 10 设置了 SolrCloud 我正在尝试根据最新文档设置基本身份验证https cwiki apache org confluence display solr Basi
  • C# ANTLR 语法?

    我正在寻找交钥匙ANTLR http www antlr org C 语法 生成可用的抽象语法树 AST 并且与后端语言无关或以 C C C 或 D 为目标 它不需要支持错误报告 附 我不愿意做任何修复 因为替代方案并不难 这可能太晚了 但
  • FileProvider:安装 APK。解析包时出错。

    我在 storage emulated 0 Download app debug apk 中有一个 APK 文件 我想通过 FileProvider 安装这个文件 因为我使用的是 Android N 当我尝试启动意图 logcat 时 没有
  • 禁用 Android 12 默认启动屏幕

    在 Google I O 演示中 Google 团队表示我们可以禁用默认的启动屏幕 我想这样做 但我找不到方法 有人能够实现这一目标吗 稍后编辑 我误解了视频中演讲者所说的内容 看来您只能编辑默认的启动屏幕 而不能禁用它 你可以添加这一行
  • 有没有适合新手的 Solr 教程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Angularjs $http.get 不起作用

    我的目的是使用 AngularJS 中的 REST Web 服务 我现在正在进行一些试验 下面的代码不起作用并抛出以下异常 你能帮我找出问题所在吗 提前致谢 function getUsersFromLocal scope http htt
  • 我可以在 2.1 上编译 Android 应用程序并支持 1.5 及以上的所有版本吗?

    我希望我的 Android 应用程序具有最大的覆盖范围 因此希望支持 V1 5 及以上的所有版本 我发现 V1 5 中缺少的一些功能在 V2 0 或 V2 1 中可用 我可以在 V2 1 上编译 然后设置 minSDK 以使应用程序在 1
  • Django:如何在可重用应用程序中处理导入

    我刚刚开始使用 django 我不太清楚 我应该如何编写一个可以稍后重用的应用程序 在我阅读的每个教程中 我都会看到相同的代码 view py from project app models import MyModel 因此 如果我将应用
  • Windows服务之间如何通信

    我有 2 个使用 C 创建的 Windows 服务 我希望其中一个服务调用第二个 Windows 服务中的函数 我该怎么做呢 EDIT 问题是我必须运行该应用程序 我不需要它们 相反服务进程也很好 但我need这2个应用程序进行通信 这2个
  • 获取 $http 调用的完整调用堆栈跟踪

    假设有人在名为的文件中编写了这样的方法app js尝试对不存在的 url 执行 XHR 请求 app controller MainCtrl function scope http scope send function http get
  • 如何从 Android 中的 Fragment 调用 ArrayAdapter 构造函数

    我正在尝试将两列 ListView 添加到我的 Android 应用程序中 当我创建项目时 我选择了选项 片段 它通过向左和向右滑动来创建漂亮的导航 所以我的MainActivity延伸FragmentActivity 我的问题是 当我尝试
  • 找不到绳线(-bash:绳线:找不到命令)

    我正在尝试使用 twine 在 pypi 上发布我的第一个 python 包 当然会首先添加 test pypi 我遵循了官方指南https packaging python org tutorials packaging projects
  • Freemarker:从模板文件 (*.ftl) 调用静态 util 方法

    在 Freemarker FTL 文件中 我想调用StringUtils capatilize myString 例如 p You selected selectionString p p StringUtils capatilize se
  • 绘制圆形渐变

    我想绘制一个圆形渐变 如下图所示 我可以轻松管理径向渐变 但我不知道如何做圆形渐变 我正在考虑在一条线上绘制渐变 然后将其转换为圆形 这可能吗 这就是我绘制径向渐变的方法 CGFloat a MIN self frame size widt
  • 使用 codeigniter 403 的 Ajax 请求(禁止)

    我正在尝试使用 Ajax 向 Codeigniter 中的控制器文件发送一个值 但没有成功 我已经搜索过这个问题 现在这个问题在这里被提出了很多次 但仍然找不到解决方案 希望任何人都可以帮助我 谢谢 Js file function sub
  • 在堆栈上为 execve 创建一个 arg 数组

    我想编写一个汇编程序 通过 EXECVE 系统调用 0x3C 使用开关 al 执行程序 bin ls 手册页 man 2 execve 指出该调用需要三个值 int execve const char filename char const