Fork me on GitHub

shell嵌套二进制程序

    前段时间偶然看了下 Nvidia 显卡驱动安装的 NvidiaXXXXX.run 文件,令人惊奇的是shell文件里面居然可以嵌套而二进制文件执行,简单说一下其中的原理以及一个例子。

    使用uuencode将二进制文件编码为文本格式,然后将其粘贴到脚本的末尾;运行uudecode 创建二进制文件,然后更改权限并执行它。uencodeuudecode最初是为了将二进制内容转移到互联网的前体而创建的,它并没有很好地处理二进制信息,转换为文本意味着它可以作为 shell 脚本发送。

1
sudo apt-get install -y sharutils
1
2
3
4
5
6
7
8
9
vim test.c
#include <stdio.h>
int main()
{
printf("hello wrold!\n");
printf("Shell 嵌套二进制\n");
return 0;
}
gcc test.c -o test
1
2
3
4
5
6
7
8
vim foo.sh
#!/bin/bash
rm -f test
uudecode $0
./test
rm -f test
exit
###第一rm声明显示,正在被这个重新创建的test可执行脚本,而不是留在你的汇编中。由于您所需要的有效载荷文件中为好,装上编码的可执行到它的结束
1
uuencode test test >>foo.sh

    当你执行脚本foo.sh时,它先提取可执行文件,然后执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
cat foo.sh
#!/bin/bash
rm -f test
uudecode $0
./test
rm -f test
exit
begin 775 test
乱码
乱码
乱码
M3$E35%]?`&1E<F5G:7-T97)?=&U?8VQO;F5S`')E9VES=&5R7W1M7V-L;VYE
M<P!?7V1O7V=L;V)A;%]D=&]R<U]A=7@`8V]M<&QE=&5D+C8Y.#(`7U]D;U]G
M;&]B86Q?9'1O<G-?875X7V9I;FE?87)R87E?96YT<GD`9G)A;65?9'5M;7D`
M7U]F<F%M95]D=6UM>5]I;FET7V%R<F%Y7V5N=')Y`'1E<W0N8P!?7T9204U%
M7T5.1%]?`%]?2D-27T5.1%]?`%]?:6YI=%]A<G)A>5]E;F0`7T193D%-24,`
M7U]I;FET7V%R<F%Y7W-T87)T`%]'3$]"04Q?3T9&4T547U1!0DQ%7P!?7VQI
M8F-?8W-U7V9I;FD`7TE435]D97)E9VES=&5R5$U#;&]N951A8FQE`&1A=&%?
M<W1A<G0`<'5T<T!`1TQ)0D-?,BXR+C4`7V5D871A`%]F:6YI`%]?;&EB8U]S
M=&%R=%]M86EN0$!'3$E"0U\R+C(N-0!?7V1A=&%?<W1A<G0`7U]G;6]N7W-T
M87)T7U\`7U]D<V]?:&%N9&QE`%])3U]S=&1I;E]U<V5D`%]?;&EB8U]C<W5?
M:6YI=`!?96YD`%]S=&%R=`!?7V)S<U]S=&%R=`!M86EN`%]*=E]296=I<W1E
M<D-L87-S97,`7U]434-?14Y$7U\`7TE435]R96=I<W1E<E1-0VQO;F5486)L
(90!?:6YI=
end
1
2
3
4
chmod +x foo.sh
bash foo.sh
hello wrold!
Shell 嵌套二进制

    首先你的保证test执行不会报错,之后你的foo.sh脚本才不会报错。

------ 本文结束 ------