
具体是这样,已 ROOT 的 Android 手机上,我放了个 busybox 到 /tmp 目录下。 切到 /tmp , chmod 777 busybox, 可以执行。 执行./busybox dirname 或 ./busybox echo aa 都没有问题。
这时写个脚本 i.sh ,放到 /tmp 下,内容就 3 句: #!/bin/sh echo aa /tmp/busybox-arm dirname
然后执行 ./busybox sh ./i.sh 执行到第 3 句提示 ./i.sh: line 3: /tmp/busybox-arm: Permission denied 纠结了半天没发现哪里有问题。
1 skydiver 2016-05-24 17:29:19 +08:00 /tmp/busybox-arm 你有这文件么…… |
2 mdzz 2016-05-24 17:29:52 +08:00 1. 还是我见识少,还没发现哪款 Android 手机上 /tmp 目录可用的 :doge: 2. 到底是 /tmp/busybox 还是 /tmp/busybox-arm ? 3. 你确定第一句不写 #!/system/bin/sh ? |
3 pheyx 2016-05-24 18:35:05 +08:00 via Android 看看 SELINUX 是不是启用了,禁用试试(可能得重编译内核) |
4 bluesky139 OP |
5 bluesky139 OP |
6 pheyx 2016-05-24 20:33:19 +08:00 via Android @bluesky139 执行完 setenforce 0 之后 getenforce 返回什么? setenforce 在某些版本的 anroid 会静默失败 |
7 bluesky139 OP @pheyx 返回 0 ,没有任何输出,看起来像是对的。如果是在非 root 下执行,会提示 permission denied ,所以 ROOT 下我觉得应该是成功了的。 |
8 bluesky139 OP @pheyx 我执行 getenforce 返回的是 Permissive ,似乎没有问题。 |
9 ghw 2016-05-24 20:52:36 +08:00 这样呢? #!/bin/sh echo aa &&/bin/sh /tmp/busybox-arm dirname |
10 bluesky139 OP |
11 ghw 2016-05-24 21:16:12 +08:00 @bluesky139 你这东分两行写也会这样麽 |
12 bluesky139 OP @ghw 用 && 连成一行也一样。 |
13 ghw 2016-05-24 21:31:32 +08:00 尴尬。。原来你本来就是三行的。。。 我还以为是一行 ; ; dirname 先执行呢,后一个也会挂麽。。哎。。。 ; #!/system/bin/sh /tmp/busybox-arm dirname echo aa |
14 bluesky139 OP @ghw 这跟执行先后顺序没关系吧,我试了下,也一样。话说 V2EX 上换行有什么特殊的符号,我直接换行结果发出来就连在一行上了。 |
15 extreme 2016-05-24 21:58:42 +08:00 只能慢慢排除,先把 /tmp/busybox-arm 弄到其他路径看看能不能执行。 |
16 LoliconInside 2016-05-24 22:05:07 +08:00 为什么总觉得是$PATH 的问题 |
17 fcicq 2016-05-24 22:22:35 +08:00 上 strace 记录先 |
18 julyclyde 2016-05-24 22:26:12 +08:00 tmp 是不是 mounted with noexec 了? |
19 ProfFan 2016-05-24 22:26:28 +08:00 同意楼上,先看崩哪儿了 |
20 bluesky139 OP @LoliconInside $PATH 可能会是什么问题,这里 $PATH 输出 /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin ,如果我在脚本里先把 PATH 清空再执行也一样。 |
21 bluesky139 OP @julyclyde tmp 有可执行权限( 777 ),仔细看,我是用 busybox 里的 sh 去执行脚本,脚本里面再调用 busybox ,如果没有可执行权限,那脚本根本不会执行。 |
22 bluesky139 OP @extreme 结果发现,把 busybox 放到 /system 下就没问题了,然而也不知道是什么原因。 看 /system 和 /data 的 mount 参数也没发现什么问题。 一个是 /system ext4 rw,seclabel,relatime,data=ordered 0 0 另一个是 /data ext4 rw,seclabel,nosuid,nodev,noatime,discard,journal_checksum,journal_async_commit,noauto_da_alloc,data=ordered 0 0 |
23 bluesky139 OP @fcicq strace 的结果: read(10, "#!/bin/sh\necho aa \n/data/local/t"..., 1023) = 55 wait4(-1, 0xbeb930f8, WNOHANG, NULL) = -1 ECHILD (No child processes) write(1, "aa\n", 3aa ) = 3 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, chil d_tidptr=0x112c598) = 18286 wait4(-1, Process 18286 attached <unfinished ...> [pid 18286] close(10) = 0 [pid 18286] rt_sigaction(SIGQUIT, {SIG_DFL, ~[], 0x4000000 /* SA_??? */}, NULL, 8) = 0 [pid 18286] execve("/data/local/tmp/busybox-arm", ["/data/local/tmp/busybox-arm" , "dirname"], [/* 29 vars */]) = -1 EACCES (Permission denied) |
24 julyclyde 2016-05-25 14:07:53 +08:00 为什么 execvc 的路径不是 /tmp 开头的? |
25 bluesky139 OP @julyclyde 这个机器上 /tmp 是连到 /data/local/tmp 下的。 |
26 fcicq 2016-05-25 16:49:11 +08:00 根据 strace 结果猜一下的话, 应该是 fork 出的 /bin/sh 不能再执行 /data 分区下的内容. 感觉和 selinux 的 domain 设置有关. |
27 extreme 2016-05-25 17:23:03 +08:00 @bluesky139 那不执行 /tmp/下的 busybox 呢,执行其他可执行文件。 |
28 extreme 2016-05-25 17:23:37 +08:00 @bluesky139 我意思是执行 /tmp/下的其他可执行文件。 |
29 bluesky139 OP @extreme 从脚本里调用 /tmp 下面的其它可执行文件也不行。 我发现,如果把 busybox 放到 /system 下面,再在脚本里调用 /tmp 下面的可执行文件没有问题。 |
30 bluesky139 OP @fcicq 有什么解么? |
31 extreme 2016-05-25 21:02:08 +08:00 @bluesky139 分别对 /system 和 /tmp 里面的 busybox 执行 ls -lZ 看看。 |
32 bluesky139 OP @extreme /tmp 下面 -rwxrwxrwx root root u:object_r:shell_data_file:s0 busybox /system 下面 -rwxrwxrwx root root u:object_r:system_file:s0 busybox 然而我把 /tmp 下面的 busybox 改为 u:object_r:system_file:s0 也没用。 |