Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3024019
  • 博文数量: 272
  • 博客积分: 5544
  • 博客等级: 大校
  • 技术积分: 5496
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 00:48
个人简介

  每个人都要有一个骨灰级的爱好,不为金钱,而纯粹是为了在这个领域享受追寻真理的快乐。

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2012-07-04 13:54:09

原文地址:


最近有人问我,一个集群监控软件的安装文件特别“诡异”,说脚本里有“乱码”却能执行,是怎么回事?我看了才发现这个东西原来是典型的脚本嵌套代码的模式,这里就讲讲吧。反正好久没写东西了。

某些比较“拽”的单位在发布Linux软件时以一种特殊的形式发布,即在shell脚本中嵌入二进制字符,从而使脚本变得极其诡异,让某些初学者感觉惊奇。其实,这个原理戳穿了非常简单,就是在运行脚本时将二进制代码导出成一个程序,再执行之就可以。(不过这种行为其实,是违反Linux社区的精神的,像我这种人, 看到什么软件第一反应都是想搞到其源码)

1 简单嵌入程序

原理:通常程序代码处在脚本的最后位置。脚本运行时,把它写出来执行即可。

例:下面的这个源码:

#include
#include

int main(int argc, char** argv)
{
const char* envtagUSER="USER";
printf("Your Username: %s. This is detected by the program %s.\n", getenv(envtagUSER), argv[0]);
return 0;
}

这段代码可以用来输出用户名。当然这仅仅是个例子,实际编程时用shell就可以得到。现在假设我们想把这段代码嵌入一个名叫dofoo.sh的shell脚本中。首先编译之:
gcc foo.c -o foo
现在把foo追加到dofoo.sh的末尾:
cat foo >> dofoo.sh   #注意是追加

打开dofoo.sh,添加代码:
1    #!/bin/sh
3    skip=11
4    prog="/tmp/$0.exe"
5    tail -n +$skip "$0" > $prog
6    chmod u+x $prog
7    $prog
8    rm $prog
9    exit
10
11  ^?EFL^B
...
18  ....AMIC^@data_start^@__libc_csu_fini^@_sta

(11行以后用VI看都是乱码)
看明白了吧!这代码将脚本中11行以后的东西导入到了/tmp/dofoo.exe这个文件中,添加x权限,执行,然后删除该文件。

2 加密伪装

有时候一个shell中的乱码并不一定是可执行文件,那些东西可能是某种压缩格式,如bz2,gz等等,或者其他的某种加密形式,程序会先把他们导出来解压在执行然后删除,道理是一样的。有时候,这种解压程序或者解密程序本身就嵌套在shell脚本里,通常是商业公司干的事。
阅读(4469) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

cquyx2012-07-18 18:33:17

有点点像病毒的感觉