有时候,我们希望程序里的strcmp、open等libc库函数出错,来检验我们的程序是否健壮
但是实际去构造这些错误,往往有些困难
利用libc是动态库的特性,我们可以结合环境变量LD_PRELOAD来进行故障注入。
一个小例子
velscode@ubuntu:~$ cat passwd.c
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
if (strcmp(argv[1], "bb") == 0) {
printf("Success!\n");
} else {
printf("Failed!\n");
}
return 0;
}
这个程序接受一个参数,如果是bb,则输出Success,如果是其他的则出书Failed
velscode@ubuntu:~$ ./passwd bb
Success!
velscode@ubuntu:~$ ./passwd aa
Failed!
下面自己编写一个假的strcmp
velscode@ubuntu:~$ cat hack.c
#include <stdio.h>
int strcmp(const char* s1, const char* s2)
{
printf("I hack you!\n");
return 0;
}
编译成动态库
gcc -shared -o hack.so hack.c -fPIC
让我们设置环境变量,再执行passwd看看
velscode@ubuntu:~$ export LD_PRELOAD=./hack.so
velscode@ubuntu:~$ ./passwd bb
I hack you!
Success!
velscode@ubuntu:~$ ./passwd aa
I hack you!
Success!
这个时候,libc里的strcmp已经被我们“接管”了
博客介绍了为检验程序健壮性,利用libc动态库特性结合环境变量进行故障注入的方法。还给出一个小例子,程序根据输入参数输出不同结果,通过编写假的动态库、设置环境变量,可“接管”libc里的相关函数。

被折叠的 条评论
为什么被折叠?



