具体是这样,已 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 在某些版本的 android 会静默失败
|
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 1
上 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 1
根据 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 也没用。 |