免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4665 | 回复: 9

[内核入门] 从volatile扯到so注入 [复制链接]

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
发表于 2016-11-04 19:20 |显示全部楼层
本帖最后由 _nosay 于 2016-11-04 19:59 编辑

  • 模拟①:变量“显式”被改变(编译阶段,编译器能"看到")
    其它线程"意外"改变stop值:低优化级别时,stop总是从内存读,所以stop值被子线程修改后,循环结束;高优化级别时,假设编译器为stop变量安排一个寄存器eax,编译时发现stop被修改的语句时,也自动添加修改eax寄存器的指令
    volatile_1.png

  • 模拟②:变量“隐式”被改变(运行阶段,编译器"看不到")
    运行时硬件"意外"改变stop值:低优化级别时,每次访问stop时,都重新从内存读取,显然循环体一次都不会执行;高优化级别时,假设编译器为stop变量安排一个寄存器eax,之后访问stop的指令,都被编译成访问eax的指令,并且编译器又不能预测硬件将来什么时候会改变stop,所以就不可能生成修改eax寄存器的指令,那么eax就一直为0,从而循环一直执行
    volatile_2.png
  (疑问:为啥不是-O0时不进入循环,-O3时一直循环

  • volatile(“易变的”)
    volatile相当于对编译器“不足”的弥补(有些时候编译器无法预测,但程序员知道,那就就人为的告诉编译器),其中volatile就是告诉编译器:加了优化选项时,哪些变量仍然当作不优化处理。这样,不优化时,编译就不会为变量安排寄存器(不相信在第二个例子中,为stop变量加上volatile修饰符,再按分别按-O3级别编译,看运行结果是否和-O0一样)。

  • const(“不变的”)
    const用于向编译器说明当前函数或当前程序中不准修改变量,用于编译阶段向程序员提醒错误,并不能限制运行时其它地方修改这个变量对应的内存。

    const与volatile修饰并不矛盾,一个变量可以同时加const、volatile修饰:
    ① const针对的是编译阶段,从而只保证了当前程序不修改某些变量
    ② volatile针对的是运行阶段,防止除当前进程的其它地方(硬件、其它CPU、其它进程)"意外"修改某些变量。

    进程间不都用的虚拟地址吗,怎么会被其它进程修改?
    ① 内核代码虚拟地址与物理地址映射规则很简单,特殊情况下某个内核进程,希望修改另一个内核进程的某个变量是可以做到的;
    ② 对于用户态程序,至少我知道通过“注入”技术是可以做到的(注意:跟sql注入、内存共享都没有关系,内存共享用的是mmap()系统调用,修改是的共享的内存,而注入用的是ptrace()系统调用,修改是的指向共享内存的指针)。

  • 动态注入
    演示代码(求打赏): injection.7z (1.36 KB, 下载次数: 21)

评分

参与人数 2可用积分 +16 收起 理由
Godbach + 6 赞一个!
amarant + 10 赞一个!

查看全部评分

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
发表于 2016-11-07 16:00 |显示全部楼层
很好很强大,提个问题,injection.c为什么会有对test.c的PTRACE权限呢?

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
发表于 2016-11-07 16:22 |显示全部楼层
回复 2# amarant


root执行

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
发表于 2016-11-08 08:46 |显示全部楼层
回复 3# _nosay

很不错,感谢分享

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
发表于 2016-11-09 16:26 |显示全部楼层
能调试然后能调戏

论坛徽章:
11
程序设计版块每日发帖之星
日期:2015-09-09 06:20:00CU十四周年纪念徽章
日期:2016-05-16 11:11:112016科比退役纪念章
日期:2016-05-04 17:16:57程序设计版块每日发帖之星
日期:2016-02-20 06:20:00程序设计版块每周发帖之星
日期:2015-11-06 19:30:58程序设计版块每日发帖之星
日期:2015-09-12 06:20:00程序设计版块每日发帖之星
日期:2015-09-11 06:20:00每日论坛发贴之星
日期:2015-09-10 06:20:00程序设计版块每日发帖之星
日期:2015-09-10 06:20:00每日论坛发贴之星
日期:2015-09-09 06:20:0015-16赛季CBA联赛之四川
日期:2016-12-15 15:52:10
发表于 2016-11-23 16:21 |显示全部楼层
疑问:为啥不是-O0时不进入循环,-O3时一直循环

论坛徽章:
11
程序设计版块每日发帖之星
日期:2015-09-09 06:20:00CU十四周年纪念徽章
日期:2016-05-16 11:11:112016科比退役纪念章
日期:2016-05-04 17:16:57程序设计版块每日发帖之星
日期:2016-02-20 06:20:00程序设计版块每周发帖之星
日期:2015-11-06 19:30:58程序设计版块每日发帖之星
日期:2015-09-12 06:20:00程序设计版块每日发帖之星
日期:2015-09-11 06:20:00每日论坛发贴之星
日期:2015-09-10 06:20:00程序设计版块每日发帖之星
日期:2015-09-10 06:20:00每日论坛发贴之星
日期:2015-09-09 06:20:0015-16赛季CBA联赛之四川
日期:2016-12-15 15:52:10
发表于 2016-11-23 16:39 |显示全部楼层
这和你的结论相反啊,优化了的反而结果是对的

论坛徽章:
11
程序设计版块每日发帖之星
日期:2015-09-09 06:20:00CU十四周年纪念徽章
日期:2016-05-16 11:11:112016科比退役纪念章
日期:2016-05-04 17:16:57程序设计版块每日发帖之星
日期:2016-02-20 06:20:00程序设计版块每周发帖之星
日期:2015-11-06 19:30:58程序设计版块每日发帖之星
日期:2015-09-12 06:20:00程序设计版块每日发帖之星
日期:2015-09-11 06:20:00每日论坛发贴之星
日期:2015-09-10 06:20:00程序设计版块每日发帖之星
日期:2015-09-10 06:20:00每日论坛发贴之星
日期:2015-09-09 06:20:0015-16赛季CBA联赛之四川
日期:2016-12-15 15:52:10
发表于 2016-11-23 17:01 |显示全部楼层
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

void *start_routine(void *arg)
{
        sleep(2);
        *(int *)arg = 1;
        return NULL;
}

int main()
{

        /*volatile*/ int stop=0;
        unsigned long rbp,rsp;

        __asm__ __volatile__(
                "movq %%rbp, %%rax\n\t"
                "movq %%rsp, %%rbx\n\t"
                "movl $1, (%%rsp)"
                :"=a"(rsp), "=b"(rsp)
                :
                :"memory");
        //printf("rbp:%p,rsp:%p,&rbp:%p,&rsp:%p,&stop:%p\n",(void*)rbp,(void*)rsp,(void*)&rbp,(void*)&rsp,&stop);
        //printf("rbp:%p,rsp:%p,&stop:%p\n",(void*)rbp,(void*)rsp,&stop);
        int b;
        b=stop;
        while(!b)
        {
                printf("%d\n",b);
                sleep(1);
        }
        return 0;
}



这个例子能说明问题。。。。。。。。

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
发表于 2018-05-22 19:06 |显示全部楼层
回复 8# 我爱你我的菜

嗯,这个方法好。

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
发表于 2018-05-22 19:15 |显示全部楼层
回复 8# 我爱你我的菜

但我发现,不优化时,rsp直接和stop位置相等,优化时,rsp要加一点才能和stop位置相等,是因为位置不同,没有修改到stop,才一直循环的,所以帖子中关于“编译器看不见”的猜测,是错的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP