有时候,我们希望程序里的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
已经被我们“接管”了