免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 11530 | 回复: 10
打印 上一主题 下一主题

怎样处理SIGILL信号? [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-29 17:04 |只看该作者 |倒序浏览
如题,就是Illegal instruction的这个信号
我希望信号处理函数把内存和寄存器状态做一些修改,然后让程序跳到非法指令的下一条指令接着执行。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
2 [报告]
发表于 2011-11-29 17:08 |只看该作者
补充一下,平台是arm,给我说一下在x86/x86_64下面怎么处理这种情况也行

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
3 [报告]
发表于 2011-11-29 17:40 |只看该作者
本帖最后由 zylthinking 于 2011-11-29 17:42 编辑

貌似没有办法吧, 信号都是在进入内核后在内核栈上保存了原来 eip 后再返回用户空间执行信号处理程序, 然而原来的 eip 仍然再内核栈上呆着呢, 而你是访问不了内核栈的, 如果你访问不了, 那你就没办法改它, 那么最终再次返回用户空间的时候, 照旧是还在那一条引起错误的指令上继续执行。

SIGILL 不知道具体情况, 只是根据原理猜测的。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
4 [报告]
发表于 2011-11-30 09:01 |只看该作者
回复 3# zylthinking

SIGILL信号处理函数是不能返回的

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
5 [报告]
发表于 2011-11-30 13:44 |只看该作者
回复  zylthinking

SIGILL信号处理函数是不能返回的
koolcoy 发表于 2011-11-30 09:01


啥意思, 在sigill 里面必须exit?

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
6 [报告]
发表于 2011-11-30 14:35 |只看该作者
回复 5# zylthinking

规范是这么说的,要么从信号处理函数exit() 要么在里面重启程序

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
7 [报告]
发表于 2011-11-30 14:41 |只看该作者
回复  zylthinking

规范是这么说的,要么从信号处理函数exit() 要么在里面重启程序
koolcoy 发表于 2011-11-30 14:35


它那个重启不会是在里面 execve 吧。。。。。。。 那不是说明就是不可能恢复的么, 你想硬设寄存器根本没机会的, 如果我的分析是正确的, 无论你怎么折腾, 只要不是exit或execve, 而是退出信号处理函数, 应该陷入 SIGILL 无限循环中

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
8 [报告]
发表于 2011-11-30 15:45 |只看该作者
它那个重启不会是在里面 execve 吧。。。。。。。 那不是说明就是不可能恢复的么, 你想硬设寄存器根本 ...
zylthinking 发表于 2011-11-30 14:41


其实回复寄存器状态和内存状态用汇编是能做到的,我现在就是不知到该怎么获得产生信号的时候的寄存器状态

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
9 [报告]
发表于 2011-11-30 15:52 |只看该作者
本帖最后由 zylthinking 于 2011-11-30 15:54 编辑
其实回复寄存器状态和内存状态用汇编是能做到的,我现在就是不知到该怎么获得产生信号的时候的寄存器状 ...
koolcoy 发表于 2011-11-30 15:45


对, 就是这样, 信号生异常时的状态保存到内核, 然后伪造了一个现场让你进入信号处理程序, 等信号处理程序退出后又恢复原始现场, 所以你在信号处理程序内怎么玩都没用, 除非你 jmp直接跳出信号处理程序, 不让它返回内核了, 但这样一来, 内核伪造的现场就保留下来了, 如果你要恢复原始现场, 首先你得知道原始现场, 但很可能你得不到这个信息; 而且, 内核里面可是记着原始现场这回事的, 如果你 jmp 出去后, 再一次进行系统调用, 内核肯定会发现有一个原始现场, 然而进入内核却不是因为信号处理函数返回进入的, 那怎么处理, 可就看内核怎么实现了

论坛徽章:
0
10 [报告]
发表于 2011-11-30 15:57 |只看该作者
指令层面能做吗?除非指令间没依赖关系,否则一条指令没执行,对后面的影响是不能预期的吧

什么应用场景
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP