小镇今天要带大家来当一把黑客!告诉大家如何通过修改LD_PRELOAD变量来攻击服务器的。
【友情提醒:只是模拟一下而已,实际难度要大很多,而且这篇文章也是别的论坛上面看过来的,因为这个也是学习strace所需要了解的知识】
LD_PRELOAD这个环境变量是用来程序链接的。
【在linux的动态链接库中,它就是这样一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。】
我们知道,Linux的用的都是glibc,有一个叫libc.so.6的文件,这是几乎所有Linux下命令的动态链接中,其中有标准C的各种函数。对于GCC而言,默认情况下,所编译的程序中对标准C函数的链接,都是通过动态链接方式来链接libc.so.6这个函数库的。
OK。还是让我用一个例子来看一下用LD_PRELOAD来hack别人的程序。
【小镇来亲自试下吧,玩玩嘛】
首先我们写一段程序,如下图所示:
【这是一段密码验证程序,大家都看得出来,password是正确密码,下面就强行让他所有的密码都能通过】
然后我们编译一下:gcc -o verfypasswd verfypasswd.c。
然后写一段用来hack的c语言文件hack.c,如下图所示:
然后将c文件编译成so链接库,命令:gcc -fPIC -shared -o hack.so hack.c
【-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),
则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意
位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。】
恩,好,关键的一部来了!改变LD_PRELOAD环境变量的值:export LD_PRELOAD="./hack.so"
好了,你随便运行个命令试试
哇擦!。。。。。。全是 I will hack you,baby这个字符串。。好吓人,而且文件的名称全部错误了。
然后我们运行刚刚的密码c文件试试,下图:
看见没,correct password,这样子密码就强行正确了!赶紧改回来。。export LD_PRELOAD=""