Chinaunix

标题: 谁知道如何执行不带 x 属性的 ELF 文件。 [打印本页]

作者: deng_save_file    时间: 2007-07-19 17:11
标题: 谁知道如何执行不带 x 属性的 ELF 文件。
mount 了个光盘以后 ,发现里面的 ELF 文件没有可执行属性。
所以只能 cp 出来再改属性再执行。
哪位知道如何可以不复制就直接执行?
作者: 寂寞烈火    时间: 2007-07-19 17:21
(exec cmd)
作者: ehero    时间: 2007-07-20 13:39
写一个批处理不就可以了吗?
作者: deng_save_file    时间: 2007-07-25 16:34
原帖由 寂寞烈火 于 2007-7-19 17:21 发表
(exec cmd)

这个方法我已经用过,被证明是错误的。
作者: deng_save_file    时间: 2007-07-25 16:36
原帖由 ehero 于 2007-7-20 13:39 发表
写一个批处理不就可以了吗?


此人在灌水。
linux 下只有 shell script, perl, tcl/tk 等,但没有批处理。据我所知批处理这名词只在 dos/windows 中使用。
作者: 寂寞烈火    时间: 2007-07-25 16:57
原帖由 deng_save_file 于 2007-7-25 16:34 发表

这个方法我已经用过,被证明是错误的。

提示什么信息吗?

  1. /home/lee/test#cp /bin/ls .
  2. /home/lee/test#file ./ls
  3. ./ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), stripped
  4. /home/lee/test#chmod -r ./ls
  5. /home/lee/test#chmod -x ./ls
  6. /home/lee/test#./ls
  7. -bash: ./ls: 权限不够
  8. /home/lee/test#(exec ls)
  9. a  a~  a b  abc  a_data_1  a.tar  a.tmpl  b  b_data_2  c  c d  f  f~  ls  menu  xaa  xab  xac
  10. /home/lee/test#file ./ls
  11. ./ls: can't read `./ls' (Permission denied).
复制代码

[ 本帖最后由 寂寞烈火 于 2007-7-25 17:03 编辑 ]
作者: deng_save_file    时间: 2007-07-26 13:27
原帖由 寂寞烈火 于 2007-7-25 16:57 发表

提示什么信息吗?
/home/lee/test#cp /bin/ls .
/home/lee/test#file ./ls
./ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs ...



你这样是可以的。因为你的 exec 命令执行的 ls 仍然是 /bin/ls 而不是该 ls
下面是我的测试方案,你可以试试 :
mkdir 1
cd 1
cp /bin/ls .
chmod a-x ls
mkisofs -l -J -joliet-long -allow-leading-dots -r -o ls.iso ls
su
mkdir /1
mount -o loop,ro,exec ls.iso /1
cd /1
ls -l
(exec ./ls -l)
=========以下下为输出============
total 88
-r--r--r-- 1 root root 89464 Jul 26 13:18 ls
bash: /1/ls: Permission denied
bash: exec: /1/ls: cannot execute: Permission denied
=========输出结束============
作者: 寂寞烈火    时间: 2007-07-26 13:38
原帖由 deng_save_file 于 2007-7-26 13:27 发表



你这样是可以的。因为你的 exec 命令执行的 ls 仍然是 /bin/ls 而不是该 ls
下面是我的测试方案,你可以试试 :
mkdir 1
cd 1
cp /bin/ls .
chmod a-x ls
mkisofs -l -J -joliet-long -allow-leadi ...

嗯, 我的测试是错误的 你说的有理 也许需要写个专门的程序啦~

[ 本帖最后由 寂寞烈火 于 2007-7-26 13:44 编辑 ]
作者: tom_xx_hu@yahoo    时间: 2007-07-27 05:26
我想我能拿这一分了:

$ /lib/ld-linux.so.2  <path_to_the_ELF_file>

作者: swordfish.cn    时间: 2007-07-27 07:12
LS 可不可以解释下原理呢?
作者: reiase    时间: 2007-07-27 08:53
刚刚做过这东西,被我撞上了

自己写一个加载器,很小的

  1. #include <dlfcn.h>
  2. int main(int argc,char** argv)
  3. {
  4.   void* handle;
  5.   int (*mainfunc)(int,char**)
  6.   handle = dlopen(argv[1]);
  7.   if (handle)
  8.     mainfunc = dlsym(handle,"main");
  9.   mainfunc(argc-1,argv+1);
  10.   return 0;
  11. }
复制代码

这个程序用mmap把那个文件映射到内存,然后看是否能找到main这个符号,如果找到就获得它的地址并且调用他

[ 本帖最后由 reiase 于 2007-7-27 08:54 编辑 ]
作者: tom_xx_hu@yahoo    时间: 2007-07-27 11:39
原帖由 swordfish.cn 于 2007-7-27 07:12 发表
LS 可不可以解释下原理呢?

ld.so和ld-linux.so 都用于将指定的可执行代码连接共享库并运行,前者用于传统的a.out格式的执行码,后者用于ELF。
在shell环境下,对无x属性的文件,shell拒绝调用ld.so 或ld-linux.so 来运行这个文件。这时只有人为的来执行了。
详见ld.so manpage
The programs ld.so and ld-linux.so* find and load the shared libraries
       needed by a program, prepare the program to run, and then run it.

作者: swordfish.cn    时间: 2007-07-27 21:57

那 ld.so 应该是 toolchain 的一部分了吧,学习了。
作者: MMMIX    时间: 2007-07-28 12:56
原帖由 swordfish.cn 于 2007-7-27 21:57 发表

那 ld.so 应该是 toolchain 的一部分了吧,学习了。

对头。

----------
作者: deng_save_file    时间: 2007-08-08 19:44
原帖由 tom_xx_hu@yahoo 于 2007-7-27 05:26 发表
我想我能拿这一分了:



仍然不行:
/lib/ld-linux.so.2 ./ls
./ls: error while loading shared libraries: ./ls: wrong ELF class: ELFCLASS64
/lib64/ld-linux-x86-64.so.2 ./ls
./ls: error while loading shared libraries: ./ls: failed to map segment from shared object: Operation not permitted
作者: tom_xx_hu@yahoo    时间: 2007-08-08 23:35
原帖由 deng_save_file 于 2007-8-8 19:44 发表


仍然不行:
/lib/ld-linux.so.2 ./ls
./ls: error while loading shared libraries: ./ls: wrong ELF class: ELFCLASS64
/lib64/ld-linux-x86-64.so.2 ./ls
./ls: error while loading shared libra ...

这不像是我的问题。你的ELF执行文件(本例./ls)编译生成环境与runtime环境不一样,这是不同版本的问题。你很麻烦了。
作者: deng_save_file    时间: 2007-08-23 16:41
原帖由 tom_xx_hu@yahoo 于 2007-8-8 23:35 发表

这不像是我的问题。你的ELF执行文件(本例./ls)编译生成环境与runtime环境不一样,这是不同版本的问题。你很麻烦了。


怎么可能不同?从本机 cp 过去的 /bin/ls 文件 , 原本是可执行的,但去掉 x 属性后,再 mkisofs 成 iso 文件。重新  mount 它,就出现如上状况
作者: deng_save_file    时间: 2007-08-23 17:18
原帖由 tom_xx_hu@yahoo 于 2007-8-8 23:35 发表

这不像是我的问题。你的ELF执行文件(本例./ls)编译生成环境与runtime环境不一样,这是不同版本的问题。你很麻烦了。


怎么可能不同?从本机 cp 过去的 /bin/ls 文件 , 原本是可执行的,但去掉 x 属性后,再 mkisofs 成 iso 文件。重新  mount 它,就出现如上状况
作者: tom_xx_hu@yahoo    时间: 2007-08-24 05:31
原帖由 deng_save_file 于 2007-8-23 17:18 发表


怎么可能不同?从本机 cp 过去的 /bin/ls 文件 , 原本是可执行的,但去掉 x 属性后,再 mkisofs 成 iso 文件。重新  mount 它,就出现如上状况

哎呀,要拿点分都这么不容易,要赚钱就更难了。
我现在想起两个可能的原因。一个是你的kernel是2.6系中的某一个有相关bug的,那你要更新核心了;另一个可能是你的系统环境用了libsafe。把uname -a和echo $LD_PRELOAD结果贴上来看看好吗?
作者: tom_xx_hu@yahoo    时间: 2007-08-29 02:48
原帖由 tom_xx_hu@yahoo 于 2007-8-24 05:31 发表

哎呀,要拿点分都这么不容易,要赚钱就更难了。
我现在想起两个可能的原因。一个是你的kernel是2.6系中的某一个有相关bug的,那你要更新核心了;另一个可能是你的系统环境用了libsafe。把uname -a和echo $L ...

LZ哥们,好在这只是CU赏分,要是等这口赏饭,我得饿死了。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2