首页
社区
课程
招聘
[原创]浅谈Bypass disable_function
发表于: 2019-10-31 17:38 1294

[原创]浅谈Bypass disable_function

2019-10-31 17:38
1294

    2. LD_PRELOAD替换后

这种绕过行为实施起来很简单,并且不受PHP与Linux版本的限制,但是也很容易防御,只要禁用相关的函数(putenv)或者限制对环境变量的传递就可以了,但是要注意对现有业务是否造成影响。其实对于这个问题,早在08年就有人向PHP官方反馈过,只不过PHP给出的回复是你最好禁用putenv函数: https://bugs.php.net/bug.php?id=46741 ,所以我们有理由相信在后续的PHP版本中也不会对这个问题有什么针对性的解决方案。



要更改的话打开php.ini,找到对应的行修改即可,这里修改如下:
    危险等级:高

    危险等级:高

    危险等级:高

    危险等级:高

    危险等级:高

    危险等级:高

    危险等级:高

    危险等级:高

    危险等级:高

    危险等级:高
  • dl()
    危险等级:高

    危险等级:高

    危险等级:高

    危险等级:高

    危险等级:高

    危险等级:中

    危险等级:中

    危险等级:中

    危险等级:中

    危险等级:中

    1.主程序

    // myverifypasswd.c
    #include <stdio.h>
    #include <string.h>
    #include "mystrcmp.h"
 
    void main(int argc,char **argv) {
        char passwd[] = "password";
        if (argc < 2) {
            printf("usage: %s <password>\n",argv[0]);
            return;
        }
        if (!mystrcmp(passwd,argv[1])) {
            printf("Correct Password!\n");
            return;
        }
        printf("Invalid Password!\n");
    }

     2.调用库      
	#include <stdio.h>
	int mystrcmp(const char *s1,const char *s2);

    3.生成动态链接库原始C文件
        // mystrcmp.c
	#include <stdio.h>
	#include <string.h>
	#include "mystrcmp.h"

	int mystrcmp(const char *s1,const char *s2)
	{
		return strcmp(s1,s2);
	}

	#include <stdio.h>
	int mystrcmp(const char *s1,const char *s2);

    3.生成动态链接库原始C文件
        // mystrcmp.c
	#include <stdio.h>
	#include <string.h>
	#include "mystrcmp.h"

	int mystrcmp(const char *s1,const char *s2)
	{
		return strcmp(s1,s2);
	}

        // mystrcmp.c
	#include <stdio.h>
	#include <string.h>
	#include "mystrcmp.h"

	int mystrcmp(const char *s1,const char *s2)
	{
		return strcmp(s1,s2);
	}

四、程序编译与试验



演示流程图


编译、设置

gcc mystrcmp.c -fPIC -shared -o libmystrcmp.so      
gcc myverifypasswd.c -L. -lmystrcmp -o myverifypasswd      
export LD_LIBRARY_PATH=/home/n6/桌面/LD_PRELOAD      #指定动态链接库所在目录位置
ldd myverifypasswd      #显示、确认依赖关系
./myverifypasswd      

gcc mystrcmp.c -fPIC -shared -o libmystrcmp.so      
gcc myverifypasswd.c -L. -lmystrcmp -o myverifypasswd      
export LD_LIBRARY_PATH=/home/n6/桌面/LD_PRELOAD      #指定动态链接库所在目录位置
ldd myverifypasswd      #显示、确认依赖关系
./myverifypasswd      

gcc mystrcmp.c -fPIC -shared -o libmystrcmp.so      
gcc myverifypasswd.c -L. -lmystrcmp -o myverifypasswd      
export LD_LIBRARY_PATH=/home/n6/桌面/LD_PRELOAD      #指定动态链接库所在目录位置
ldd myverifypasswd      #显示、确认依赖关系
./myverifypasswd      

五、替换库代码  



	// myhack.c
	#include <stdio.h>
	#include <string.h>
 
	int mystrcmp(const char *s1, const char *s2)
	{
    	printf("hack function invoked. s1=<%s> s2=<%s>\n", s1, s2);
    	// always return 0, which means s1 equals to s2--总是相等
    	return 0;
	}

六、替换并测试运行


替换流程图

替换流程图

七、实际应用测试



[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 2
支持
分享
最新回复 (5)
雪    币: 3083
活跃值: (52)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
补充一下http://www.rai4over.cn/2019/03/29/0CTF-2019-Wallbreaker-Easy-WriteUp/
2019-11-1 09:59
0
雪    币: 5372
活跃值: (140)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
Rai4over 补充一下http://www.rai4over.cn/2019/03/29/0CTF-2019-Wallbreaker-Easy-WriteUp/
Dear Dalao, please daidai wo
2019-11-1 10:18
0
雪    币: 7459
活跃值: (3883)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
github上面的bypass disable_function,基本都是需要putenv,putenv+那些执行命令的函数都disable后,再执行命令就难了
2019-11-5 21:47
0
雪    币: 5372
活跃值: (140)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
残废小菜比 github上面的bypass disable_function,基本都是需要putenv,putenv+那些执行命令的函数都disable后,再执行命令就难了
GitHub上原理分析到位了?也有不用putenv,利用_attribute_属性,等我之后的相关系列文章
2019-11-7 16:01
0
雪    币: 26588
活跃值: (63242)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
6
666,感谢分享!期待相关系列文章!
2019-11-7 16:19
0
游客
登录 | 注册 方可回帖
返回
//