- 論壇徽章:
- 0
|
看到有個帖子討論劫持fork的問題,godbach的內(nèi)核系統(tǒng)調(diào)用的問題,其實我以前分析過adore-ng的源碼,在CU也可以收到!可以很好的劫持系統(tǒng)調(diào)用,說到這里就想能不能劫持諸如GLIBC的函數(shù)呢....
我們先從下面一段例程:
- /* 文件名:verifypasswd.c */
- /* 這是一段判斷用戶口令的程序,其中使用到了標準C函數(shù)strcmp*/
- #include <stdio.h>
- #include <string.h>
- int main(int argc, char **argv)
- {
- char passwd[] = "password";
- if (argc < 2) {
- printf("usage: %s <password>\n", argv[0]);
- return -1;
- }
- if (!strcmp(passwd, argv[1])) {
- printf("Correct Password!\n");
- return 1;
- }
- printf("Invalid Password!\n");
- return 0;
- }
-
復(fù)制代碼
在上面這段程序中,我們使用了strcmp函數(shù)來判斷兩個字符串是否相等。下面,我們使用一個動態(tài)函數(shù)庫來重載strcmp函數(shù):
- /* 文件名:hack1.c */
- #include <stdio.h>
- #include <string.h>
- int strcmp(const char *s1, const char *s2)
- {
- printf("hack function invoked. s1=<%s> s2=<%s>\n", s1, s2);
- return 0;
- }
復(fù)制代碼
編譯程序:
$ gcc -o verifypasswd verifypasswd.c
$ gcc -shared -o hack.so hack.c
測試一下程序:(得到正確結(jié)果)
$ ./verifypasswd asdf
Invalid Password!
設(shè)置LD_PRELOAD變量:(使我們重寫過的strcmp函數(shù)的hack.so成為優(yōu)先載入鏈接庫)
$ export LD_PRELOAD="./hack.so"
再次運行程序:
$ ./verifypasswd asdf
hack function invoked. s1=<password> s2=<asdf>
Correct Password!
被劫持了,但是這種太過于惡劣,如果我們還是先正常的strcmp呢
我們可以看到,1)我們的hack.so中的strcmp被調(diào)用了。
2)主程序中運行結(jié)果被影響了。如果這是一個系統(tǒng)登錄程序,那么這也就意味著我們用任意口令都可以進入系統(tǒng)了。
被劫持了,但是這種太過于惡劣,如果我們還是想獲得用戶輸入之后正常的strcmp呢
- /* 文件名:hack2.c */
- #include <stdio.h>
- #include <string.h>
- #include <dlfcn.h>
- int strcmp(const char *s1, const char *s2)
- {
- int (*hac_strcmp)(const char*, const char*);
-
- printf("hack function invoked. s1=<%s> s2=<%s>\n", s1, s2);
-
- *(void **)(&hac_strcmp) = dlsym(RTLD_NEXT, "strcmp");
- if(dlerror()) {
- errno = EACCES;
- return -1;
- }
- return (*hac_strcmp)(s1, s2);
- }
復(fù)制代碼
dlsym用法不是太懂的大家可以google之!
最后是我自己的測試結(jié)果:
- [root@nfs-server hack]# ls
- hack1.c hack2.c test.c
- [root@nfs-server hack]# gcc -Wall -o test test.c
- [root@nfs-server hack]# ./test aaa
- Invalid Password!
- [root@nfs-server hack]# gcc -fPIC -shared -o hack.so hack1.c
- [root@nfs-server hack]# export LD_PRELOAD="./hack.so"
- [root@nfs-server hack]# ./test aaa
- hack function invoked. s1=<password> s2=<aaa>
- Correct Password!
- [root@nfs-server hack]# export LD_PRELOAD=""//大家可以嘗試下不加這句的結(jié)果^_^
- [root@nfs-server hack]# gcc -fPIC -shared -o hack.so hack2.c -ldl
- [root@nfs-server hack]# ./test aaa
- Invalid Password!
- [root@nfs-server hack]# export LD_PRELOAD=""
- [root@nfs-server hack]# ./test aaa
- Invalid Password!
- [root@nfs-server hack]# export LD_PRELOAD="./hack.so"
- [root@nfs-server hack]# ./test aaa
- hack function invoked. s1=<password> s2=<aaa>
- Invalid Password!
- [root@nfs-server hack]# export LD_PRELOAD=""
復(fù)制代碼 |
評分
-
查看全部評分
|